日记。
对于一些发布后可能还会经常修改的函数,而又不想频繁更新app,动态加载dex是个不错的选择。实现步骤如下:
1、在需要的地方,调用如下函数(dexPath为下载下来的路径,函数名暂不明确指定,这样后续会有较大的灵活空间):
private boolean loadDex() {
try {
File dexOutputDir = getDir("dex1", 0);
String dexPath = Environment.getExternalStorageDirectory().toString() + File.separator + "jemen.jar";
DexClassLoader loader = new DexClassLoader(dexPath, dexOutputDir.getAbsolutePath(), null, getClassLoader());
Class clz = loader.loadClass("org.jemen.test.MyDex");
Object ins = clz.newInstance();
Method[] methods = clz.getMethods();
for (Method method : methods) {
try {
if(method.getName().contains("jemen"))
method.invoke(ins, this);
} catch (Exception e) {
ExceptionHandler.handleException(e);
}
}
return true;
} catch (Exception e) {
ExceptionHandler.handleException(e);
}
return false;
}
2、创建一个项目,以org.jemen.test为包名,创建MyDex类,想要热更新的方法名包含“jemen”。Export出jar文件,暂叫output.jar。
3、用AndroidSDK下platform-tools文件夹下的dex工具(本次使用的是23.0.3里边的),将导出的jar文件转为dex的jar文件,命令如下:
dx --dex --output=F:/jemen/output.jar D:/jemen/jemen.jar
可用解压缩工具查看,此时的jar文件已包含dex文件。
4、将jemen.jar文件发布到服务器。App中根据dex文件版本,更新下载jemen.jar文件到1中所述的路径。
因无法改变Android.manifest,无法注册Activity,故无法创建新的Activity,创建的做法就是用代理Activity,修正里边的方法实现,项目暂未用到。