1. 程式人生 > >《Android 外掛化框架VirtualAPK :(一)基本整合》

《Android 外掛化框架VirtualAPK :(一)基本整合》

一、VirtualAPK 介紹

VirtualAPK 是我們推出的一款Android平臺上的外掛化方案,通過VirtualAPK,可以讓APP無需重新發版即可上線新功能。

之所以做這件事,是因為傳統的開發流程中,APP進行版本迭代的時候,有著嚴格的時間週期的要求,必須在規定的時間點完成功能開發,也必須在規定的時間點完成渠道投放,這就讓APP的版本迭代有了一定的限制,無法做到APP的隨時更新,於是我們開發了VirtualAPK,通過VirtualAPK,APP發版將不再有時間點的限制,可以隨心所欲地按需更新。

為了實現這一功能,我們首先將一個APP拆成兩個部分,分別為宿主和外掛,其中宿主中沒有或者只有少量無需更新的邏輯,而所有的業務邏輯程式碼則位於外掛中,每次APP更新的時候,我們只需要更新外掛即可。在技術上,通過Android的動態載入機制來載入外掛,並完成了對各個版本Android系統的攔截,使得外掛的開發和傳統的Android開發保持一致,支援外掛的程式碼、資源訪問,並支援四大元件。

二、整合過程

遇到的問題:
1. 可以跳轉,但是跳轉到了宿主的activity?
原因:外掛佈局檔名稱與宿主頁面名稱一致;
2. 可以跳轉,生命週期也執行了,但是白板?
問題:編譯失敗的問題
3. Error:A problem occurred configuring project ':app_plugin'. > The directory of host application doesn't exist!
解決辦法:修改宿主路徑;
4. Error:A problem occurred configuring project ':app_plugin'. > Can't find D:\workspaceghnice\RPluguin\VAHostDemo\app\build\VAHost\Host_R.txt, please check up your host application need apply com.didi.virtualapk.host in build.gradle of host application


解決辦法:在App的工程模組的build.gradle新增使用gradle外掛;
同時clean project;
5. Can't find D:\workspaceghnice\RPluguin\VAHostDemo\app\build\VAHost\versions.txt
在4的基礎上 rebuild project;
6. Error:A problem occurred configuring project ':app_plugin'. > Failed to notify project evaluation listener. > com/android/builder/dependency/ManifestDependency

修改專案gradle 版本為2.1.3 (原來是2.2.3)
7. Error:Execution failed for task ':app_plugin:transformClassesAndResourcesWithStrippedForRelease'. > Cannot cast object 'null' with class 'org.codehaus.groovy.runtime.NullObject' to class 'java.util.Set'
解決辦法:在宿主gradle 加 core 依賴;
8. 提示:宿主可以是debug,外掛必須是release。你在buildTye裡面加個release。
9.PackageParser: Unknown element under <manifest>: meta-data at /storage/emulated/0/va_plugin.apk Binary XML file line #11
android.content.res.Resources$NotFoundException: File res/mipmap-xxhdpi-v4/ic_launcher.png from xml type layout resource ID #0x7f030000

解決辦法:將外掛的清單檔案使用的laucher 放在drawable 目錄;
10. Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
前提:宿主和外掛的佈局檔名稱已經是不一致的。
11. Error:Execution failed for task ':app_plugin:transformClassesAndResourcesWithStrippedForRelease'. > Cannot cast object 'null' with class 'org.codehaus.groovy.runtime.NullObject' to class 'java.util.Set'
解決辦法:將外掛工程與宿主工程單獨開來;

三、參考

介紹文件:

1. infoq http://www.infoq.com/cn/news/2017/06/VirtualAPK-opensource
2. http://geek.csdn.net/news/detail/130917
3. 官網:https://github.com/didi/VirtualAPK