<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Thinking in XiaoQiang
    世人皆有悲哀,只有你不明白
    posts - 56,comments - 150,trackbacks - 0

    轉載:http://www.forwind.cn/category/linux/android/

    對于關注Android底層的朋友來說,其具體的啟動過程應該是比較吸引我們的。但是很多啟動文件什么的,都得adb push到host上來看,挺不方便的,都怪Android自帶的Toolbox太簡略了。所以在深入了解Android的啟動流程之前,我們來把Busybox安裝到Android上去,這樣,就有很多工具供我們使用了。

    首先去busybox主頁 下載最新版本的源代碼,然后用arm的交叉編譯器編譯出busybox的可執行程序,編譯的時候需要注意一些設置選項,例如

    Build Options —>
    [*] Build BusyBox as a static binary (no shared libs) 這個要選上,因上這樣子編譯出來的busyBox才是可以獨立運行的。
    │[*] Do you want to build BusyBox with a Cross Compiler? │ │
    │ │(/HOME/toolchains/gcc-4.0.2-glibc-2.3.5/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu│ 這是交叉編譯器的路徑,要根據具體的情況來設置。
    Installation Options —>
    [*] Don’t use /usr
    這樣子編譯出來的busybox才不會安裝到你主機的/usr目錄下。一定要選上。

    busybox的功能選項根據需要自選,但是不要太貪心.

    OK,這里就不糾纏于編譯busybox的東西了,網上資料無數。接下來,我們把busybox安裝到模擬器上去。先在模擬器上隨便建一個busybox的文件夾,然后進入busybox可執行文件目錄,使用命令

    adb push busybox.asc /data/busybox/busybox

    然后進入adb shell,chmod 777 ./busybox,就可以直接使用了。但現在還是不方便,總不能每用一個命令就輸一次busybox吧?所以,我們可以先用./busybox --install將程序都安裝到當前目錄下,然后把當前目錄添加到PATH變量中即可。暫時使用export來添加吧,如果想永久添加,往下看。

    好了,準備工作完成,開始研究的工作了。既然是研究啟動過程,那當然是先看看init.rc文件。去etc目錄打開它,分析一下內容,首先是對env的定義,也就是全局環境變量的定義,接下來的建立和初始化里面的內容目前還不清楚什么意思,緊接著就是系統啟動時運行的初始進程信息,這個比較有意思,包括了usbd-config和qemu,qemu自不用說,而usbd-config作為初始啟動的進程,應該就是和上一篇文章猜的一樣,用來調試或者usb通信的。往下看,是在初始啟動進程完成之后開始啟動的服務進程,這些進程如果因故退出,會自動重啟。這里面包括了console控制臺,adbd監護進程,usbd監護進程,debuggerd監護進程等.除去這些守護進程,能引起我們注意的,是runtime和zygote。這兩個進程似乎掌管著其他進程以及應用程序的啟動。

    現在,來讓我們做一個實驗吧,將自動調用的啟動過程變成手動,看看啟動流程具體是什么樣的。想達到這個目的,首先就是要修改init.rc文件,當然不是在模擬器的console中改,一是不能改,二是你改了也沒用,下次加載就會給你覆蓋了。所以,我們要從原始鏡像ramdisk.img入手了。從2.6標準Linux內核開始,initrd.img都采用cpio壓縮,猜測ramdisk.img也一樣,需要使用gunzip解壓縮,然后再使用cpio解包。好,進入tools/lib/images目錄下,先用file命令看看ramdisk.img的類型,沒錯,系統提示

    ramdisk.img: gzip compressed data, from Unix

    很好,然后將ramdisk.img復制一份到任何其他目錄下,將其名稱改為ramdisk.img.gz,并使用命令

    gunzip ramdisk.img.gz

    然后新建一個文件夾,叫ramdisk吧,進入,輸入命令

    cpio -i -F ../ramdisk.img

    這下,你就能看見并操作ramdisk里面的內容了。當然你也可以直接在外面進行操作,但是還是建議把cpio解壓縮出來的內容全部集中在一個文件夾里面,因為一會我們還要將其壓縮成新的ramdisk.img。

    OK,現在開始修改步驟吧。用任何一款編輯器打開init.rc,首先在PATH那里加上你的Busybox安裝路徑,然后注釋內容,我們要手工啟動他們。

    # zygote {
    # exec /system/bin/app_process
    # args {
    # 0 -Xzygote
    # 1 /system/bin
    # 2 –zygote
    # }
    # autostart 1
    # }# runtime {
    # exec /system/bin/runtime
    # autostart 1
    # }

    在這里需要注意,不要同時把兩者都注釋了,注釋某一個,再試驗手工啟動它,如果兩者同時注釋我這里有問題,無法啟動。

    好,接下來,使用下列命令重新打包成鏡像

    cpio -i -t -F ../ramdisk.img > list
    cpio -o -H newc -O lk.img < list

    當前目錄下生成的lk.img就是我們的新鏡像了。使用自己的鏡像啟動emulator;

    emulator -console -ramdisk lk.img

    如果我們注釋的是zygote,那么在#后輸入

    app_process -Xzygote /system/bin –zygote

    手工啟動,命令行中輸出的信息是

    Prepping: /system/app/AlarmProvider.apk:/system/app/Browser.apk:/system/app/Calendar.apk:/system/app/Camera.apk:/system/app/Contacts.apk:
    /system/app/Development.apk:/system/app/GDataFeedsProvider.apk:/system/app/Gmail.apk:/system/app/GmailProvider.apk:/system/app/GoogleApps.apk:
    /system/app/GoogleAppsProvider.apk:/system/app/Home.apk:/system/app/ImProvider.apk:/system/app/Maps.apk:/system/app/MediaPickerActivity.apk:
    /system/app/MediaProvider.apk:/system/app/Phone.apk:/system/app/PimProvider.apk:/system/app/ApiDemos.apk:/system/app/SettingsProvider.apk:
    /system/app/Sms.apk:/system/app/SyncProvider.apk:/system/app/TelephonyProvider.apk:/system/app/XmppService.apk:/system/app/YouTube.apk
    File not found: /system/app/AlarmProvider.apk
    File not found: /system/app/Calendar.apk
    File not found: /system/app/Camera.apk
    File not found: /system/app/GDataFeedsProvider.apk
    File not found: /system/app/Gmail.apk
    File not found: /system/app/GmailProvider.apk
    File not found: /system/app/MediaPickerActivity.apk
    File not found: /system/app/PimProvider.apk
    File not found: /system/app/ApiDemos.apk
    File not found: /system/app/Sms.apk
    File not found: /system/app/SyncProvider.apk
    File not found: /system/app/YouTube.apk
    Prep complete

    嘿嘿,從File not found的信息中可以看到一些Google可能會即將推出的應用,比如Gmail什么的。當然,這些都是Java框架的啟動信息,我們以后還要借助其他工具來進行進一步探索。

    如果我們注釋的是runtime,那么輸出信息是:

    +++ post-zygote

    看起來似乎zygote像是一個進程管理者,runtime通過與其溝通來啟動新的進程,特別是那些系統服務進程。老實說,沒有確切明白是啥意思,呵呵,吃飯時間到了,懶得看了。

    好了,今天就說到這,基本的方法就是這樣,有興趣的朋友可以進一步深入研究。我們下一篇文章見。

    posted on 2008-06-03 17:32 小強 閱讀(563) 評論(0)  編輯  收藏 所屬分類: google-android

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 最近的中文字幕大全免费版| 亚洲视频免费在线看| 在线观看无码的免费网站| 亚洲精品视频在线观看视频| 日韩av无码久久精品免费| 亚洲国产成人片在线观看无码| 国内精品免费在线观看 | 成人a视频片在线观看免费| 亚洲va乱码一区二区三区| 国产一卡二卡3卡四卡免费| 亚洲AV无码一区二区三区牛牛| 中文字幕影片免费在线观看| 亚洲精品123区在线观看| 国产免费啪嗒啪嗒视频看看| 美女免费精品高清毛片在线视| 国产免费资源高清小视频在线观看| 白白色免费在线视频| 亚洲成a人片在线观看老师| 一级特黄录像免费播放中文版 | 亚洲男人第一av网站| 2015日韩永久免费视频播放| 亚洲国产成人精品无码一区二区| 成年女人免费v片| 日韩免费在线中文字幕| 久久亚洲国产午夜精品理论片| 免费A级毛片无码A∨免费| 亚洲精品无码mⅴ在线观看| 免费播放特黄特色毛片| 免费观看91视频| 亚洲色无码国产精品网站可下载| 免费在线观看黄网站| 免费看无码特级毛片| 亚洲久悠悠色悠在线播放| 亚洲欧洲一区二区三区| 91香焦国产线观看看免费| 亚洲国产精品成人AV在线| 亚洲熟妇中文字幕五十中出| 免费看污成人午夜网站| 日本一区二区三区免费高清在线| 精品亚洲国产成AV人片传媒| 亚洲А∨精品天堂在线|