背景:开发课题需要对应不同手机,为防止每次更换手机对系统重新开发时间上的浪费。决定把通用的一些功能拿出来,扫描,蓝牙,照相,摄像之类的这些技能,同意开发一个jar动态调用。参考了诸多前辈的网站之后,自己动手写了一下。
相关扫盲:
3.http://blog.csdn.net/qq591840685/article/details/7866115
首先对以上前辈感谢,特别是农民伯伯。
切入正题:
一、动态jar/dex的准备,根据自己业务需求封装。
1.如果是android.library=true这种项目可以直接在bin下面找到jar包(我是这种方式)。否则可以直接expot to jar 导出来。注意一些不必要的android配置文件不要打成Jar。再或者把需要打包的package新建一个java project然后编译expot to jar。
2. 第一步导出来的jar是没有被dx优化的,也就是说里面是.class文件而不是.dex文件。需要进行优化。
很多人找不到dx在什么位置,我也是找了半天才找到。在sdk下面的platform-tools文件夹里面或者tools里面你们找找。我的就没有是从别的sdk里面找到的,不知道为什么。大家要是要的话可以留言跟我要。
用法很简单:dos 进入 tools下面 运行:
dx --dex --output=B.jar A.jar //A.jar 是你第一步倒出来的 B.jar是优化完之后的。
注:优化的目的是android解析.dex文件会比.class更快。上面的命令就是把A.jar里面的.class文件优化成.dex文件然后又打包成B.jar。此处就不多解释了。
3.B.jar准备好了之后,放到手机内部一个路径。注意权限问题。
4.然后就是敲写代码这里了,主要利用的是反射技术。通过上面的文章或许你们都已经了解了我就不多赘述。直接上代码:
String path = "data/ytpacer/dex/B.jar";//路径自己改 final File file = new File(path); DexClassLoader cl = new DexClassLoader(file.getAbsolutePath(), "data/ytpacer/dex", null, getClassLoader()); Class libProviderClazz = null; try { libProviderClazz = cl .loadClass("com.xxx.xxx.类名"); Method[] methods = libProviderClazz.getDeclaredMethods(); for (int i = 0; i < methods.length; i++) { //遍历类里所有方法 Log.v("====", methods[i].toString()); } Method start = libProviderClazz.getDeclaredMethod("start", Context.class);//调用start方法,参数类型是Context start.setAccessible(true);//未加这句之前报了一个错误:access to method denied 加上之后可以了。 start.invoke(libProviderClazz.newInstance(), MainActivity.this);//调用方法传参 } catch (Exception e) { e.printStackTrace(); }
OK 跑一下你的项目就能看到Log打出来的所有方法。
后一步可以继续封装。全部反射调用这样太累了。明天继续,今天早点回家,天不太好!
望大家多多指教,若有更好的实现方法,不采用动态加载jar的话请告知!谢谢。
相关推荐
Android动态加载jar/dex+android开发艺术其他demo,基于android studio,示例代码,需要的可看
android 动态加载插件(dex后的jar)以方便功能扩展.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
首先第一个是 jar 文件的制作,Java 里面直接把 .class 文件打包到 .jar 文件里面就可以了,但是 Android 的 Dalvik VM 是不认 Java ...要动态加载其它类,可以用的 Class Loader 有: DexClassLoader,PathClassLoader
Android方法混乱 Android Studio从位于/build/outputs/aar/.aar下的模块生成aar文件 从aar提取jar文件:使用存档管理器时打开aar,而aar文件包含classes.jar文件。... 现在可以动态加载该dex文件。
Before this library can be used a module needs to be compiled to a separate jar/dex or apk file. Right now, the library supports java libraries and android libraries which don't rely on android ...
jar动态加载测试包,for Android开发系列之动态添加dex。
使用的jar为 bce-android-sdk-1.0.14.jar 用loadDex加载 dex和jar 都在压缩包 runtime.loadDex(files.getSdcardPath() + "/classes.dex"); importClass(com.baidubce.services.bos.BosClientConfiguration); ...
此项目生成的部分需要添加的代码,例如myService中动态加载包含RA逻辑的jar并执行,注册屏幕监听事件。 生成方式 电报编译打包 gradlew makeJar //生成jar dx --dex --output ratdex.jar rat.jar //转换jar java -...
从服务端下载dex文件并保存到app私有目录,将保存的dex文件动态加载执行
----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...
工作原理:首先把需要动态加载的部分导出jar,然后用sdk中的命令把jar编译成dex的jar,在代码中用classloader来加载编译好的jar就可以了,在原始包中如果要调用dex中的方法,需要用反射的方式调用,而dex中的方法则...
动态加载技术 该技术在Java中是一个比较成熟的技术,而Android中该技术还没有被大家充分利用起来。该技术思想主要分为以下几步: 1.将核心代码编译成dex文件的Jar包 2. 对jar包进行加密处理 3.在程序主入口利用NDK...
DexClassloader 这个一个demo,用来实现加载class文件,如果在实际项目中可以...2: DexClassloader: Android 用来加载 jar/apk/dex 文件 3: URLClassloader: 可以加载java的jar包,但是Dalvik 虚拟机不支持这种加载方式
13.3 Android的动态加载技术 / 463 13.4 反编译初步 / 469 13.4.1 使用dex2jar和jd-gui反编译apk / 470 13.4.2 使用apktool对apk进行二次打包 / 470 第14章 JNI和NDK编程 / 473 14.1 JNI的开发流程 / ...
Android动态加载Dex文件,将一个类转为jar包的形式,通过android sdk自带的dx.jar工具转换jar包为包含dex文件的Jar文件,然后用DexClassLoader去加载 详情看我博客 ...
APK / DEX支持-使用Dex2Jar和Jar2Dex,可以轻松加载和保存APK! Java反编译器-它利用FernFlower,Procyon,CFR和JD进行反编译。 字节码反编译器-CFIDE的修改版本。 十六进制查看器-由JHexPane提供支持。 每个反...
/ 441 12.3.2 优化列表的卡顿现象 / 446 第13章 综合技术 / 448 13.1 使用Crash Handler来获取应用的crash信息 / 449 13.2 使用multidex来解决方法数越界 / 455 13.3 Android的动态加载技术 / 463 13.4 反编译...
所谓Odex,是由android软件中的classes.dex生成的,Odex化即是把那个文件预先提取出来作用是能加快软件加载速度和开机速度。不过Odex也有缺点,那就是有时候加刷东西会出现问题。 简单说,原本系统恢复出厂设置后第...