与Android热更新方案Amigo的再次接触

栏目: Android · 发布时间: 7年前

Amigo 作为一个“过气”的的热修复框架,用来学习和了解一下热修复的基本原理还是很好的。本文是本系列的第三篇。 前两篇:

与Android热更新方案Amigo的初次接触

与Android热更新方案Amigo的亲密接触

原作者已经很久没有更新的,我之前适配了Android8.0 和gradle3.0,最近适配的Android P。 我使用的是最新的环境Android Studio 3.4.1。gradle 插件版本5.1.1 gradle版本 3.4.1 ,kotlin版本1.3.31。

目前在华为和一加的真机上测试,运行顺利。

1.gradle插件方面的适配

主要是gradle语法升级

gradle插件代码 AmigoPlugin.groovy

File manifestFile = output.processManifest.manifestOutputDirectory
复制代码

↓↓↓↓

File manifestFile = output.processManifest.manifestOutputDirectory.get().asFile
复制代码

and

String manifestPath = "${output.processManifest.manifestOutputDirectory.path}/AndroidManifest.xml"
复制代码

↓↓↓↓

String manifestPath = output.processManifest.manifestOutputDirectory.get().asFile.path+"/AndroidManifest.xml"
复制代码

这里代码主要是修改 AndroidManifest.xml ,把原来的Application修改成 me.ele.amigo.Amigo ,然后把原来的Application修改成一个Activity。

2.Amigo代码适配 AmigoInstrumentation.java

AmigoInstrumentation.java

我们把系统原先的Instrumentation替换成我们自己的Instrumentation的时候,在Android P以下的系统是可以运行的,但是在Android P上就会抛出Uninitialized ActivityThread, likely app-created Instrumentation的异常,显然这是因为我们自己的Instrumentation的mThread为空导致的。

@Override
    public Activity newActivity(ClassLoader cl, String className,
                                Intent intent)
            throws InstantiationException, IllegalAccessException,
            ClassNotFoundException {

        return oldInstrumentation.newActivity(cl, className, intent);
    }
复制代码

3.AssetPath的适配

在Android P上AssetManager中已经没有了 ensureStringBlocks 方法了,根据网上的资料,这个方法只是需要在Android Kiakat上调用。

static void loadPatchResources(Context context, String checksum) throws Exception {
        AssetManager newAssetManager = AssetManager.class.newInstance();
        invokeMethod(newAssetManager, "addAssetPath", PatchApks.getInstance(context).patchPath(checksum));
        invokeMethod(newAssetManager, "ensureStringBlocks");
        replaceAssetManager(context, newAssetManager);
    }
复制代码

↓↓↓↓

static void loadPatchResources(Context context, String checksum) throws Exception {
        AssetManager newAssetManager = AssetManager.class.newInstance();
        invokeMethod(newAssetManager, "addAssetPath", PatchApks.getInstance(context).patchPath(checksum));
        if (Build.VERSION.SDK_INT <= 26) {
            invokeMethod(newAssetManager, "ensureStringBlocks");
        }
        replaceAssetManager(context, newAssetManager);
    }
复制代码

最后 github 。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

程序员成长的烦恼

程序员成长的烦恼

吴亮、周金桥、李春雷、周礼 / 华中科技大学出版社 / 2011-4 / 28.00元

还在犹豫该不该转行学编程?还在编程的道路上摸爬滚打?在追寻梦想的道路上你并不孤单,《程序员成长的烦恼》中的四位“草根”程序员也曾有过类似的困惑。看看油田焊接技术员出身的周金桥是如何成功转行当上程序员的,做过钳工、当过外贸跟单员的李春雷是如何自学编程的,打小在486计算机上学习编程的吴亮是如何一路坚持下来的,工作中屡屡受挫、频繁跳槽的周礼是如何找到出路的。 《程序员成长的烦恼》记录了他们一步一......一起来看看 《程序员成长的烦恼》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试