背景
工程項(xiàng)目中礁蔗,有armeabi 、armeabi-v7a兩個(gè)文件夾浴井,而兩個(gè)文件夾中的庫(kù)文件不一樣,編譯運(yùn)行的時(shí)候磺浙,報(bào)錯(cuò)java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader
原因分析
在android APK的根目錄有一個(gè)libs文件夾,此文件夾下包含了armeabi 撕氧、armeabi-v7a兩個(gè)文件夾,有時(shí)候會(huì)有x86的伦泥;一般c代碼編譯成的各種.so庫(kù)就會(huì)放在這兩個(gè)文件夾中。
armeabi和armeabi-7a是表示cpu的類型不脯,一般的手機(jī)或平板都是用arm的cpu,armeabi是針對(duì)普通的或舊的arm cpu防楷,armeabi通用性強(qiáng),但速度慢域帐;armeabi-v7a是針對(duì)有浮點(diǎn)運(yùn)算或高級(jí)擴(kuò)展功能的arm cpu是整,速度快。
android的APP在安裝時(shí)浮入,會(huì)將APP中的so庫(kù)拷貝到一個(gè)指定的目錄(ApplicationInfo.nativeLibraryDir),運(yùn)行時(shí)就在這個(gè)指定的目錄下查找對(duì)應(yīng)的so庫(kù)事秀。查找不到則會(huì)報(bào)錯(cuò)。
在android4.4以下版本的安裝過程中的易迹,是先把所有so庫(kù)全部尋找出來(lái),然后優(yōu)先列出cpu類型(通過ro.product.cpu.abi屬性獲得)目錄下的so庫(kù)睹欲,如果有其他的cpu類型下有跟手機(jī)cpu類型名稱不一致的so庫(kù)一屋,則會(huì)將兼容cpu架構(gòu)(通過ro.product.cpu.abi2屬性獲得)的另外的庫(kù)也列出來(lái)。將列出來(lái)so庫(kù)全部拷貝的系統(tǒng)指定目錄袋哼,以供運(yùn)行時(shí)加載冀墨。 即在android4.4以下版本,一個(gè)so庫(kù)只要在 ro.product.cpu.abi和ro.product.cpu.abi2屬性目錄下至少存在一個(gè)就可以了涛贯。在android4.4以下的arm架構(gòu)的設(shè)備 ro.product.cpu.abi的屬性通常是armeabi-v7a, ro.product.cpu.abi2的屬性值是armeabi诽嘉,并且armeabi-v7a設(shè)備一定兼容armeabi。但不排除某些設(shè)備的ro.product.cpu.abi的屬性為armeabi弟翘。
在android5.0及以上虫腋,由于增加了arm64的支持,app安裝時(shí)的so庫(kù)拷貝代碼也修改了衅胀。修改成只拷貝一個(gè)最合適的目錄下的so庫(kù)到系統(tǒng)指定目錄岔乔。 在arm架構(gòu)下,64位cpu的優(yōu)先級(jí)是arm64-v8a > armeabi-v7a > armeabi滚躯,32位cpu的優(yōu)先級(jí)是armeabi-v7a > armeabi 雏门,優(yōu)先級(jí)可通過ro.product.cpu.abilist屬性查看。由于android5.0是拷貝整體目錄掸掏,所以在每一個(gè)目錄下的,都必須要有完整的so丧凤,即所有app需要so庫(kù)都要有。例如64位的cpu的設(shè)備上浩螺,
如果app目錄里存在arm64-v8a子目錄,則只拷貝該目錄下的so庫(kù),其他目錄的so农渊,即使名稱不一樣,也不拷貝传于,如果arm64-v8a子目錄的so庫(kù)不全沼溜,則會(huì)報(bào)錯(cuò)游添。
解決方法
apk中要么增加armeabi文件夾弹惦,需要注意的是悄但,假如增加armeabi文件夾,armeabi-v7a里面的so庫(kù)一定需要全部拷貝過來(lái)助泽,否則還是會(huì)報(bào)錯(cuò)。
可以刪除了armeabi-v7a文件夾嗡贺,保留armeabi文件夾鞍帝。