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。

转载于:https://juejin.im/post/5d10741351882522a752282d

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. 学习Android闹钟源代码(三)-AlarmClock类分析(part1)
  3. 给Android新手的一些学习建议
  4. Android共享全局数据
  5. pc 通过vnc控制android
  6. web网页和ios、android进行交互
  7. 从零开始--系统深入学习android(实践-让我们开始写代码-Android框
  8. 让Android飞!Google开始测试ART
  9. JavaScript与Android原生相互调用并传参

随机推荐

  1. Android 启动浏览器的方法
  2. Android(安卓)开发工具集合 http://www.a
  3. Android(安卓)4.4以上使用HttpURLConnect
  4. Suggestion: add 'tools:replace="androi
  5. Android把Bitmap保存为PNG图像文件的简单
  6. Gradle 修改生成apk时的文件名
  7. Android启动界面实现
  8. Android 读取Resources和Assets
  9. android 重力传感器的使用
  10. android获取手机序列号