天天看點

Android權限不夠問題

很多應用程式在調用Runtime.exec的時候或者建立服務的時候都會遇到權限不夠的情況。可采用以下解決方案:

AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.mokoid.LedTest"

android:sharedUserId="android.uid.system">

原來,ServiceManager 會去檢查應用的權限,Android系統會根據User ID做權限管理,在frmeworks/base/cmds/servicemanager/service_manager.c 裡有如下代碼:

int svc_can_register(unsigned uid, uint16_t *name)

修改 allowed數組即可

如果在應用層出現問題,則需要涉及到權限管理的兩個檔案:AndroidManifest.xml 和 Android.mk

AndroidManifest.xml

聲明權限:

<uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER" />

<uses-permission android:name="android.permission.VIBRATE"/>

聲明使用者組     

package="com.android.inputmethod.pinyin"

android:sharedUserId="android.uid.system">   

Android.mk中通過證書來聲明權限。

LOCAL_CERTIFICATE := platform需要和manifest中的android:sharedUserId="android.uid.system" 對應起來。 

platform 權限問題,最好運作在自己編譯的系統上,才可以有特權。如果修改了應用的權限。因為老的應用和資料有關聯,是以,重新下載下傳應用并且需要嘗試做一個恢複出廠設定或者通過應用管理器删除應用關聯的所有資料。 system uid = 1000 是特殊權限程序。

    AID_SYSTEM 被定義為1000,即system server的UID。從上述代碼可知,ServiceManager 會去檢查應用程式的UID,當UID不符合規定時,便無法執行do_add_service()。也就是,當應用程式的UID不是1000時,沒有權限新增Android Service的。是以,在AndroidManifest.xml 裡加上 android:sharedUserId 屬性的目的在于将應用程式的UID定義為android.uid.system 即1000,程式即可具備Android Service的權限。

    以Mokoid 所提供的範例為例,因為我們是在Android 應用程式中啟動Android Service,是以要特別留意這個部分。典型的新增 Android Service 做法是修改 frameworks/base/services/java/com/android/server/SystemServer.java檔案,但是需要修改原始的 Android 代碼。是以我們可以采用這種做法。