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

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

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


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

查看所有标签

猜你喜欢:

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

Growth Hack 這樣做

Growth Hack 這樣做

Xdite / PCuSER電腦人文化 / 2016-5-7 / 300.00台幣

◎具體教你在預算有限的情況之下,把成長做出來的可行與必要方法! ◎帶動台灣成長駭客話題的專業講師,親授讓產品突破80分的成長秘笈 @這本書要給誰看? 1. 創業者、個人品牌經營者,想要提高自己服務轉換率的人。 2. 空有產品,但是賣不出去,花了錢投廣告卻效果低落的人。 @這本書有什麼不一樣? 1.全球最重要的趨勢,台灣最知名的 Growth Hack 講師 Xd......一起来看看 《Growth Hack 這樣做》 这本书的介绍吧!

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具