因?yàn)樾枨笠霾寮詫?xiě)篇文章寫(xiě)個(gè)小demo來(lái)記錄一下严就,這篇文章只是寫(xiě)個(gè)demo总寻,而不做總結(jié)和講解。
一.前言
1.什么是插件化梢为,網(wǎng)上很大大佬有很好的解釋渐行,這里我不重復(fù),簡(jiǎn)單來(lái)說(shuō)就是要一個(gè)apk加載另一個(gè)apk的內(nèi)容铸董。
主apk我們成為宿主祟印,被加載內(nèi)容的apk我們稱為插件
2.為什么使用VirtualAPK
關(guān)于插件化有很多方案和框架可以使用,至于我為什么選擇VirtualAPK粟害,主要有兩點(diǎn)原因:
(1)這個(gè)框架目前還在維護(hù)
(2)接入方便旁理,文檔清晰
3.框架地址
https://github.com/didi/VirtualAPK
二.寫(xiě)Demo接入VirtualAPK
要接入VirtualAPK,我們要跟著文檔走我磁,打開(kāi)連接地址孽文,然后點(diǎn)開(kāi)wiki,上面會(huì)有接入的流程夺艰。
注意:不管用什么框架芋哭,最好的文檔都是官方的文檔,就算在接入過(guò)程有問(wèn)題也應(yīng)該先去找Issues有沒(méi)有相應(yīng)的貼郁副,實(shí)在沒(méi)有才用搜索引擎去搜索問(wèn)題减牺。
讀過(guò)這個(gè)框架之后我們知道要做兩個(gè)項(xiàng)目,一個(gè)是宿主項(xiàng)目存谎,一個(gè)是插件項(xiàng)目拔疚。那我用AS開(kāi)發(fā)的話可以寫(xiě)一個(gè)工程然后兩個(gè)module,這邊比較方便管理
我這里宿主就是:app模塊既荚,插件就是:plugintest模塊
在 README.md中有寫(xiě)導(dǎo)入過(guò)程
跟著做稚失,我們?cè)?app模塊中配置
(1)最外層gradle加入virtualapk
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
classpath 'com.didi.virtualapk:gradle:0.9.8.6'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
(2)在app模塊的gradle中加入插件和依賴
到這里宿主apk就已經(jīng)配好了,簡(jiǎn)直方便啊恰聘。然后再來(lái)配置插件的gradle
(3)在plugintest模塊的gradle中加入插件和依賴
這樣就配置好了句各,這插件簡(jiǎn)直是方便,比起我當(dāng)時(shí)用微信的Timer晴叨,配置方便太多凿宾。
可能有些朋友不是很熟gradle,我多啰嗦兩句
virtualApk{}是插件com.didi.virtualapk.plugin的配置兼蕊,就像我們默認(rèn)生成的android{}是com.android.application插件的配置初厚。
(1)packgeId是有一個(gè)范圍的,好像是2到多少的我忘了
(2)targetHost是宿主工程的路徑孙技,因?yàn)椴寮@取宿主工程的內(nèi)容产禾,所以要給個(gè)路徑給插件排作,反正就指導(dǎo)宿主的app文件夾下。
2.初始化插件
配置完成之后下愈,我們需要在宿主工程纽绍,也就是我的:app模塊做插件的初始化
跟著文檔做就行蕾久,先在application初始化
然后加載插件势似,要在哪里加載插件,這就要看你需要在哪里使用插件的內(nèi)容僧著,加載插件就是加載你存儲(chǔ)中的apk
這里我插件apk要放在../Android/包名/test 文件夾下履因, apk要改名成pluginTest.apk
3.導(dǎo)出插件apk
配置好并初始化好之后我們就可以先導(dǎo)出插件apk,再把插件apk放到上面的文件夾中盹愚,再運(yùn)行宿主app就行栅迄。
這里需要注意一點(diǎn),這是我踩的坑皆怕,你不能給你的布局使用activity_main.xml這個(gè)名稱毅舆,不然導(dǎo)出插件會(huì)不正確,我是在Issues看到的愈腾,所以說(shuō)出現(xiàn)問(wèn)題先去找Issues
那么要怎么導(dǎo)出插件apk呢憋活,前提是你先要build一下宿主apk,然后再用命令行來(lái)打包插件apk虱黄,每次悦即,和打jar包一樣,用命令打就行橱乱。
打開(kāi)項(xiàng)目的wiki
因?yàn)槲沂莣indows操作系統(tǒng)哈辜梳,所以輸入命令 gradlew clean assembleRelease --stacktrace
如果有配置上的錯(cuò)誤的話,會(huì)打印出來(lái)泳叠,但是肯定不會(huì)打印很詳細(xì)作瞄,所以有問(wèn)題的話還是要靠一點(diǎn)經(jīng)驗(yàn)。
能正常打包的話
會(huì)在build內(nèi)生成一個(gè)文件夾plugin危纫,說(shuō)道這里就又要再多啰嗦一句粉洼,這個(gè)命令打出來(lái)的包是正式包,所以在配置gradle時(shí)記得寫(xiě)簽名
最后把這個(gè)apk改名放到這個(gè)文件夾里就可以了
這樣我們就完成了一個(gè)簡(jiǎn)單的VirtualAPK框架的demo叶摄,不得不說(shuō)這個(gè)框架使用起來(lái)非常方便属韧,當(dāng)然別看現(xiàn)在做的這么順利,其實(shí)到實(shí)際開(kāi)發(fā)的時(shí)候肯定會(huì)遇到坑的蛤吓。所以有一個(gè)良好的閱讀文檔的習(xí)慣是非常重要的宵喂。
三.最后貼我宿主項(xiàng)目的代碼吧
也就做了一個(gè)跳轉(zhuǎn)的操作,跳轉(zhuǎn)的activity是插件的activity
public class OneActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_one);
initPlugin();
initView();
}
/**
* 加載插件
*/
private void initPlugin(){
PluginManager pluginManager = PluginManager.getInstance(this);
File file = new File(getExternalFilesDir("test"),"pluginTest.apk");
if (file.exists()){
try {
pluginManager.loadPlugin(file);
}catch (Exception e){
}
}
}
private void initView(){
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClassName("com.example.plugin.plugintest","com.example.plugin.plugintest.TwoActivity");
startActivity(intent);
}
});
}
}