天天看點

android熱更新插件,與Android熱更新方案Amigo的再次接觸

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文法更新

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

我們把系統原先的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);

}

複制代碼