2010年10月27日 星期三

應用程式如何取得系統權限

在Android上執行不同的apk會跑在不同的sandbox上, 並且以不同的身份(uid)在執行, 但問題是我今天想要用system身份做某些事或是想要在不同的app分享資源時, 就會需要能對apk指定uid, 方法有兩種分別說明如下:

方法一
1.修改AndroidManifest.xml, 新增android:sharedUserId="android.uid.system"屬性(使用system身份)
2.修改Android.mk文件,加入LOCAL_CERTIFICATE := platform這一行

3.重新編譯apk

PS. LOCAL_CERTIFICATE := platform, 由於試驗的這份source code 是由客戶提供,所以"platform"這個關鍵字已經被定義好了.

方法二
1.如方法一修改AndroidManifest.xml, 新增 android:sharedUserId="android.uid.system" 屬性(使用system身份)
2.使用Eclipse編譯出apk
3.刪除該apk中META-INF目錄下的CERT.SF和CERT.RSA兩個檔案
4.以系統的public/private key重新簽署打包apk, signapk的用法為

Usage: signapk [-w] publickey.x509[.pem] privatekey.pk8 input.jar output.jar
5.實際執行命令如下.
$java -jar signapk.jar -w ./platform.x509.pem ./platform.pk8 ./input.apk ./output.apk(此為將所有檔案放於同一路徑下)

PS. signapk.jar , platform.x509.pem, platform.pk8可於source code中取得
如果想要不同的apk以相同的uid身份在執行, 則在這些不同的APK中AndroidManifest.xml的語法為

manifest xmlns:android="http://schemas.android.com/apk/res/android" android:sharedUserId="{MY.URI.FORMAT}"

沒有留言: