2011年4月13日 星期三

How to root ?

這問題一直困擾我很久,自己手機明明很簡單就是不知道為什麼自己做的project都無法讓apk root。


在教學之前先了解一下 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 號碼喔!
可以看出Android Application在Linux上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程式執行的過程示意圖]可以明瞭。)

How to turn on WiFi?

使用platform + WiFi :Omap 4430 + WL1283
其實原本command很簡單就兩行

svc wifi enable
svc wifi disable

但因為工廠要產測所以不打算讓android起來,只打算在recovery mode上做測試。(這樣比較快)
在下答指令前需自己產生一個檔案wpa_supplicant.conf並放到/data/misc/wifi
內容如下:

ctrl_interface=tiwlan0 
update_config=1

network={
        ssid="ConnectionPoint"
        key_mgmt=NONE
        priority=1
}

啟動WiFi command:
insmod /etc/wifi/tiwlan_drv.ko
/system/bin/wlan_loader -f /system/etc/wifi/firmware.bin -i /system/etc/wifi/tiwlan.ini -e /data/misc/wifi/nvs_map.bin
/system/bin/ifconfig tiwlan0 up
/system/bin/wpa_supplicant -Dtiwlan0 -itiwlan0 -c/data/misc/wifi/wpa_supplicant.conf&
/system/bin/dhcpcd -ABKL -d tiwlan0&

列出WiFi AP list
echo -e "c\nb" | /system/bin/wlan_cu