简述Android热修复、插件化

前提:

热修复在国外是不使用的,因为谷歌商店在中国没法使用,所以应用无法做到像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();
}

猜你喜欢

转载自blog.csdn.net/qq_36333289/article/details/108239954
今日推荐