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}"

在Ubuntu上安裝及設定NDK

1. 下載NDK for Ubuntu,位置可任意決定.

2. 編輯 bashrc
    1) 於終端機下command "sudo gedit ~/.bashrc", 添加下面文字.
    2) NDK_ROOT=android_ndk_path, 後面的目徑是NDK的目錄,前面的名稱可任取.
         ex: NDK_ROOT=/home/favoritepili/Android/android-ndk-r4b/
     3) export NDK_ROOT
     4)儲存,離開.
     PS.  由於是下載r4版,所以從此版開始不需要修改host-setup.sh

3. 測試
     1) 進入目標compile目錄. ex: "/home/favoritepili/Android/android-ndk-r4b/samples/hello-jni"
     2) type "$NDK_ROOT/ndk-build
     3) 如果成功會產生obj及libs兩個目錄

4. error
   1) 如果有錯誤訊息"Your APP_BUILD_SCRIPT points to an unknown file".
       確認你的路徑有沒有設錯, APP_BUILD_SCRIPT設定在project的.mk檔中.

   2)可以type command "$NDK_ROOT/ndk-build NDK_LOG=1", 來查看有何問題.

建立Windows cmd.exe 的shortcut

建立Windows cmd.exe shortcut

1. 在檔案總管任意路徑下按右鍵選"新增","捷徑".
2. 在輸入項目的位置中打"%COMSPEC%",然後按下一步.
3. 捷徑的名稱可任意取,然後按完成.
4. 點選此捷徑按右鍵.
5. 於"捷徑"此分頁中的"開始位置"輸入你想要執行cmd.exe時的預設位置. ex:"F:\Tools\AndroidNeedTools\android-sdk-windows\tools"
6. 完成.