<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 專(zhuān)題 > 對Android啟動(dòng)過(guò)程的進(jìn)一步研究

對Android啟動(dòng)過(guò)程的進(jìn)一步研究

作者: 時(shí)間:2008-11-17 來(lái)源:ITPUB 收藏
  對于關(guān)注底層的朋友來(lái)說(shuō),其具體的啟動(dòng)過(guò)程應該是比較吸引我們的。但是很多啟動(dòng)文件什么的,都得adb push到host上來(lái)看,挺不方便的,都怪自帶的Toolbox太簡(jiǎn)略了。所以在深入了解的啟動(dòng)流程之前,我們來(lái)把Busybox安裝到Android上去,這樣,就有很多工具供我們使用了。

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

本文引用地址:http://dyxdggzs.com/article/89567.htm

  Build Options —>

  Build BusyBox as a static binary (no shared libs) 這個(gè)要選上,因上這樣子編譯出來(lái)的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│ 這是交叉編譯器的路徑,要根據具體的情況來(lái)設置。

  Installation Options —>

  Don’t use /usr

  這樣子編譯出來(lái)的busybox才不會(huì )安裝到你主機的/usr目錄下。一定要選上。

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

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

  adb push busybox.asc /data/busybox/busybox

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

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

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

  ramdisk.img: gzip compressed data, from Unix

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

  gunzip ramdisk.img.gz

  然后新建一個(gè)文件夾,叫ramdisk吧,進(jìn)入,輸入命令

  cpio -i -F ../ramdisk.img

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

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

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

  在這里需要注意,不要同時(shí)把兩者都注釋了,注釋某一個(gè),再試驗手工啟動(dòng)它,如果兩者同時(shí)注釋我這里有問(wèn)題,無(wú)法啟動(dòng)。

  好,接下來(lái),使用下列命令重新打包成鏡像

  cpio -i -t -F ../ramdisk.img > list

  cpio -o -H newc -O lk.img < list

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

  emulator -console -ramdisk lk.img

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

  app_process -Xzygote /system/bin –zygote

  手工啟動(dòng),命令行中輸出的信息是

  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可能會(huì )即將推出的應用,比如Gmail什么的。當然,這些都是Java框架的啟動(dòng)信息,我們以后還要借助其他工具來(lái)進(jìn)行進(jìn)一步探索。

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

  +++ post-zygote

  老實(shí)說(shuō),沒(méi)有明白這是啥意思,呵呵,吃飯時(shí)間到了,懶得看了。

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



關(guān)鍵詞: Android

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>