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

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

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

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

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

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

1.gradle插件方面的适配

主要是gradle语法升级框架

gradle插件代码AmigoPlugin.groovyide

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

↓↓↓↓post

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

相关文章
相关标签/搜索