1. 程式人生 > >adb將Apk內建到系統中(system/priv-app)

adb將Apk內建到系統中(system/priv-app)

有時候我們在Android 系統內建自己的應用,在測試時,Android Studio 預設的安裝方式是將我們開發的應用作為普通應用安裝到系統中的。本文提供一種方式,在開發過程中,將apk內建到系統中,而不需要系統原始碼。

adb 將apk內建到系統的方法很多人已經提到過了,但是大多都過時了,或者敘述不詳細。下面的方式在我在 Android 7.1.1 測試通過

內建Apk的特權

Android 內建 apk 有如下特權:
1. 不能被普通使用者解除安裝
2. 具有比普通應用更高的許可權,可以使用受限的系統 API,
3. 結合某些 Manifest.xml 宣告,可以實現更多效果,例如系統級保活
4. 可以宣告 priority > 0 的 元件
(其他特權有待發現..)

準備apk

點選Android Studio 的 Build -> Build Apk(s) ,生成我們測試用的 apk。

如果你的 apk 帶有 .so庫,需要同時準備對應目標系統平臺的 .so。我的測試機是 arm64-v8a,則我需要的 .so庫 在工程的 app/build/intermediates/cmake/debug/obj/arm64-v8a/ 下。

清理舊的安裝

之前測試過程中,你可能已經安裝過apk到系統中,需要先解除安裝,不然有可能影響我們之後內建方式安裝的apk的執行。

解除安裝方式一

通過手機自帶軟體管理解除安裝。這種比較簡單了,不多說。

解除安裝方式二

通過adb解除安裝。
開啟控制檯,輸入下面的命令解除安裝舊的安裝

> adb uninstall <your package name>

例如我的報名是 com.star.test,我的完整解除安裝命令是

> adb uninstall com.star.test

看到控制檯輸出 SUCCESS 即表示解除安裝完成。

簽名(可跳過)

如果我們的應用需要某些系統許可權,可能需要使用系統簽名,參考這篇文章為應用打上系統簽名。

將應用Push到系統目錄下

注: 以下命令執行可能報錯 Read-only file system,解決該問題請參看

獲取Android System 寫入許可權

推送apk到系統目錄

輸入如下名命令

> adb push <your apk path> /system/priv-app

Android 4.4 之後,系統核心apk安裝在 /system/priv-app 中,以前是安裝在 /system/app 中。

推送 .so 到系統庫目錄下

如果apk帶有 .so 庫,.so 庫也需要單獨push到 /system/lib 或者 /system/lib64 中,具體看你的系統有哪個目錄。當然,.so 的ABI需要和系統ABI符合。

安裝應用

在 Android 5.0 以前,推送到系統應用目錄中的apk會被自動安裝,Android 5.0 之後,只在系統啟動時,系統會自動安裝它。

確認有沒有被實際安裝,可以通過如下命令

> adb shell //進入adb shell 模式
# pm list packages | grep <your package name>//在所有已安裝的apk中,查詢指定的apk有沒有安裝

如果安裝成功,則會有一行輸出,顯示自己的應用包名,否則不會有任何輸出提示。

可以通過重啟系統來使剛剛push進入的apk安裝到系統中。如果完全重啟系統的話,花費時間較長,可以通過部分重啟來節省時間。在cmd中執行如下命令。

> abd shell//進入adb shell 模式
# am restart //重啟系統(非完全重啟) 

重啟之後正常情況下應用應該已經安裝了,接下來測試下應用是否能能夠工作。