前提:
热修复在国外是不使用的,因为谷歌商店在中国没法使用,所以应用无法做到像ios一样有一个官方的通用的商店在后台自动升级,所以在中国出现了热修复这种黑科技。
插件化:
插件化原理是将一个apk打包到另一个应用里面,另一个应用通过反射的方式调用打包的apk代码。当然实际的使用过程中并没有这么复杂,很多都是自动化处理。
热修复:
通过网络加载修复包,通过后台提供方法名,实现项目的实时更新。
插件化的应用:
1.让安装包大小比较小:比如有一个应用(像淘宝),有200个功能,这些功能没有必要在发布时候全部发布出来,当用户点击的时候再花个几秒钟加载这个模块。
2.动态部署
3.热更新,bug的热修复
插件化示例:
1.将一个项目的apk文件拷贝到另一个项目里面
前提:热修复在国外是不使用的,因为谷歌商店在中国没法使用,所以应用无法做到像ios一样有一个官方的通用的商店在后台自动升级,所以在中国出现了热修复这种黑科技。
插件化:插件化原理是将一个apk打包到另一个应用里面,另一个应用通过反射的方式调用打包的apk代码。当然实际的使用过程中并没有这么复杂,很多都是自动化处理。
热修复:通过网络加载修复包,通过后台提供方法名,实现项目的实时更新。
插件化的应用:
1.让安装包大小比较小:比如有一个应用(像淘宝),有200个功能,这些功能没有必要在发布时候全部发布出来,当用户点击的时候再花个几秒钟加载这个模块。
2.动态部署
3.热更新,bug的热修复
插件化示例:
1.将一个项目的apk文件拷贝到另一个项目里面
2.运用反射调用apk里面的方法,这个apk相当于一个插件
File apk = new File((getCacheDir() + "/26_pluginnable_plugin-debug.apk"));
if (!apk.exists()) {
try {
InputStream is = getAssets().open("apk/26_pluginnable_plugin-debug.apk");
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
FileOutputStream fos = new FileOutputStream(apk);
fos.write(buffer);
fos.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
try {
DexClassLoader classLoader = new DexClassLoader(apk.getPath(), getCacheDir().getPath(), null, null);
Class pluginUtilsClass = classLoader.loadClass("com.example.a26_pluginnable_plugin.Utils");
//获取第一个构造方法
Constructor utilsConstructor = pluginUtilsClass.getDeclaredConstructors()[0];
Object utils = utilsConstructor.newInstance();
Method shoutMethod = pluginUtilsClass.getDeclaredMethod("shout");
shoutMethod.invoke(utils);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}