Android內建系統apk問題

2021-10-02 09:41:37 字數 1613 閱讀 1365

平台:rockchip

android版本: 7.1

個人部落格:

檢視logcat ,下面是關鍵log

03-12 10:48:50.247 1381 1381 e androidruntime: process: com.android.settings, pid: 1381
setting apk找不到32位的庫,所以執行會閃退。那看一下系統內建的setting是多少位的。

//檢視系統apk資訊

adb shell dumpsys package p > dumpsys_p

在 dumpsys_p中找到setting的primarycpuabi=arm64-v8a,可見setting是64位apk。由於setting是64位apk,而且沒有編譯32位庫,所以找不到32位庫閃退就很好解釋了。現在的問題是為什麼64位的setting apk會到32位的目錄下去找所需要的庫?

package [com.android.settings] (f0c9a0e):

userid=1000

shareduser=sharedusersetting

pkg=package

primarycpuabi=arm64-v8a

secondarycpuabi=null

versioncode=25 minsdk=25 targetsdk=25

versionname=7.1.2

splits=[base]

...

android載入so檔案的機制而64位裝置可以提供32和64位兩種虛擬機器,根據apk選擇開啟哪一種,因此說64位裝置相容32的so庫。具體來說就是apk在安裝的時候,apk解包的時候,就已經確定要載入多少位的庫了,如果apk裡面放有兩種庫,實際用的時候,也是只會載入一種庫。

apk架構確定順序pp

name

/lib

和/sy

stem

/app

/ap

pn​a

me/l

ib和/

syst

em/a

pp/

基於android載入so檔案的機制,我們可以採用一下幾種方法來解決該問題

​ 當乙個應用如果想通過shareduserid的方式與另乙個應用執行於同乙個程序當中,這兩個應用的簽名必須保持一致。所以我們內建系統apk的時候需要使用系統簽名。

​ apk系統簽名可以參考:

如果我們內建的api版本過高,那麼在內建編譯的時候會報錯,這是由於odex機制的原因。

apk要預置進原始碼的時候,會對apk進行乙個解析,好形成odex檔案加速apk的執行,但是基於高版本的sdk開發的apk裡面的一些資源是無法被低版本正確的解析
解決方法:

關閉apk odex優化。(導致啟動速度變慢)

在對應apk的android.mk 檔案中新增

local_dex_preopt := false

內建帶so的APK為系統APK方法

1 若內建為可解除安裝的apk,可以無需解壓出lib直接編譯就可以 具體參考 方法一 如下例,在android.mk中新增並配置變數 注意路徑對應 local prebuilt jni libs lib armeabi v7a libcryptox.so lib armeabi v7a libfb....

android系統利用生成的apk除錯

參照 需要注意的是輸入 keytool genkey alias android.keystore keyalg rsa validity 20000 keystore android.keystore 生成的android.keystore就是接下來會用到的keystore,預設生成位置為jdk安...

Android 5 0 內建第三方apk

1.將apk放置在可以編譯到的路徑下,如 vendor 3rdparty baidu baidu.apk 2.將android.mk放置在vendor 3rdparty android.mk android.mk的內容如下所示 include call all subdir makefiles 4....