package manager service是怎樣選擇armeabi/armeabi-v7a中的庫檔案的?
Android應用中使用到C程式碼,編譯成so檔案打包進apk的libs路徑下。因為要支援ARMv5和ARMv7,libs下有armeabi和armeabi-v7a兩個目錄。安全的做法是編譯庫C程式碼時,Application.mk中開啟,
APP_ABI := armeabi armeabi-v7a
編譯生成的兩份so檔案各自放到專案工程的armeabi/armeabi-v7a目錄中。有時還需要針對v7a平臺編譯支援NEON和不支援NEON的庫。譬如這個例子,
in armeabi/: libp.so, libd.so, libvh.so, libvn.so
in armeabi-v7a/: libp.so, libd.so, libd_neon.so, libvh.so, libvn.so
需要注意這一點:The 'armeabi-v7a' machine code will not run on ARMv5 or ARMv6 based devices. 如果損失一些應用的效能是可以接受的,不希望保留庫的兩份拷貝,可以移除armeabi-v7a目錄和其下的庫檔案,只保留armeabi目錄。在安裝應用時,行為是這樣的,
When installing an application, the package manager service will scan the .apk and look for any shared library of the form:
lib/<primary-abi>/lib<name>.so
If one is found, then it is copied under $APPDIR/lib/lib.so, where $APPDIR corresponds to the application's specific data directory.
If none is found, and a secondary ABI is defined, the service will then scan for shared libraries of the form:lib/<secondary-abi>/lib<name>.so
If anything is found, then it is copied under $APPDIR/lib/lib.so.
什麼是primary abi和secondary abi呢,
The Android system knows at runtime which ABI(s) it supports. More precisely, up to two build-specific system properties are used to indicate:
the 'primary' ABI for the device, corresponding to the machine code used in the system image itself.
an optional 'secondary' ABI, corresponding to another ABI that is also supported by the system image.
For example, a typical ARMv5TE-based device would only define the primary ABI as 'armeabi' and not define a secondary one.
On the other hand, a typical ARMv7-based device would define the primary ABI to 'armeabi-v7a' and the secondary one to 'armeabi' since it can run application native binaries generated for both of them.
This mechanism ensures that the best machine code for the target device is automatically extracted from the package at installation time.
考慮這樣一個情況,在打包apk時,armeabi-v7a目錄下放了所需的部分so檔案。還是上面那個例子,
in armeabi/: libp.so, libd.so, libvh.so, libvn.so
in armeabi-v7a/: libd.so, libd_neon.so
如此,安裝執行在v7a的裝置上,會發生什麼? 嘗試了一些手機和平板,CPU都是ARMv7的,Android都是4.x的。行為是拷貝以下庫檔案到$APPDIR/lib/目錄下,
armeabi-v7a/libd.so, armeabi-v7a/libd_neon.so, armeabi/libp.so, armeabi/libvh.so, armeabi/libvn.so
符合特殊需求,libd對效能影響較大,針對ARMv7裝置,使用armeabi-v7a的庫,其他都使用armeabi的庫。
但是遇到在一臺ARMv7+Android2.3.4的手機上,載入libp.so報錯。
再嘗試另一臺ARMv7+Android2.3.5的手機,一樣的現象。
針對這兩臺手機,如果打包apk時移除armeabi-v7a目錄,不會報錯。
難道Android2.3的裝置,package manager service的行為有異?
相關文章
- 怎樣選擇TCP還是選擇UDPTCPUDP
- 小島秀夫是怎樣為遊戲選擇配樂的?遊戲
- 怎樣選擇PHP的版本PHP
- 怎樣提高Windows Azure Cloud Service中的WebRole的檔案訪問許可權WindowsCloudWeb訪問許可權
- 使用 Swift Package Manager 整合依賴庫SwiftPackage
- 安卓APK安裝包arm64-v8a、armeabi-v7a、x86、x86_64有何區別?如何選擇?安卓APK
- CSS樣式中的後代選擇器和子代選擇器CSS
- CSS樣式中的通用選擇器和偽類選擇器CSS
- 為何大廠APP如微信、支付寶、淘寶、手Q等只適配了armeabi-v7a/armeabi?APP
- 如何做到input file中‘選擇檔案’的自定義
- zblog的資料庫配置檔案是哪個?怎樣修改資料庫配置資訊?資料庫
- 為何Twitter區別於微信、淘寶,只使用了armeabi-v7a?
- 選擇HHDESK的理由二【檔案共享】
- Flask中怎樣返回html檔案?FlaskHTML
- Rust Package Manager:CargoRustPackageCargo
- 3442.01重建資料庫的步驟是怎樣的?, 11隱藏功能, 12其他功能, 1檔案,1選單欄資料庫
- 內部錯誤 選擇的檔案是不能修改的系統檔案。它將被隱藏。
- 深入安卓Package Manager和Package Installer安卓Package
- 學Python應該選擇怎樣的機構?Python
- 怎樣選擇合適的協作辦公工具
- uniapp 檔案選擇APP
- 高效利用/資源,選擇在AIX的檔案系統中安裝oracle資料庫。AIOracle資料庫
- 專案中怎樣做技術選型
- 怎樣使用 awk 刪掉檔案中重複的行
- 網路中IP是怎樣選路的?選路原理及簡單的路由表路由
- 怎樣選擇適合自己php框架PHP框架
- 電商小白該選擇怎樣的快遞查詢工具?
- 資料庫的基本分類是怎樣的?資料庫
- 為什麼像新東方、中石油這樣大企業的檔案管理都選擇「夠快雲庫」?
- 我們在開源專案中是怎樣埋彩蛋的
- 選擇HHDESK的理由三【檔案對比功能】
- 怎樣理解和識別 Linux 中的檔案型別Linux型別
- 處理專案檢視中的選擇
- python 在命令列中選擇檔案路徑的互動程式Python命令列
- Red Hat Package Manager(簡稱RPM) 的使用Package
- Swift Package Manager使用總結SwiftPackage
- 怎樣選擇優質的蘋果企業簽名服務蘋果
- 怎樣選擇優質的線上教育系統原始碼原始碼