Android外掛化最佳方案--Phantom 實踐指南
PhantomTest
滿幫集團外掛化框架Phantom使用演示
Phantom外掛化演示(請star支援)
演示demo下載
注意:請將外掛apk拷貝至sdcard下。
Phantom介紹
Phantom 是滿幫集團開源的一套穩定、靈活、相容性好的 Android 外掛化方案。
Phantom特點
- 相容性好:零 Hook,沒有呼叫系統的 hidden API,完美相容 Android 9.0
- 功能完整:外掛支援獨立應用的絕大部分特性
- 穩定可靠:歷經貨車幫旗下多款產品 50+ 外掛兩年多千萬級使用者驗證(穩定性和相容性指標都在 4 個 9 以上)
- 部署靈活:宿主無需升級(無需在宿主 AndroidManifest.xml 中預埋元件),即可支援外掛新增元件,甚至新增外掛
- 易於整合:無論外掛端還是宿主端,只需『數行』就能完成接入,改造成本低
Phantom不支援項
- 暫時不支援 Gradle 4.x + Android Gradle Plugin 3.x
- 暫時不支援 Android DataBinding
- 不支援ContentProvider
- 其他不支援項
Phantom 與主流開源外掛框架的對比【官方給的】
特性 | Atlas | VirtualAPK | RePlugin | Phantom | |
---|---|---|---|---|---|
Hook 數量 | 較多 | 較少 | 較少 | 僅一處 | 零 |
四大元件 | 全支援 | 只支援 Activity |
全支援 | 全支援 | 除 ContentProvider 外,全支援 |
剔除公共庫 | 支援 | 支援 | 支援 | 不支援 | 支援 |
相容性適配 | 高 | 高 | 高 | 高 | 非常高 |
外掛熱更新 | 不支援 | 不支援 | 不支援 | 不支援 | 支援 |
外掛快速部署 | 不支援 | 不支援 | 不支援 | 支援 | 支援 |
外掛宿主通訊 | 一般 | 一般 | 弱 | 一般 | 強 |
Phantom整合指南
宿主程式
宿主程式相當於一個空殼容器,用於載入外掛APK,需要注意的是,外掛使用到的許可權,宿主也要同步獲取,否則將無法正常執行。
配置Gradle指令碼
特別需要注意的是,這裡一定要使用
Gradle 3.3 + Android Gradle Plugin 2.3.3
的方式,否則會
1.在宿主專案根目錄下的 build.gradle 中增加宿主 gradle 依賴
buildscript {
dependencies {
classpath 'com.wlqq.phantom:phantom-host-gradle:3.0.0'
}
}
2.在宿主專案的 App 模組的 build.gradle 中增加宿主 library 依賴,並應用宿主 gradle 依賴包含的 gradle 外掛 com.wlqq.phantom.host
。
apply plugin: 'com.wlqq.phantom.host'
dependencies {
compile 'com.wlqq.phantom:phantom-host-lib:3.0.0'
}
外掛初始化
在Application的onCreate初始化 Phantom 外掛框架.詳細配置可點選檢視
public class YourApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//初始化Phantom框架,並載入已經安裝的外掛
PhantomCore.getInstance().init(this, new PhantomCore.Config());
}
}
外掛安裝和解除安裝
詳細說明請見官方文件
1.外掛安裝
- installPlugin: 從SDCard卡上安裝外掛。
PhantomCore.getInstance().installPlugin(Environment.getExternalStorageDirectory() + "/com.xuexiang.xqrcodetest_1.0.apk");
- installPluginFromAssets: 從assets下安裝外掛
PhantomCore.getInstance().installPluginFromAssets("plugins/com.wlqq.phantom.plugin.view_1.0.0.apk")
2.如何判斷外掛是否已安裝
使用PhantomCore.getInstance().isPluginInstalled(“外掛包名”)判斷。
PhantomCore.getInstance().isPluginInstalled("com.xuexiang.xqrcodetest")
3.外掛解除安裝
使用PhantomCore.getInstance().uninstallPlugin(“外掛包名”)來解除安裝外掛。
PhantomCore.getInstance().uninstallPlugin("com.xuexiang.xqrcodetest");
4.外掛啟用
外掛安裝完之後,啟動外掛代表該外掛將被立即載入到記憶體中,呼叫 PluginInfo 介面中 start() 即可.
InstallResult ret = PhantomCore.getInstance().installPlugin(Environment.getExternalStorageDirectory() + "/com.xuexiang.xqrcodetest_1.0.apk");
// 外掛安裝成功後啟動外掛(執行外掛的 Application#onCreate 方法)
if (ret.isSuccess() && ret.plugin.start()) {
Intent intent = new Intent();
// 指定外掛 Activity 所在的外掛包名以及 Activity 類名
intent.setClassName("com.xuexiang.xqrcodetest", "com.xuexiang.xqrcodetest.Main2Activity");
PhantomCore.getInstance().startActivity(this, intent);
}
外掛程式
外掛程式作為一個獨立的apk,可以獨立安裝,也可以被宿主程式安裝載入使用。需要注意的是,外掛使用到的許可權,宿主也要同步獲取,否則將無法正常執行。
配置Gradle指令碼
特別需要注意的是,這裡一定要使用
Gradle 3.3 + Android Gradle Plugin 2.3.3
的方式,否則會
1.在外掛專案根目錄下的 build.gradle 中增加外掛 gradle 依賴
buildscript {
dependencies {
classpath 'com.wlqq.phantom:phantom-plugin-gradle:3.0.0'
}
}
2.在外掛專案 App 模組的 build.gradle 中增加外掛 library 依賴,並應用宿主 gradle 依賴包含的 gradle 外掛 com.wlqq.phantom.plugin
apply plugin: 'com.wlqq.phantom.plugin'
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
// Phantom 混淆配置檔案
proguardFile 'proguard-phantom.pro'
}
}
}
dependencies {
provided 'com.wlqq.phantom:phantom-plugin-lib:3.0.0'
compile 'com.android.support:support-v4:28.0.0'
}
3.配置PhantomPlugin外掛的引數
著重注意hostApplicationId
和hostAppLauncherActivity
這兩個引數,是需要你配成自己的宿主資訊。
phantomPluginConfig {
// BEGIN 剔除公共庫配置
// 若外掛中有使用 support-v4 ,則需要剔除掉(必須)
excludeLib "com.android.support:support-v4:28.0.0"
// END
// BEGIN 生成外掛額外的混淆配置檔案,避免因剔除公共庫引起的混淆問題
libraryJarsProguardFile file('proguard-phantom.pro')
// END
// BEGIN 快速部署外掛配置
// 宿主包名,這裡需要改成你自己的
hostApplicationId = "com.xuexiang.phantomtest"
// 宿主 launcher Activity full class name
hostAppLauncherActivity = "com.xuexiang.phantomtest.MainActivity"
// 外掛包名,這裡需要改成你自己的
pluginApplicationId = android.defaultConfig.applicationId
// 外掛版本名
pluginVersionName = android.defaultConfig.versionName
// END
}
4.在外掛 AndroidManifest.xml 中申明對宿主 Phantom 外掛框架版本依賴(目前版本名是 3.0.0,對應版本號為 30000)
<application>
...
<meta-data
android:name="phantom.service.import.PhantomVersionService"
android:value="30000" />
</application>
編譯
編譯外掛
與編譯獨立 APK 相同,如:
./gradlew assembleDebug
./gradlew assembleRelease
編譯外掛並將外掛 APK 安裝到宿主
外掛端使用的 Gradle 外掛會自動為專案的 variant 生成相應的外掛安裝 task ,格式為 phInstallPlugin${variant}
,例如:
./gradlew phInstallPluginDebug
./gradlew phInstallPluginRelease
注意:以上命令會自動將外掛的apk檔案push到手機的sdcard目錄。
其他說明
聯絡方式
Phantom官方交流 QQ 群號:690051836