今天來點簡單的我相信很多定制系統的同學都會有一些特定功能的需求,比如
- 修改系統時間
- 靜默安裝
- 執行某shell指令
這些對于正常的應用來說,是需要很多技巧性的東西來做的,因為他們沒有權限,而我們做定制系統的
話,可以給我們的應用來系統簽名,這樣就擁有系統的權限了,那我們應該怎麼做呢?
我們以執行某shell指令為課題來解釋:
首先,我們要知道,一般的指令都是在system/bin下,我們可以看圖
使用shell指令,比如ls之類的,我們可以直接執行
try {Runtime runtime = Runtime.getRuntime();runtime.exec("ls");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}
你會發現可以執行的,而且可以拿到傳回值,通過傳回一個Process,然後就可以拿到流了,這裡不說,我們繼續來看這個ls指令,如果你細心的話,你會發現,ls指令後面有一個字号:toolbox
關于toolbox,他是一個指令集,但是我們今天不講他,但是你要知道他是一個全局集,有點類似配置了JAVA的環境變量,所有才會使用者可以執行
但是我現在執行一個tinymix的指令
try {Runtime runtime = Runtime.getRuntime();Process exec = runtime.exec("tinymix -D 1");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}
他肯定會報操作不允許,也就是我們沒有這個權限,拿我們應該怎麼去拿到這個權限呢?就是通過我們的系統簽名
1.設定sharedUserId
為了拿到權限,我們需要在清單檔案的manifest裡設定和系統同一個UserId
android:sharedUserId=“android.uid.system”
2.擷取簽名檔案
簽名檔案有三個
- platform.pk8
- platform.x509.pem
- signapk.jar
這三個都是可以在源碼裡拿到的
platform.pk8和platform.x509.pem都可以在build/target/product/security/目錄下找到
signapk.jar在build/tools/signapk/目錄下
3.系統簽名
//執行指令signapk.jar platform.x509.pem platform.pk8 input.apk output.apk
我們拿到之後把這幾個放在同一個目錄下,然後打開cmd,執行指令
這句指令後面兩個apk分别是你要簽名的apk名字和簽名後的apk名字,比如我需要簽名的apk叫做app_debug
執行指令後會的到
ok,我們現在拿到Test.apk可不能安裝,需要push到system/app下,執行指令
adb push apk路徑 /system/app
但是很多人應該會報 Read-only file system錯誤的
那是因為你沒有在remount模式下,你可以執行
adb root adb remount
就像這樣
好的,至此,我們成功的系統簽名了,接下來你就可以執行這個shell指令了
這裡隻是抛磚引玉下,各位自己發揮
有興趣的可以加群:417046685