SDK 開發使用 VirtualAPK 實現插件化

1. 背景

由於公司如今要在廣告 SDK 開發中實現一部分代碼的更新,或者是新增部分功能,所以須要從後臺經過網絡下載而後經過插件化的方式進行加載展現。原本想的是本身實現,可是遇到了一些問題,因此直接採用滴滴的開源框架 VirtualAPK 來實現。因爲 VirtualAPK 是針對於 app 開發者的,因此咱們在打包的時候須要把 SDK 稍微作一些改動。android

2. 前期準備

滴滴開源框架 VirtualAPK 的 GitHub 地址爲 github.com/didi/Virtua…
,經過 Wiki 的內容能夠了解框架集成及使用。若是想了解原理則能夠閱讀源碼進行了解。git

3. 項目結構

1. 宿主結構

內部有 HostMainActivity、HostMyApp 兩個類github

  1. HostMainActivity 用於插件加載和跳轉插件中的頁面
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
    String pluginPath = Environment.getExternalStorageDirectory().getAbsolutePath().concat("/testpulgin.apk");
    File plugin = new File(pluginPath);
    try {
            PluginManager.getInstance(getApplicationContext()).loadPlugin(plugin);
        } catch (Exception e) {
            e.printStackTrace();
    }
} else {
    ActivityCompat.requestPermissions(this,
        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);
        }
    TextView tv_host = findViewById(R.id.tv_host);
    tv_host.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent();
            intent.setClassName("keven.zcdog.pluginvirtual", "keven.zcdog.pluginvirtual.PluginMainActivity");
            startActivity(intent);
        }
});
複製代碼
  1. HostMyApp 用於主 APP 進行調用初始化 VirtualAPK
public class HostMyApp  {
    public static void init(Context context){
        PluginManager.getInstance(context).init();
    }
}
複製代碼

2. 插件結構

插件中就只有一個 Activity 和一個佈局,供宿主調用。bash

4. 項目搭建

1. 項目配置

根據 GitHub 上的配置進行項目配置網絡

  1. 在根目錄的 build.gradle 文件中添加
classpath 'com.didi.virtualapk:gradle:0.9.8.6'
複製代碼

在根目錄的 gradle.properties 文件中添加app

android.useDexArchive=false
複製代碼
  1. 在宿主的 build.gradle 文件中添加
apply plugin: 'com.didi.virtualapk.host'
複製代碼
compile 'com.didi.virtualapk:core:0.9.8'
複製代碼
  1. 在插件項目的根目錄 build.gradle 文件中添加(因爲我這邊插件和宿主在同一項目中,因此只須要配置一次便可)
classpath 'com.didi.virtualapk:gradle:0.9.8.6'
複製代碼
  1. 在插件的 build.gradle 文件中添加
apply plugin: 'com.didi.virtualapk.plugin'
複製代碼
virtualApk {
    packageId = 0x62  // 爲了不資源衝突.
    targetHost='D:/AndroidDemo/RetryVirtualApk/myaarhost' // 宿主項目位置,最好配置絕對路徑,避免出錯.
    applyHostMapping = true      // 默認爲 true.
}
複製代碼

2. 生成插件包

先在 myaarhost 的 build.gradle 文件中進行修改框架

將
apply plugin: 'com.android.library'
替換爲
apply plugin: 'com.android.application'
複製代碼

而後點擊 Android Studio 右側工具欄對宿主進行 buildide

而後點擊插件項目的 按鈕生成插件 apk工具

若是能夠成功,能夠在插件項目中找到(因爲生成的是 release 包,因此須要配置下簽名)佈局

若是過程當中報錯,可參考 VirtualAPK 踩坑實錄 ,我當時就是借鑑這篇文章的一些解決方法解決的。

5. 測試

  1. 將 myaarhost 改回 library,而後生成 aar
  2. 將產生的插件 apk 放入到手機根目錄
  3. 新建項目,依賴 aar 包
  4. 在新建項目根目錄配置
classpath 'com.didi.virtualapk:gradle:0.9.8.6'
複製代碼

在新建項目 app 下配置

compile 'com.didi.virtualapk:core:0.9.8'
複製代碼
  1. 新建類繼承 Application ,調用 aar 中的方法初始化 VirtualAPK
public class MyApplication extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        HostMyApp.init(base);
    }
}
複製代碼
  1. 啓動 aar 中的 Activity
Intent intent = new Intent(MainActivity.this, HostMainActivity.class);
startActivity(intent);
複製代碼
  1. 實現效果

6. 所有代碼

本文全部代碼見 GitHub 地址
github.com/keven0632/V…

相關文章
相關標籤/搜索