想寫一個重啟系統的apk(reboot.apk),因為沒有權限,所以編譯出來的apk無法達到效果。
網上查到的方法講的不太清楚,至少我是這么覺得,因為我照着做,試了好多次才成功。下面是我嘗試過並成功的兩個方法,總結如下。
方法1:通過將項目作為一個模塊,放到Android系統源碼中進行編譯~~~
步驟如下:
1. 在應用程序的AndroidManifest.xml中的manifest節點中加入"android:sharedUserId="android.uid.system"這個屬性。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" …… android:sharedUserId="android.uid.system" > <!--添加該屬性--> <uses-permission android:name="android.permission.SHUTDOWN"/> <!--添加該權限--> …… </manifest>
2.編譯apk
(1)將應用程序的src文件、res文件和AndroidManifest.xml文件拷貝到Android系統源碼package/apps目錄下
(2)編寫一個Android.mk文件(最簡單的方法就是拷貝其他模塊中的Android.mk文件),修改Android.mk文件,加入LOCAL_CERTIFICATE := platform這一行
Android.mk:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := 你的項目名
LOCAL_CERTIFICATE := platform #添加這一句
include $(BUILD_PACKAGE)
(3)mm 編譯,生成apk
總結:其實就是把應用程序當作系統應用進行編譯~~這樣之后就會有系統權限了。
方法2:這個辦法麻煩點,不過不用跑到源碼環境下用make來編譯:
步驟:
1. 同上,加入android:sharedUserId="android.uid.system"這個屬性。
2. 使用eclipse編譯出apk文件,但是這個apk文件是不能用的。
3. 用壓縮軟件打開apk文件,刪掉META-INF目錄下的CERT.SF和CERT.RSA兩個文件。
4. 使用目標系統的platform密鑰來重新給apk文件簽名。這步比較麻煩,
(4.2)然后用Android提供的Signapk工具(即signapk.jar)來簽名。signapk的源代碼是在"build/tools/signapk"下。
(4.3)進入"build/tools/signapk"目錄下(接下來一直在該目錄下進行以下指令)
1.javac Signapk.java //編譯生成SignApk$SignatureOutputStream.class和SignApk.class文件,將這兩個文件拷貝到新創建的com/android/signapk目錄下。 2.jar cvfm signapk.jar SignApk.mf com //JAR命令使用中有解釋 3.將reboot.apk、platform.pk8、platform.x509.pem文件復制到"build/tools/signapk"目錄下,然后執行下面指令。 4.java -jar signapk.jar platform.x509.pem platform.pk8 reboot.apk reboot_signed.apk //生成了reboot_signed.apk,這個就是最終想要的apk了
ps1:如果源碼全編譯過,那就已經生成了signapk.jar文件,可以直接拷貝過來,路徑在/out/host/linux-x86/framework/signapk.jar。當然,要是沒有環境全編譯源碼,但又需要signapk.jar文件,就可以通過以上方法來獲得。打包生成signapk.jar文件可以重用,不用每次都重新打包。
ps2:key,就是上面第二個方法提到的platform.pk8和platform.x509.pem兩個文件。用這兩個key簽名后apk才真正可以放入系統進程中。第一個方法中加入LOCAL_CERTIFICATE := platform其實就是用這兩個key來簽名。這也有一個問題,就是這樣生成的程序只有在原始的Android系統或者是自己編譯的系統中才可以用,因為這樣的系統才可以拿到 platform.pk8和platform.x509.pem兩個文件。要是別家公司做的Android上連安裝都安裝不了。