导航:首页 > 操作系统 > android动态加载驱动

android动态加载驱动

发布时间:2022-05-15 19:11:01

❶ 如何动态加载一个驱动程序

用CreateFile打开驱动,路径是\Device\,例如驱动名是MyDriver,则打开\Device\MyDriver即可。然后利用返回的句柄发送控制码

android 怎么动态加载jar

核心类 1.1 DexClassLoader类 可以加载jar/apk/dex,可以从SD卡中加载为安装的apk。 1.2 PathClassLoader类 只能加载已经安装到Android系统中的apk文件。 一、正文 1.1 类似于eclipse的插件化实现, 首先定义好接口, 用户实现接口功能后即可通过动态加载的方式载入jar文件, 以实现具体功能。 注意 , 这里的jar包需要经过android dx工具的处理 , 否则不能使用。

❸ 如何动态加载android的so文件,如何压缩apk尺寸,androidapk

在Android中调用动态库文件(*.so)都是通过jni的方式,而且往往在apk或jar包中调用so文件时,都要将对应so文件打包进apk或jar包,工程目录下图:

以上方式的存在的问题:
1、缺少灵活性比较类似静态加载了(不是静态加载),能加载的so文件绑定死了;
2、但so文件很多或很大时,会导致对应的apk和jar包很大;
3、不能动态的对so文件更新;

Android中加载so文件的提供的API:
void System.load(String pathName);

说明:
1、pathName:文件名+文件路劲;
2、该方法调用成功后so文件中的导出函数都将插入的系统提供的一个映射表(类型Map);

看到以上对System.load(String pathName);的函数说明可定有人会想到将so文件放到一个指定的目录然后再通过参数pathName直接引用该目录的路劲和对应的so文件问题不就解决了吗?
这里有个问题被忽略了,那就是System.load只能加载两个目录路劲下的so文件:
1、/system/lib ;
2、安装包的路劲,即:/data/data/<packagename>/…
而且这两个路劲又是有权限保护的不能直接访问;

问题解决方法:
先从网络下载so文件到手机目录(如:/test/device/test.so) –> 将test.so加载到内存(ByteArrayOutputStream) –> 然后保存到对用安装包目录;
具体代码如下:

try {
String localPath = Environment.getExternalStorageDirectory() + path;
Log.v(TAG, "LazyBandingLib localPath:" + localPath);

String[] tokens = mPatterns.split(path);
if (null == tokens || tokens.length <= 0
|| tokens[tokens.length - 1] == "") {
Log.v(TAG, "非法的文件路径!");
return -3;
}
// 开辟一个输入流
File inFile = new File(localPath);
// 判断需加载的文件是否存在
if (!inFile.exists()) {
// 下载远程驱动文件
Log.v(TAG, inFile.getAbsolutePath() + " is not fond!");
return 1;
}
FileInputStream fis = new FileInputStream(inFile);

File dir = context.getDir("libs", Context.MODE_PRIVATE);
// 获取驱动文件输出流
File soFile = new File(dir, tokens[tokens.length - 1]);
if (!soFile.exists()) {
Log.v(TAG, "### " + soFile.getAbsolutePath() + " is not exists");
FileOutputStream fos = new FileOutputStream(soFile);
Log.v(TAG, "FileOutputStream:" + fos.toString() + ",tokens:"
+ tokens[tokens.length - 1]);

// 字节数组输出流,写入到内存中(ram)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = fis.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
// 从内存到写入到具体文件
fos.write(baos.toByteArray());
// 关闭文件流
baos.close();
fos.close();
}
fis.close();
Log.v(TAG, "### System.load start");
// 加载外设驱动
System.load(soFile.getAbsolutePath());
Log.v(TAG, "### System.load End");

return 0;

} catch (Exception e) {
Log.v(TAG, "Exception " + e.getMessage());
e.printStackTrace();
return -1;

}

❹ android环境下,怎么查看设备已加载的驱动

右击“计算机/我的电脑”,在出现的列表项中选择“管理”。

在弹出的界面窗体中点击切换到“设备管理器”标签下。

如果该手机已经成功安装驱动,则能找到类似“ ADB Interface ”或“ Android Phone ”类似的设备,一般都显示在第一个设备。如果没有安装过驱动或安装驱动失败,则会出现一些打了问号或是感叹号的设备。如图所示,说明驱动安装正常。

❺ android 怎么动态的加载类

java 里面,我们可以把一些类放到 .jar 文件里面,然后用 ClassLoader 动态加载。例如:
[java] view plain
URLClassLoader ucl = URLClassLoader.newInstance(new URL[]
{new URL("file:/sdcard/files/test.jar")});
Class clazz = ucl.loadClass("com.test.TestClass");
但是在 Android 上面,情况有所不同。
首先第一个是 jar 文件的制作,Java 里面直接把 .class 文件打包到 .jar 文件里面就可以了,但是 Android 的 Dalvik VM 是不认 Java 的 byte code 的,所以不能直接这么打包,而要用 dx 工具转成 Dalvik byte code 才可以。当然,dx 工具转了之后,jar 包里面就不是 .class 文件了,而是 .dex 文件。
第二个是,Android 里面虽然也提供了 URLClassLoader 的实现,但是并不能用。要动态加载其它类,可以用的 Class Loader 有:
DexClassLoader
PathClassLoader
其中,DexClassLoader 可以加载 apk, jar 或者 dex 文件,例如:
[java] view plain
File jarFile = new File("/sdcard/test.dex");
if ( jarFile.exists() ) {
DexClassLoader cl = new DexClassLoader(jarFile.toString(), "/sdcard/test", null, ClassLoader.getSystemClassLoader());
Class<?> c = cl.loadClass("com.qihoo360.test.Test");
...
}
但是 DexClassLoader 要求指定一个可写的目录,即 DexClassLoader 构造函数的第二个参数,在上例中是 /sdcard/test

这个参数的含义是:directory where optimized DEX files should be written

因为 Dalvik 在加载 dex 文件时,会动态进行优化,DexClassLoader 要求指定优化后 dex 文件存放的位置。
PathClassLoader 的限制要更多一些,它只能加载已经安装到 Android 系统中的 apk 文件,也就是 /data/app 目录下的 apk 文件。其它位置的文件加载的时候都会出现 ClassNotFoundException. 例如:
[java] view plain
PathClassLoader cl = new PathClassLoader(jarFile.toString(), "/data/app/", ClassLoader.getSystemClassLoader());
为什么有这个限制呢?我认为这其实是当前 Android 的一个 bug, 因为 PathClassLoader 会去读取 /data/dalvik-cache 目录下的经过 Dalvik 优化过的 dex 文件,这个目录的 dex 文件是在安装 apk 包的时候由 Dalvik 生成的。例如,如果包的名字是 com.qihoo360.test,Android 应用安装之后都保存在 /data/app 目录下,即 /data/app/com.qihoo360.test-1.apk,那么 /data/dalvik-cache 目录下就会生成 data@[email protected]@classes.dex 文件。在调用 PathClassLoader 时,它就会按照这个规则去找 dex 文件,如果你指定的 apk 文件是 /sdcard/test.apk,它按照这个规则就会去读 /data/dalvik-cache/[email protected]@classes.dex 文件,显然这个文件不会存在,所以 PathClassLoader 会报错。
在 Google 修正这个问题之前,我们要么就只能用 DexClassLoader,要么就只能用 PathClassLoader 加载已安装的 apk 了。

❻ 如何在android安卓添加或加载设备驱动

驱动装到手机上,把模块连接的时候根据提示操作就行了!
就像iPhone的App Store一样,Android也有自己的“Market”,目前Market上每天都有新增加的软件和游戏,并且现阶段出现的所有应用软件和程序都是免费的。以下是Market使用教程:
1.打开G1的主菜单,找到并开启Market软件商店。在Macket主菜单中:
AndroidApplications:经过Google认可的Android软件。
AndroidGames:经过Google认可的Android游戏。
AndroidSearch:搜索Market软件商店里的软件。
AndroidMy downloads:查看你从Market下载好的软件。
Android主菜单上面可以滚动的图标是Google官方随机推荐的一些第三方软件。
2. 先点击“Applications”后,会出现所有的第三方软件分类,除了第一个All applications是指查看所有的第三方软件之外,其他均为细分类。随便点击一个分类,则会出现该分类下的所有对应软件,默认情况下By popularity是指按人气由高到低的顺序显示该分类下的软件,By date则是按照时间的先后顺序来显示该分类下的软件。
3. 点击一个软件,你将会看到该软件的详细功能描述、网友评论、作者信息。如果你想安装此软件,可以直接点击“Install”,那么此时屏幕中将会显示该软件可能会涉及到的G1相关功能、个人隐私信息等提示,没有问题的话,你就可以直接点击“OK”,来下载并安装此软件了。
4. 如果你不想安装此软件,可以点击“Cancel”来取消,如果你此时想进行更多操作,请点击屏幕下方的 MENU按钮,在屏幕下方出现的白色窗口里:
AndroidMarket home:回到Market首页
AndroidSearch:开始搜索Market里的软件
AndroidMy downloads:查看已经下载好的软件
AndroidHelp:上网查看Market的相关使用帮助
AndroidSecurity:查看该软件所涉及的安全信息
AndroidFlag content:标记软件内容

Search——软件搜索篇
5. 如果你点击Search,画面顶部将会出现搜索栏,此时你可以随意输入你喜欢的软件名称,然后点击Search即可。

My downloads——已下载软件查看及卸载
6. 如果你点击My downloads,此时将会出现的软件列表即为你从Market上下载并安装的软件。若你想写在写在某个软件,只需要找到并点击这个软件,然后在点击“Uninstall”即可完成卸载工作!

❼ Android怎样动态加载代码技术

在开发Android App的过程当中,可能希望实现插件式软件架构,将一部分代码以另外一个APK的形式单独发布,而在主程序中加载并执行这个APK中的代码。 实现这个任务的一般方法是:// 加载类clsContext pluginContext = mainContext.createPackageContext(PLUGIN_PKG, Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);ClassLoader loader = pluginContext.getClassLoader();Class<?> cls = loader.loadClass(CLASS_NAME);// 通过反射技术,调用cls中的方法,下面是一个示例,实际代码因情况而定Object obj = cls.newInstance();Method method = cls.getDeclaredMethod("someMethod");method.invoke(obj); 但是,这个方法在Android 4.1及之后的系统中存在一些问题:对于收费应用,Google Play会将其安装在一个加密目录之下(具体就是/data/app-asec),而不是一个普通目录之下(具体就是/data/app);安装在加密目录中的应用,我们是无法使用上述方法来加载并执行代码的;而实际情况是,我们经常就是依靠插件应用来收费的。 解决上述问题的一个方案是:将插件的二进制代码拷贝到SD卡中,主程序从SD卡中加载并执行其代码。 实现这个任务的具体方法是:Class<?> cls = null;try { // 尝试第一种方法 cls = loadClass1(mainContext, pkg, entryCls);} catch (Exception e) { // 尝试第二种方法 cls = loadClass2(mainContext, pkg, entryCls);}// 示例代码Object obj = cls.newInstance();Method method = cls.getDeclaredMethod("someMethod");method.invoke(obj);// 第一种加载方法private Class<?> loadClass1(Context mainContext, String pkg, String entryCls) throws Exception { Context pluginContext = mainContext.createPackageContext(pkg, Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY); ClassLoader loader = pluginContext.getClassLoader(); return loader.loadClass(entryCls); }//

❽ android 是什么时候加载蓝牙firmware

Android系统通常会添加一些外设,而外设也分为很多厂商,为了自适应不同厂商Android需要动态加载这些外设的驱动,那么在hardware模块做好兼容工作。
通常HAL层动的较多的就是蓝牙和wifi模块,HAL层在蓝牙,wifi的系统服务的控制下操作驱动模块,例如wpa_supplicant, wpa_cli, bluedroid, 等服务,存在于
external/bluetooth/bluedroid, external/wpa_supplicant_8,packages/apps/Bluetooth,frameworks/opt/net/wifi等目录下。

确定芯片ID
wifi芯片模块连接后,通过USB总线可以查到对应芯片的ID。一般在插上usb Dangle设备后,在/dev/bus/usb/ 目录下会有001, 002 ,003 子目录,HAL层可以
读取到vendor ID , proct ID ,得到这些ID 之后就可以匹配对应的厂商驱动,例如wifi可以查看配置文件wifi.cfg
(1)lsusb 可以查看芯片ID

❾ android的动态加载和静态加载的区别

两者区别: 一,静态库的使用需要: 1 包含一个对应的头文件告知编译器lib文件里面的具体内容 2 设置lib文件允许编译器去查找已经编译好的二进制代码 二,动态库的使用: 程序运行时需要加载动态库,对动态库有依赖性,需要手动加入动态库 三,依赖性: 静态链接表示静态性,在编译链接之后, lib库中需要的资源已经在可执行程序中了, 也就是静态存在,没有依赖性了 动态,就是实时性,在运行的时候载入需要的资源,那么必须在运行的时候提供 需要的 动态库,有依赖性, 运行时候没有找到库就不能运行了 四,区别: 简单讲,静态库就是直接将需要的代码连接进可执行程序;动态库就是在需要调用其中的函数时,根据函数映射表找到该函数然后调入堆栈执行。 做成静态库可执行文件本身比较大,但不必附带动态库 做成动态库可执行文件本身比较小,但需要附带动态库 五: 首先纠正所谓“静态连接就是把需要的库函数放进你的exe之中”的说法。在真实世界中,有三个概念:Use static libary, static linked DLL, dynamic linked DLL. 多数人混淆了static libary 和 static linked DLL的概念,当然他们有似是而非的“相似之处”,比如都用到.lib,下面具体说明。 使用静态库(Use static libary)是把.lib和其他.obj一起build在目标文件中,目标文件可以是.exe,也可以是.dll或.oxc等。一般情况下,可以根本就没有“对应的”.dll 文件,如C Run Time(CRT)库。一个例子就是,写一个main(){},build出来并不是只有几个字节,当然有人会说那还有exe文件头呢?是,即使加上文件头的尺寸,build出的执行文件仍然“莫名的大”。实际上那多出来的部分就是CRT静态库。姑且可以把静态库.lib理解成外部程序的obj文件比较合理,它包含了函数的实现。

❿ android 下如何动态加载触摸屏驱动

TP驱动实现
1 修改ProjectConfig.mk
修改mediatek\config\prj\ProjectConfig.mk下的CUSTOM_KERNEL_TOUCHPANEL
其值由GT818B改为msg2133

2 增加ms2133驱动文件夹
根据TP厂家提供的驱动,我们在\mediatek\custom\common\kernel\touchpanel增加msg2133触摸屏驱动文件夹msg2133,并做下面一些简单修改正常使用。

(1) Msg2133接口的初始化
1) CHIP_EN片选使能引脚
mt_set_gpio_mode(GPIO_CTP_MSG2133_EN_PIN,GPIO_CTP_MSG2133_EN_PIN_M_GPIO);
mt_set_gpio_dir(GPIO_CTP_MSG2133_EN_PIN,GPIO_DIR_OUT);
mt_set_gpio_out(GPIO_CTP_MSG2133_EN_PIN,GPIO_OUT_ONE);</span>
msg2133芯片使能引脚配置为GPIO模式、输出高电平使能。

2) INT中断引脚
mt_set_gpio_mode(GPIO_CTP_MSG2133_EINT_PIN,GPIO_CTP_MSG2133_EINT_PIN_M_EINT);
mt_set_gpio_dir(GPIO_CTP_MSG2133_EINT_PIN,GPIO_DIR_IN);
mt_set_gpio_pull_enable(GPIO_CTP_MSG2133_EINT_PIN,GPIO_PULL_ENABLE);
mt_set_gpio_pull_select(GPIO_CTP_MSG2133_EINT_PIN,GPIO_PULL_UP);</span>

配置为中断模式、输入、使能上下拉功能和设置为上拉。

(2) IIC地址
Msg2133的iic读写地址,我从数据手册上没有找到是如何确定这两个地址的,驱动厂家在驱动代码中提供,如果想要具体是怎么确定的,可咨询厂家。
#defineFW_ADDR_MSG21XX (0xC4>>1)
#defineFW_ADDR_MSG21XX_TP (0x4C>>1)//write,0x26
#defineFW_UPDATE_ADDR_MSG21XX (0x92>>1)//read,0x49</span>
(3) 增加TP的虚拟按键(virtual key)

要在TP上增加虚拟按键,需要在tp对应的头文件添加下面的设置:

1) 定义TPD_HAVE_BUTTON
2) 定义TPD_BUTTON_HEIGHT、TPD_KEY_COUNT、TPD_KEYS和TPD_KEYS_DIM,分别用于定义button被识别的纵向坐标、虚拟按键个数、对应的功能键和每个功能键的坐标
#defineTPD_HAVE_BUTTON

#defineTPD_BUTTON_HEIGHT 800
#defineTPD_KEY_COUNT 4
#defineTPD_KEYS { KEY_BACK, KEY_SEARCH,KEY_MENU, KEY_HOMEPAGE }
#define TPD_KEYS_DIM {{200,900,10,10},{260,900,10,10},{40,900,10,10},{120,900,10,10}}</span>

其中,{200,900,10,10}对应了KEY_BACK的坐标, (200,900)是该key center的坐标,10是该键的宽度,10是该键的高度。

3) 根据显示屏分辨率修改相关的宏定义
#defineTPD_RES_X 480 // (320)
#defineTPD_RES_Y 800 //(480)</span>

把常用的实体按键(导航按键)映射到触屏区域的快捷方式,不强制要求一定要有物理按键来支持用户操作,这对开发全触摸屏的产品非常有利。

阅读全文

与android动态加载驱动相关的资料

热点内容
政府文件加密没法转换 浏览:370
android判断栈顶 浏览:329
凭证软件源码 浏览:859
androidwebview滚动事件 浏览:9
如何将电脑上的图片压缩成文件包 浏览:899
程序员转金融IT 浏览:834
黑马程序员培训效果如何 浏览:911
本地集成编译 浏览:528
韩国电影哪个app可以看 浏览:703
玖月授权什么app什么梗 浏览:785
怎么使用服务器上的ip地址是什么情况 浏览:750
手机密码加密后怎么解密 浏览:343
华为云的服务器的ip地址怎么访问不 浏览:367
webstormvue在线实时编译生效 浏览:184
3225pdf 浏览:171
java中的常用类 浏览:395
安卓手机oppo反向色调怎么开 浏览:138
罗志祥pdf 浏览:224
美国战争pdf 浏览:243
任务栏右击如何显示常用文件夹 浏览:100