android實現XAPK安裝

更新了

之前因為換了一家公司,這個項目也就暫停更新了,現在被裁所以有時間做一些更新(??)。雖說是更新,只是完善了demo,修了個之前急著改導致的bug,以及將庫發布到jitpack方便使用,也算是練習一下新技術。

具體可以查看github上的README,也因為沒什么功能更新,RELEASE寫的很簡陋,見諒!

為什么有這篇文章

最近一直在修bug,都是瑣碎的ui或者交互方面的,倒是用戶那邊反應有游戲下載了安裝不了,仔細檢查發現用戶下載的是xapk,并且里面包含兩個apk,之前我們適配的xapk都是一個apk加上要放到Android/obb目錄下的資源,然后經過幾天的調研,實現,終于適配了這種xapk,正好在假期里記錄一下。

XAPK 簡介

xapk并不是一種替代apk的格式,而是將apk和其他文件打包成一個文件,方便下載,具體的說明,可以參考這篇文章:What is xapk.

之前我們已經適配了單apk加上obb資源文件,而現在我所做的,就是適配多apk的xapk。

調研

一開始看到多apk,我就直接試著一個一個安裝,結果主apk安裝了打開閃退,而另一個apk安裝失敗,這下就只好google查怎么安裝,但搜到的主要就是上面給出的鏈接,只有介紹,沒有實際安裝的邏輯。查了許久一無所獲,突然發現xapk里除了兩個apk,還有icon圖片文件和manifest.json文件,感覺到這個json文件,可能包含一些信息,打開發現其中提到了split_apk,然后通過這個進行搜索,果然發現了問題所在。

多個apk的xapk的出現,主要是因為google新推的app bundle機制,通過拆分資源,實現減小apk包大小的目的。而這里我遇到的是老任的馬里奧賽車xapk,包含一個主apk和一個config apk,然后我們就順著這個思路查找對應的安裝方法,具體的話參考:Android PackageInstaller.

按照文檔的說明,這樣的多apk,我們得自己實現安裝,具體的可以參考官方文檔:InstallApkSeesionApi.

開始擼代碼

按照demo,我們就可以實現安裝多apk了,但這還不夠,因為之前已經適配了單apk加上其他資源文件的xapk,所以我們需要兼容兩者.

第一步我們得判斷是單apk還是多apk,這里的話我是使用了第三方的zip庫,地址:zt-zip。然后解壓xapk,判斷其中包含的apk的數量,方便后續進行不同的處理。這里關于如何處理obb資源文件,可以直接在這一步處理。

然后就是對單apk的xapk的處理和多apk的xapk的處理,因為是不同處理方式,我們可以定義一個XapkInstaller接口,然后分別實現不同的子類去處理不同的情況就可以了。這樣的話,上一步的判斷邏輯,我們可以實現一個XapkInstallerFactory進行處理,然后返回不同的XapkInstaller,以利用oo的多態機制。

return if (apkSize > 1) {
        MultiApkXapkInstaller(xapkFilePath, unzipOutputDir)
    } else {
        SingleApkXapkInstaller(xapkFilePath, unzipOutputDir)
    }

(注:實際代碼中,我是定義XapkInstaller的抽象類,主要是為了統一處理異常,如果讀者有什么更好的想法,歡迎指導。)

結語

到這里我們就完成了多apk的xapk的適配,我這邊也將代碼上傳到了github上,地址:XAPKInstaller,主要代碼都是用kotlin實現的,如果喜歡還請star支持一下。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容