- Android系統(tǒng)級(jí)深入開(kāi)發(fā)
- 韓超 梁泉
- 2106字
- 2018-12-29 13:39:31
3.4.1 移植的輔助性工作
1.Init時(shí)設(shè)置設(shè)備權(quán)限
init可執(zhí)行文件是Android系統(tǒng)運(yùn)行的第一個(gè)用戶空間的程序,它以守護(hù)進(jìn)程的方式運(yùn)行。
在需要增加驅(qū)動(dòng)程序設(shè)備節(jié)點(diǎn)時(shí),一個(gè)潛在的工作就是更改這些設(shè)備節(jié)點(diǎn)的屬性,更改的內(nèi)容在system/core/init/devices.c文件中。
struct perms表示設(shè)備的類型,如下所示:
struct perms_ { char *name; /* 設(shè)備的名稱 */ mode_t perm; /* 設(shè)備的Mode */ unsigned int uid; /* 設(shè)備的用戶ID */ unsigned int gid; /* 設(shè)備的組ID */ unsigned short prefix; /* 設(shè)備的前綴 */ };
devperms數(shù)組表示系統(tǒng)中的設(shè)備,這個(gè)數(shù)組的類型是perms,如下所示:
static struct perms_ devperms[] = { { "/dev/null", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/zero", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/full", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/ptmx", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/tty", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/random", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/urandom", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/ashmem", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/binder", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/log/", 0662, AID_ROOT, AID_LOG, 1 }, { "/dev/alarm", 0664, AID_SYSTEM, AID_RADIO, 0 }, { "/dev/tty0", 0660, AID_ROOT, AID_SYSTEM, 0 }, { "/dev/graphics/", 0660, AID_ROOT, AID_GRAPHICS, 1 }, /* ......省略部分內(nèi)容*/ { "/dev/input/", 0660, AID_ROOT, AID_INPUT, 1 }, /* ......省略部分內(nèi)容*/ { "/dev/ppp", 0660, AID_RADIO, AID_VPN, 0 }, { "/dev/tun", 0640, AID_VPN, AID_VPN, 0 }, { NULL, 0, 0, 0, 0 }, };
其中,主要定義的內(nèi)容是每一個(gè)設(shè)備的權(quán)限、所屬用戶、所屬組。這個(gè)權(quán)限的含義和Linux標(biāo)準(zhǔn)的定義相同,3個(gè)數(shù)字分別表示所屬用戶、所屬組和其他人權(quán)限。4表示可讀,2表示可寫,1表示可執(zhí)行(設(shè)備節(jié)點(diǎn)不需要可執(zhí)行)。
例如,/dev/null是一個(gè)Linux標(biāo)準(zhǔn)的設(shè)備,這里給它的權(quán)限是0666,表示任何用戶都可以對(duì)其進(jìn)行讀/寫。
如果需要增加一個(gè)設(shè)備節(jié)點(diǎn)文件,需要在devperms數(shù)組中增加一行內(nèi)容。
各個(gè)與用戶名相關(guān)的名稱在system/core/include/private目錄的android_filesystem_config.h文件中定義,android_id_info表示id的屬性,內(nèi)容如下所示:
struct android_id_info { const char *name; unsigned aid; };
具體各個(gè)ID(用戶名)的定義在android_ids數(shù)組中描述,內(nèi)容如下所示:
static struct android_id_info android_ids[] = { { "root", AID_ROOT, }, /* 字符串 <--> 整數(shù)值 */ { "system", AID_SYSTEM, }, { "radio", AID_RADIO, }, { "bluetooth", AID_BLUETOOTH, }, { "graphics", AID_GRAPHICS, }, { "input", AID_INPUT, }, { "audio", AID_AUDIO, }, { "camera", AID_CAMERA, }, /* ......省略部分內(nèi)容*/ { "nobody", AID_NOBODY, }, };
android_ids數(shù)組實(shí)際上表示了一個(gè)映射關(guān)系,將字符串和整數(shù)值對(duì)應(yīng)起來(lái)。
2.init.rc中的內(nèi)容
在Android中使用啟動(dòng)腳本init.rc,init啟動(dòng)腳本的路徑:system/core/rootdir/init.rc可以在系統(tǒng)的初始化過(guò)程中進(jìn)行一些簡(jiǎn)單的初始化操作。init.rc腳本被直接安裝到目標(biāo)系統(tǒng)的根文件系統(tǒng)中,被init可執(zhí)行程序解析。
init.rc是在init啟動(dòng)后被執(zhí)行的啟動(dòng)腳本,其語(yǔ)法主要包含了以下的內(nèi)容:
Commands:命令
Actions:動(dòng)作
Triggers:觸發(fā)條件
Services:服務(wù)
Options:選項(xiàng)
Properties:屬性
init腳本的關(guān)鍵字可以參考init進(jìn)程的system/core/init/keyword.h文件。這些功能一般都是通過(guò)調(diào)用Linux的標(biāo)準(zhǔn)庫(kù)函數(shù)來(lái)實(shí)現(xiàn)的。關(guān)于init.rc腳本的使用方法,可以參考說(shuō)明文件system/core/init/readme.txt。
Commands(命令)是一些基本的操作,例如:
export PATH /sbin:/system/sbin:/system/bin:/system/xbin mount yaffs2 mtd@system /system mount yaffs2 mtd@system /system ro remount mkdir /data/misc 01771 system misc mkdir /data/lost+found 0770 mkdir /cache/lost+found 0770
這些命令在init可執(zhí)行程序中被解析,然后調(diào)用相關(guān)的函數(shù)來(lái)實(shí)現(xiàn)。
以下命令可以更改系統(tǒng)中目錄和文件的權(quán)限:
chmod 0770 /data/misc/wifi chmod 0660 /data/misc/wifi/wpa_supplicant.conf
在init.rc腳本中更改權(quán)限當(dāng)然也可以用于更改設(shè)備文件的權(quán)限,然而init.rc腳本只是在初始化狀態(tài)下執(zhí)行,因此這樣更改權(quán)限只適合用于固定的設(shè)備,對(duì)于可以熱插拔的設(shè)備則還是需要通過(guò)init進(jìn)行中的devices.c文件來(lái)實(shí)現(xiàn)。
Actions(動(dòng)作)表示一系列的命令,通常在Triggers(觸發(fā)條件中)中調(diào)用,動(dòng)作和觸發(fā)條件的形式如下:
on <trigger> <command> <command> <command>
動(dòng)作的使用示例如下:
on init export PATH /sbin:/system/sbin:/system/bin:/system/xbin mkdir /system
init表示一個(gè)觸發(fā)條件(初始化過(guò)程),在這個(gè)觸發(fā)事件發(fā)生后,進(jìn)行設(shè)置環(huán)境變量和建立目錄的操作稱為一個(gè)“動(dòng)作”。
Properties(屬性)是系統(tǒng)中使用的一些值,可以進(jìn)行設(shè)置和讀取。
在啟動(dòng)腳本中,屬性的使用如下所示:
setprop ro.FOREGROUND_APP_MEM 1536 setprop ro.VISIBLE_APP_MEM 2048 on property:ro.kernel.qemu=1 start adbd
setprop用于設(shè)置屬性,on property可以用于判斷屬性,這里的屬性在整個(gè)Android系統(tǒng)運(yùn)行中都是一致的。
Services(服務(wù))通常表示啟動(dòng)一個(gè)可執(zhí)行程序,Options(選項(xiàng))是服務(wù)的附加內(nèi)容,用于配合服務(wù)使用。
例如,啟動(dòng)電話的進(jìn)程ril-daemon和開(kāi)機(jī)動(dòng)畫(huà)的服務(wù),分別如下所示:
service ril-daemon /system/bin/rild socket rild stream 660 root radio socket rild-debug stream 660 radio system user root group radio cache inet misc audio service bootanim /system/bin/bootanimation user graphics group graphics disabled oneshot
ril-daemon和bootanim表示服務(wù)的名稱,/system/bin/rild和/system/bin/bootanimation表示服務(wù)所需要執(zhí)行的可執(zhí)行程序的路徑。
socket、user、group和oneshot就是配合服務(wù)使用的選項(xiàng)。oneshot選項(xiàng)表示該服務(wù)只啟動(dòng)一次,而如果沒(méi)有oneshot選項(xiàng),這個(gè)可執(zhí)行程序會(huì)一直存在——如果可執(zhí)行程序被殺死,則會(huì)重新啟動(dòng)。在以上的例子中,ril-daemon是一個(gè)守護(hù)進(jìn)程,如果退出,需要重新啟動(dòng),因此沒(méi)有使用oneshot;bootanim開(kāi)機(jī)動(dòng)畫(huà),只執(zhí)行一次,因此加上了oneshot。
3.更改配置文件
在Android硬件抽象層移植的過(guò)程中,有時(shí)候還需要向系統(tǒng)中加入運(yùn)行時(shí)配置(Executive Time Configuration )文件,來(lái)配置系統(tǒng)的功能。
Android中的ETC文件,主要放在/system/etc/目錄中,如下所示:
# ls -l /system/etc/ -rw-r--r-- root root 61347 2010-03-09 09:58 NOTICE.html.gz -r--r----- bluetooth bluetooth 935 2010-03-06 02:16 dbus.conf drwxr-xr-x root root 2010-03-09 09:14 permissions -rw-r--r-- root root 1093 2010-03-06 02:16 vold.fstab -rw-r--r-- root root 1471 2010-03-06 02:13 apns-conf.xml -rw-r--r-- root root 25 2010-03-06 02:16 hosts -rw-r--r-- root root 10801 2010-03-09 08:56 event-log-tags -rw-r--r-- root root 473 2010-03-06 02:13 pvplayer.cfg drwxr-xr-x root root 2010-03-09 09:14 dhcpcd drwxr-xr-x root root 2010-03-09 09:41 ppp drwxr-xr-x root root 2010-03-09 09:13 security -r-xr-x--- root shell 1200 2010-03-06 02:16 init.goldfish.sh
Android運(yùn)行時(shí),文件系統(tǒng)根目錄的etc目錄是到/system/etc/的連接。
此外在/system/usr目錄中,也包含了一些運(yùn)行時(shí)的內(nèi)容,如下所示:
# ls -l /system/usr drwxr-xr-x root root 2010-03-09 09:14 keylayout drwxr-xr-x root root 2010-03-09 09:14 share drwxr-xr-x root root 2010-03-09 09:28 keychars drwxr-xr-x root root 2010-03-09 09:14 srec
4.文件系統(tǒng)的屬性
在system/core/include/private目錄的android_filesystem_config.h文件中定義了各個(gè)目錄的屬性,struct fs_path_config表示了文件系統(tǒng)路徑的屬性,如下所示:
struct fs_path_config { unsigned mode; // 模式 unsigned uid; // 用戶ID unsigned gid; // 組ID const char *prefix; // 目錄前綴 };
文件系統(tǒng)中一些子目錄的屬性在android_dirs數(shù)組中定義,如下所示:
static struct fs_path_config android_dirs[] = { { 00770, AID_SYSTEM, AID_CACHE, "cache" }, { 00771, AID_SYSTEM, AID_SYSTEM, "data/app" }, { 00771, AID_SYSTEM, AID_SYSTEM, "data/app-private" }, { 00771, AID_SYSTEM, AID_SYSTEM, "data/dalvik-cache" }, { 00771, AID_SYSTEM, AID_SYSTEM, "data/data" }, { 00771, AID_SHELL, AID_SHELL, "data/local/tmp" }, { 00771, AID_SHELL, AID_SHELL, "data/local" }, { 01771, AID_SYSTEM, AID_MISC, "data/misc" }, { 00770, AID_DHCP, AID_DHCP, "data/misc/dhcp" }, { 00771, AID_SYSTEM, AID_SYSTEM, "data" }, { 00750, AID_ROOT, AID_SHELL, "sbin" }, { 00755, AID_ROOT, AID_SHELL, "system/bin" }, { 00755, AID_ROOT, AID_SHELL, "system/xbin" }, { 00755, AID_ROOT, AID_ROOT, "system/etc/ppp" }, { 00777, AID_ROOT, AID_ROOT, "sdcard" }, { 00755, AID_ROOT, AID_ROOT, 0 }, };
默認(rèn)文件的屬性在android_files數(shù)組中定義,如下所示:
static struct fs_path_config android_files[] = { { 00440, AID_ROOT, AID_SHELL, "system/etc/init.goldfish.rc" }, { 00550, AID_ROOT, AID_SHELL, "system/etc/init.goldfish.sh" }, { 00440, AID_ROOT, AID_SHELL, "system/etc/init.trout.rc" }, { 00550, AID_ROOT, AID_SHELL, "system/etc/init.ril" }, /* ......省略部分內(nèi)容 */ };
如果需要更改文件系統(tǒng)路徑的屬性等內(nèi)容,只需要更改android_filesystem_config.h文件即可。
- Unity 2020 By Example
- FuelPHP Application Development Blueprints
- Boost程序庫(kù)完全開(kāi)發(fā)指南:深入C++”準(zhǔn)”標(biāo)準(zhǔn)庫(kù)(第5版)
- 機(jī)器學(xué)習(xí)系統(tǒng):設(shè)計(jì)和實(shí)現(xiàn)
- GeoServer Cookbook
- 云原生Spring實(shí)戰(zhàn)
- Elastic Stack應(yīng)用寶典
- TypeScript項(xiàng)目開(kāi)發(fā)實(shí)戰(zhàn)
- 自然語(yǔ)言處理Python進(jìn)階
- Android系統(tǒng)級(jí)深入開(kāi)發(fā)
- 自己動(dòng)手構(gòu)建編程語(yǔ)言:如何設(shè)計(jì)編譯器、解釋器和DSL
- micro:bit軟件指南
- R統(tǒng)計(jì)應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)
- 編程真好玩:從零開(kāi)始學(xué)網(wǎng)頁(yè)設(shè)計(jì)及3D編程
- C#開(kāi)發(fā)之道