在教學之前先了解一下 UID
在安裝應用程式之後Android 會配給每個Application一個獨特UID,而Application的UID是由10000之後往後遞加。系統的詳細配置可以由mydroid/system/core/include/private/android_filesystem_config.h看出一二。
#if (CONFIG_4430SDP_KEYPAD & CONFIG_RECOVERY) #define AID_ROOT 0 /* traditional unix root user */ #define AID_SYSTEM 1000 /* system server */ #define AID_RADIO 1001 /* telephony subsystem, RIL */ #define AID_BLUETOOTH 1002 /* bluetooth subsystem */ #define AID_GRAPHICS 1003 /* graphics devices */ #define AID_INPUT 1004 /* input devices */ #define AID_AUDIO 1005 /* audio devices */ #define AID_CAMERA 1006 /* camera devices */ #define AID_LOG 1007 /* log devices */ #define AID_COMPASS 1008 /* compass device */ #define AID_MOUNT 1009 /* mountd socket */ #define AID_WIFI 1010 /* wifi subsystem */ #define AID_ADB 1011 /* android debug bridge (adbd) */ #define AID_INSTALL 1012 /* group for installing packages */ #define AID_MEDIA 1013 /* mediaserver process */ #define AID_DHCP 1014 /* dhcp client */ #define AID_SDCARD_RW 1015 /* external storage write access */ #define AID_VPN 1016 /* vpn system */ #define AID_KEYSTORE 1017 /* keystore subsystem */ #define AID_SHELL 2000 /* adb and debug shell user */ #define AID_CACHE 2001 /* cache access */ #define AID_DIAG 2002 /* access to diagnostic resources */ /* The 3000 series are intended for use as supplemental group id's only. * They indicate special Android capabilities that the kernel is aware of. */ #define AID_NET_BT_ADMIN 3001 /* bluetooth: create any socket */ #define AID_NET_BT 3002 /* bluetooth: create sco, rfcomm or l2cap sockets */ #define AID_INET 3003 /* can create AF_INET and AF_INET6 sockets */ #define AID_NET_RAW 3004 /* can create raw INET sockets */ #define AID_NET_ADMIN 3005 /* can configure interfaces and routing tables. */ #define AID_MISC 9998 /* access to misc storage */ #define AID_NOBODY 9999 #define AID_APP 10000 /* first app user */
下面是取自鳥哥第十四章、Linux 帳號管理與 ACL 權限設定
id 範圍 | 該 ID 使用者特性 |
0 (系統管理員) | 當 UID 是 0 時,代表這個帳號是『系統管理員』! 所以當你要讓其他的帳號名稱也具有 root 的權限時,將該帳號的 UID 改為 0 即可。 這也就是說,一部系統上面的系統管理員不見得只有 root 喔! 不過,很不建議有多個帳號的 UID 是 0 啦~ |
1~499 (系統帳號) | 保留給系統使用的 ID,其實除了 0 之外,其他的 UID 權限與特性並沒有不一樣。預設 500 以下的數字讓給系統作為保留帳號只是一個習慣。 由於系統上面啟動的服務希望使用較小的權限去運作,因此不希望使用 root 的身份去執行這些服務, 所以我們就得要提供這些運作中程式的擁有者帳號才行。這些系統帳號通常是不可登入的, 所以才會有我們在第十一章提到的 /sbin/nologin 這個特殊的 shell 存在。 根據系統帳號的由來,通常系統帳號又約略被區分為兩種: 1~99:由 distributions 自行建立的系統帳號; 100~499:若使用者有系統帳號需求時,可以使用的帳號 UID。 |
500~65535 (可登入帳號) | 給一般使用者用的。事實上,目前的 linux 核心 (2.6.x 版)已經可以支援到 4294967295 (2^32-1) 這麼大的 UID 號碼喔! |
而Application可以透過AndroidManifest.xml去請求特殊的權限。
例如
去請求要有vibrate的權限更多的權限可以去Android SDK尋找。
而當超過這些permission時要怎麼辦?這時就需要讓你的apk具有root的權限。
使用的方式就跟ubuntu一樣透過su將自己的uid變成,但有個問題就是project內所附的su是無法做到的。這是要感謝xda上的人提供 su & Superuser.apk。
su 會去listen有人是否使用,若有人要使用會去通知Superuser.apk ,這時會出現視窗詢問你是否取得root權限。
而su & Superuser.apk 可以在xda上抓:[APP] Superuser 2.3.6.1 - Now on the Market
adb push su /system/bin/ adb shell chown root.root /system/bin/su adb shell chmod 6755 /system/bin/su adb push Superuser.apk /system/app
這裡又是個學問,讓我卡很久,重點在於 chown & chmod這兩個。
詳細可以參考鳥哥第七章、Linux 檔案與目錄管理
簡單來說當apk使用su時本身UID為root 身份而非Application 的UID。(第七章內的[SUID程式執行的過程示意圖]可以明瞭。)