1. 程式人生 > >Android外掛化最佳方案--Phantom 實踐指南

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
Small
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外掛的引數

著重注意hostApplicationIdhostAppLauncherActivity這兩個引數,是需要你配成自己的宿主資訊。

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

在這裡插入圖片描述