作者君主要做SDK開發(fā)殴玛,對接一些廠商或運行商的普通應(yīng)用或系統(tǒng)應(yīng)用捅膘。
當(dāng)對接系統(tǒng)應(yīng)用時,由于系統(tǒng)應(yīng)用是由于覆蓋機型比較廣滚粟,會碰到Android多個版本機型寻仗,有的可能出現(xiàn)so找不到的問題。
普通應(yīng)用
普通install安裝apk的方式凡壤,apk會被安裝在 /data/app 目錄下署尤,那么So則會被映射到/data/app/項目目錄下/lib。
系統(tǒng)應(yīng)用
1.apk采用預(yù)裝的方式:
首次安裝只能通過直接push到/system/app/下的方式來安裝亚侠,而不是如普通應(yīng)用般采取install的方式曹体。
2.系統(tǒng)應(yīng)用升級:
android在開機掃描應(yīng)用的時候會對 相應(yīng)目錄進行掃描,如果發(fā)現(xiàn) data/app目錄下 存在和系統(tǒng)應(yīng)用同包名的應(yīng)用盖奈,并且版本號比系統(tǒng)應(yīng)用的版本號更高則構(gòu)成升級關(guān)系混坞,校驗簽名等安全驗證通過。此時data/app下的這個應(yīng)用就是系統(tǒng)應(yīng)用
3.so加載
而push到系統(tǒng)目錄下如system/app/....钢坦,則會優(yōu)先尋找system/lib(lib64)目錄下的so究孕,由于so
不會自動釋放到該目錄下,所以需要手動push到該路徑下爹凹。
4.Android版本適配的問題:
- 4.4(含)及以下系統(tǒng):push到Android系統(tǒng)的/system/lib目錄
- 5.0(含)及以上系統(tǒng):push到Android 系統(tǒng)的 /system/app/應(yīng)用部署文件夾/lib/系統(tǒng)架構(gòu)/目錄中進行集成厨诸;不推薦這兩個so文件拷貝到/system/lib或者/system/lib64目錄中,已知在Android N上禾酱。
PackageManager掃描so版本出錯
1.背景
作者君還遇到過這樣的問題微酬,有時候為了減少包的大小或者其他,不會把所有ABI類型的so都放進目錄颤陶,另外so的提供者團隊沒有提供64的so(哈哈颗管,如果提供了,下面的問題直接就沒有了滓走,那為什么還拿出來說呢垦江,主要是簡單地了解一下系統(tǒng)底層的一些基本原理,感興趣的可以看下一下~~)
2.問題:
機型類型是64位的搅方,其他apk僅提供了64位的so比吭。而某個apk由于只集成了32位so, install安裝是正常的姨涡,但是把apk通過push到/system/app下辱魁,so放到/system/lib下則報如下錯誤:
abcdefg-xxx.so is 32-bit instead of 64-bit
32位機器上當(dāng)然是正常的吱肌。
一般情況下吼鳞,64位的操作系統(tǒng)可以兼容32位的庫文件氢橙,所以僅含有32位的
apk正常情況下也可以在64的機器上跑起來。
3.原因:
那么為什么會出錯呢?首先是系統(tǒng)級應(yīng)用瓢剿,需要理解Android系統(tǒng)的原理(當(dāng)然啦岁诉,也許廠商定制了一番,那則另一回事跋选。):
系統(tǒng)有幾個屬性,其中app.info.primaryCpuAbi這個值用來決定apk關(guān)聯(lián)ABI類型哗蜈。而PackageManager會對這個值有所影響前标。比如:通過apk包里包含的so庫的架構(gòu)來決定app的primaryCpuAbi的值。
1.系統(tǒng)apk或者普通的apk, 如果統(tǒng)的 /system/app/應(yīng)用部署文件夾/lib/系統(tǒng)架構(gòu)/目錄下so文件存在距潘,則以此so文件來確定primaryCpuAbi的值
2.如果是系統(tǒng)apk, 包里又不存在.so文件炼列,就會進一步根據(jù)/system/app/項目包名/lib和/system/app/項目包名/lib64是否存在,來確定它的primaryCpuAbi值
另外:
如果機器里有64位的apk音比,且PackageManager掃描到第一正好是這個apk俭尖,PackageManager調(diào)整所有apk要加載的都是64位的so。不再去加載32位的so洞翩,那么只含32位so的apk就會跑出異常稽犁。反之,則64位的apk正常運行骚亿,32位的則出錯已亥。
尾語
作者君能力有限,如有錯處来屠,請書友們指導(dǎo)虑椎,作者君會第一時間修改。
一起學(xué)習(xí)一起進步?( ′???` )比心