官术网_书友最值得收藏!

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文件即可。

主站蜘蛛池模板: 广水市| 屯昌县| 梧州市| 马尔康县| 正阳县| 肇源县| 江西省| 弋阳县| 吴旗县| 抚顺市| 顺平县| 巴里| 澜沧| 自治县| 广宗县| 巨野县| 太康县| 淳安县| 林口县| 工布江达县| 肃宁县| 马关县| 浦江县| 正镶白旗| 澜沧| 色达县| 临沧市| 隆化县| 容城县| 来安县| 东安县| 宕昌县| 邯郸市| 射阳县| 延长县| 湟中县| 四会市| 高青县| 浮山县| 都安| 广东省|