ZeusPlugin是一個(gè)簡單易懂的Android插件補(bǔ)丁框架薪伏。下面通過對(duì)它開發(fā)一個(gè)插件zeusplugin_hello.apk
,熟悉插件開發(fā)的流程粗仓。
前置工作
clone項(xiàng)目
git clone https://github.com/iReaderAndroid/ZeusPlugin
替換aapt
用ZeusPlugin項(xiàng)目中的aapt(位于ZeusPlugin\aapt\目錄下嫁怀,該aapt.exe基于6.0源碼編譯,包含windows借浊、mac和linux(64位)版本塘淑。測試替換23.0.2、23.0.3都沒有問題蚂斤,其還集成了資源混淆功能存捺。
),替換sdk下的aapt(請(qǐng)根據(jù)自己的系統(tǒng)曙蒸,選擇對(duì)應(yīng)的版本捌治!)。
sdk路徑可見項(xiàng)目根目錄文件local.properties
內(nèi)容逸爵,sdk.dir=X\:\\your-android-sdk-path\\sdk
具滴。
例如,windows系統(tǒng)师倔,把ZeusPlugin\aapt\aapt(windows版).exe
替換X:\your-android-sdk-path\sdk\build-tools\23.0.2\aapt.exe
后构韵,運(yùn)行成功。
ps:可以先備份一下sdk下的aapt.exe為aapt.exe.bak趋艘。
正式開始
1. 插件配置疲恢,PluginConfig.java
文件增加以下內(nèi)容:
public static final String PLUGIN_HELLO = "zeusplugin_hello"; //插件hello,新增瓷胧!
static {
mDefaultList.put(PLUGIN_TEST, 1);
mDefaultList.put(PLUGIN_HELLO, 1); //插件hello显拳,新增!
mDefaultList.put(HOTFIX_TEST, 1);
}
2. 新建插件項(xiàng)目hello(此處普通app一樣開發(fā)調(diào)試即可)搓萧。
我們簡單的杂数,新建一個(gè)Activity為com.test.android.hello.MainActivity
宛畦,獨(dú)立運(yùn)行成功。
3. hello項(xiàng)目新建assets目錄揍移,在里面新建meta配置文件zeusplugin.meta
次和。
{
"name": "zeusplugin_hello",
"minVersion": "1",
"version": "1",
"mainClass": "com.test.android.hello.MainActivity"
}
4. 打包hello項(xiàng)目apk為zeusplugin_hello.apk
。
android studio普通開發(fā)操作那伐,build --> build APK
踏施。
5. 復(fù)制步驟4的zeusplugin_hello.apk
到宿主項(xiàng)目app的assets目錄下。
6. 宿主項(xiàng)目app中AndroidManifest.xml
增加hello項(xiàng)目相關(guān)的Activity罕邀。
<!--校驗(yàn)用的activity,為了騙過android的activity存在校驗(yàn)-->
<activity android:name="com.zeus.ZeusActivityForStandard"/>
<activity android:name="com.test.android.hello.MainActivity"/>
7. 插件調(diào)用
ImageButton ib_previous = (ImageButton) findViewById(R.id.ib_previous);
ib_previous.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
PluginManager.loadLastVersionPlugin(PluginConfig.PLUGIN_HELLO);//加載插件,一定記得是新增的PluginConfig.PLUGIN_HELLO
try {
Class cl = PluginManager.mNowClassLoader.loadClass(PluginManager.getPlugin(PluginConfig.PLUGIN_HELLO).getPluginMeta().mainClass);
Intent intent = new Intent(PriceActivity.this, cl);//這種方式為通過在宿主AndroidManifest.xml中預(yù)埋activity實(shí)現(xiàn)
//startActivity(intent);
//這種方式為通過欺騙android系統(tǒng)的activity存在性校驗(yàn)的方式實(shí)現(xiàn)
PluginManager.startActivity(PriceActivity.this,intent);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
});
最后畅形,如果你的插件項(xiàng)目用到資源文件,還要修改hello項(xiàng)目的build.gradle
文件诉探,添加如aaptOptions.additionalParameters '--PLUG-resoure-proguard', '--PLUG-resoure-id', '0x7d'
等配置更改資源ID(插件或補(bǔ)丁的資源packageID不能與其他插件或者是宿主相同
)日熬,詳細(xì)看官方文檔。
TODO
- 插件項(xiàng)目是否一定要繼承
ZeusBaseActivity.java
或者調(diào)用相關(guān)函數(shù)阵具? - 宿主碍遍、插件混淆處理?