由於公司如今要在廣告 SDK 開發中實現一部分代碼的更新,或者是新增部分功能,所以須要從後臺經過網絡下載而後經過插件化的方式進行加載展現。原本想的是本身實現,可是遇到了一些問題,因此直接採用滴滴的開源框架 VirtualAPK 來實現。因爲 VirtualAPK 是針對於 app 開發者的,因此咱們在打包的時候須要把 SDK 稍微作一些改動。android
滴滴開源框架 VirtualAPK 的 GitHub 地址爲 github.com/didi/Virtua…
,經過 Wiki 的內容能夠了解框架集成及使用。若是想了解原理則能夠閱讀源碼進行了解。git
內部有 HostMainActivity、HostMyApp 兩個類github
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);
}
});
複製代碼
public class HostMyApp {
public static void init(Context context){
PluginManager.getInstance(context).init();
}
}
複製代碼
插件中就只有一個 Activity 和一個佈局,供宿主調用。bash
根據 GitHub 上的配置進行項目配置網絡
classpath 'com.didi.virtualapk:gradle:0.9.8.6'
複製代碼
在根目錄的 gradle.properties 文件中添加app
android.useDexArchive=false
複製代碼
apply plugin: 'com.didi.virtualapk.host'
複製代碼
compile 'com.didi.virtualapk:core:0.9.8'
複製代碼
classpath 'com.didi.virtualapk:gradle:0.9.8.6'
複製代碼
apply plugin: 'com.didi.virtualapk.plugin'
複製代碼
virtualApk {
packageId = 0x62 // 爲了不資源衝突.
targetHost='D:/AndroidDemo/RetryVirtualApk/myaarhost' // 宿主項目位置,最好配置絕對路徑,避免出錯.
applyHostMapping = true // 默認爲 true.
}
複製代碼
先在 myaarhost 的 build.gradle 文件中進行修改框架
將
apply plugin: 'com.android.library'
替換爲
apply plugin: 'com.android.application'
複製代碼
而後點擊 Android Studio 右側工具欄對宿主進行 buildide
而後點擊插件項目的 按鈕生成插件 apk工具
若是能夠成功,能夠在插件項目中找到(因爲生成的是 release 包,因此須要配置下簽名)佈局
若是過程當中報錯,可參考 VirtualAPK 踩坑實錄 ,我當時就是借鑑這篇文章的一些解決方法解決的。
classpath 'com.didi.virtualapk:gradle:0.9.8.6'
複製代碼
在新建項目 app 下配置
compile 'com.didi.virtualapk:core:0.9.8'
複製代碼
public class MyApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
HostMyApp.init(base);
}
}
複製代碼
Intent intent = new Intent(MainActivity.this, HostMainActivity.class);
startActivity(intent);
複製代碼
本文全部代碼見 GitHub 地址
github.com/keven0632/V…