第一篇: Android系統(tǒng)啟動(dòng)之bootloader

成都創(chuàng)新互聯(lián)是一家專業(yè)提供鹽亭企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、H5開發(fā)、小程序制作等業(yè)務(wù)。10年已為鹽亭眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
第二篇: Android系統(tǒng)啟動(dòng)之Init流程(上)
第三篇: Android系統(tǒng)啟動(dòng)之Init流程(下)
第四篇: Android系統(tǒng)啟動(dòng)之init.rc文件解析過程
第五篇: Android系統(tǒng)啟動(dòng)之zyogte進(jìn)程
第六篇: Android系統(tǒng)啟動(dòng)之zyogte進(jìn)程java(上)
第七篇: Android系統(tǒng)啟動(dòng)之zyogte進(jìn)程java(下)
第八篇: Android系統(tǒng)啟動(dòng)之SystemServer
Android init.rc文件由系統(tǒng)第一個(gè)啟動(dòng)的init程序解析。是啟動(dòng)系統(tǒng)服務(wù)使用的文件。
主要包含了四種類型的語句:
Action和services顯式聲明了一個(gè)語句塊,而commands和options屬于最近聲明的語句塊。
在第一個(gè)語句塊之前 的commands和options會(huì)被忽略.
基本規(guī)則如下:
動(dòng)作表示了一組命令(commands)組成.動(dòng)作包括一個(gè)觸發(fā)器,決定了何時(shí)運(yùn)行這個(gè)動(dòng)作。
注意: 當(dāng)觸發(fā)器的條件滿足時(shí),這個(gè)動(dòng)作會(huì)被增加到已被運(yùn)行的隊(duì)列尾。假設(shè)此動(dòng)作在隊(duì)列中已經(jīng)存在,那么它將不會(huì)運(yùn)行.
一個(gè)動(dòng)作所包括的命令將被依次運(yùn)行。
在"動(dòng)作"(action)里面的,on后面跟著的字符串是觸發(fā)器(trigger),trigger是一個(gè)用于匹配某種事件類型的字符串,它將對(duì)應(yīng)的Action的執(zhí)行。
觸發(fā)器(trigger)有幾種格式:
常見的格式:
command是action的命令列表中的命令,或者是service中的選項(xiàng) onrestart 的參數(shù)命令.
命令將在所屬事件發(fā)生時(shí)被一個(gè)個(gè)地執(zhí)行.
常見命令:
服務(wù)是指那些須要在系統(tǒng)初始化時(shí)就啟動(dòng)或退出時(shí)自己主動(dòng)重新啟動(dòng)的程序.
解釋一下各個(gè)參數(shù):
options是Service的修訂項(xiàng)。它們決定一個(gè)服務(wù)何時(shí)以及如何運(yùn)行.
使用例子:
源碼路徑 system/core/init/init.cpp 中:
開始解析rc文件.
ParseConfig函數(shù)在文件 core/init/init_parser.cpp 140行:
ParseConfigFile函數(shù):
Android init.rc文件淺析
安卓系統(tǒng)啟動(dòng)--3init.rc解析
init.rc深入學(xué)習(xí)
rc是android初始化腳本,用android init language編寫,通過init程序來執(zhí)行。sh是linux里面的shell腳本,可以在sh或者 bash里面執(zhí)行。
在Android中使用啟動(dòng)腳本init.rc,可以在系統(tǒng)的初始化中進(jìn)行簡單的操作。
init.rc啟動(dòng)腳本路徑:system/core/rootdir/init.rc
內(nèi)容:
Commands:命令
Actions:動(dòng)作
Triggers:觸發(fā)條件
Services:服務(wù)
Options:選項(xiàng)
Properties:屬性
Commands是一些基本操作。如:
mkdir /system
mkdir /data 0771 system system
mkdir /persist 0771 system system
devwait /dev/block/mmcblk0p12
mount ext3 /dev/block/mmcblk0p
Action表示一系列命令,通常在Triggers中調(diào)用,如:
on init //表示一個(gè)觸發(fā)條件
sysclktz 0
loglevel 3
# setup the global environment
export PATH /sbin:/system/sbin:/system/bin:/system/xbin
export LD_LIBRARY_PATH /system/lib
export ANDROID_BOOTLOGO 1
Services通常表示啟動(dòng)一個(gè)可執(zhí)行程序,Options是服務(wù)的附加內(nèi)容,用于配合服務(wù)使用。
service vold /system/bin/vold //vold是服務(wù)名稱,/system/bin/vold是所對(duì)應(yīng)的可執(zhí)行程序。
socket vold stream 0660 root mount //socket是配合服務(wù)使用的選項(xiàng)
ioprio be 2
service netd /system/bin/netd
socket netd stream 0660 root system
配合服務(wù)使用的選項(xiàng)有socket,user,group,oneshot。
oneshot表示該服務(wù)只啟動(dòng)一次,而如果沒有oneshot選項(xiàng),這個(gè)可執(zhí)行程序?qū)⒁恢贝嬖凇绻蓤?zhí)行程序被殺死,則會(huì)重新啟動(dòng)。
Properties是系統(tǒng)中使用的一些值,可以進(jìn)行設(shè)置和讀寫。
setprop ro.HIDDEN_APP_MEM 5120 //setprop用于設(shè)置屬性
setprop ro.CONTENT_PROVIDER_MEM 5632
setprop ro.EMPTY_APP_MEM 6144
...
on property:ro.kernel.qemu=1 //on property用于判斷屬性
start adbd
這里的屬性在整個(gè)android系統(tǒng)運(yùn)行中都是一致的。
init腳本的關(guān)鍵字可以參考init進(jìn)程中的system/core/init/keyword.h文件。如:
KEYWORD(chroot, COMMAND, 1, do_chroot) //chroot是命令,do_chroot()是調(diào)用的函數(shù),這個(gè)函數(shù)在init進(jìn)程中的system/core/init/builtins.c文件中定義。
C風(fēng)格的反斜杠轉(zhuǎn)義符可以用來插入空白到語言符號(hào)。雙引號(hào)也可以用來防止文本被空格分成多個(gè)語言符號(hào)。當(dāng)反斜杠在行末時(shí),作為折行符。 * 以#開始(前面允許有空格)的行為注釋行。 * Actions和Services隱含聲明一個(gè)新的段落。所有該段落下Commands或Options的聲明屬于該段落。第一段落前的Commands或Options被忽略。 * Actions和Services擁有獨(dú)一無二的命名。在它們之后聲明相同命名的類將被當(dāng)作錯(cuò)誤并忽略。init.action 當(dāng)前正在執(zhí)行的action,如果沒有則為"" init.command 被執(zhí)行的命令,如果沒有則為"" init.svc.name 命名為name的服務(wù)的狀態(tài)("stopped", "running", "restarting") init.rc 示例:----------------- # not complete -- just providing some examples of usage#on boot export PATH /sbin:/system/sbin:/system/bin export LD_LIBRARY_PATH /system/lib mkdir /dev mkdir /proc mkdir /sys mount tmpfs tmpfs /dev mkdir /dev/pts mkdir /dev/socket mount devpts devpts /dev/pts mount proc proc /proc mount sysfs sysfs /sys write /proc/cpu/alignment 4 ifup lo hostname localhost domainname localhost mount yaffs2 mtd@system /system mount yaffs2 mtd@userdata /data import /system/etc/init.conf class_start default service adbd /sbin/adbd user adb group adb service usbd /system/bin/usbd -r user usbd group usbd socket usbd 666 service zygote /system/bin/app_process -Xzygote /system/bin --zygote socket zygote 666 service runtime /system/bin/runtime user system group system on device-added-/dev/compass start akmd on device-removed-/dev/compass stop akmd service akmd /sbin/akmd disabled user akmd group akmd 調(diào)試---------------默認(rèn)情況下,init執(zhí)行的程序輸出的信息和錯(cuò)誤到/dev/null.為了debug,你可以通過Android程序logwrapper執(zhí)行你的程序。
轉(zhuǎn):
JAR 文件可以用于
□ 用于發(fā)布和使用類庫
□ 作為應(yīng)用程序和擴(kuò)展的構(gòu)建單元
□ 作為組件、applet 或者插件程序的部署單位
□ 用于打包與組件相關(guān)聯(lián)的輔助資源
asec文件:/asec 目錄就是從SD卡分出來的存放安裝在SD卡內(nèi)應(yīng)用游戲apk的目錄,不要?jiǎng)h。.android_secure這個(gè)文件夾,打開ES文件瀏覽器隱藏文件查看功能,從手機(jī)上看到此文件夾為空,其實(shí)是特別處理的,其中含apk的內(nèi)容是掛載到了/mnt/asec目錄下,你可以在此找到現(xiàn)成的apk文件,這個(gè)目錄是SD卡中的內(nèi)容,不過不是掛載在/sdcard目錄下,而是單獨(dú)掛載了一個(gè)目錄,就像是給SD卡分區(qū)一樣,同樣都是SD卡的不同分區(qū),所以不要認(rèn)為/mnt/sdcard目錄是SD卡的真身,其實(shí)它不過是SD卡的一個(gè)分區(qū),而/mnt/asec是另外的分區(qū),它們都是SD卡的一部分,這樣應(yīng)該好解釋些吧。
如果你直接用電腦查看你的SD卡,就會(huì)看到SD卡中文件夾.android_secure里面不是非空的,其中都是asec文件,就是你安裝在SD卡中的應(yīng)用游戲,但在PC上你是無法看到apk文件的。所以說安裝在SD卡中滴應(yīng)用,絕對(duì)不會(huì)占內(nèi)存。
當(dāng)按下Android設(shè)備電源鍵時(shí)究竟發(fā)生了什么?
Android的啟動(dòng)過程是怎么樣的?
什么是Linux內(nèi)核?
桌面系統(tǒng)linux內(nèi)核與Android系統(tǒng)linux內(nèi)核有什么區(qū)別?
什么是引導(dǎo)裝載程序?
什么是Zygote?
什么是X86以及ARM linux?
什么是init.rc?
什么是系統(tǒng)服務(wù)?
當(dāng)我們想到Android啟動(dòng)過程時(shí),腦海中總是冒出很多疑問。本文將介紹Android的啟動(dòng)過程,希望能幫助你找到上面這些問題的答案。
Android是一個(gè)基于Linux的開源操作系統(tǒng)。x86(x86是一系列的基于intel 8086 CPU的計(jì)算機(jī)微處理器指令集架構(gòu))是linux內(nèi)核部署最常見的系統(tǒng)。然而,所有的Android設(shè)備都是運(yùn)行在ARM處理器(ARM 源自進(jìn)階精簡指令集機(jī)器,源自ARM架構(gòu))上,除了英特爾的Xolo設(shè)備()。Xolo來源自凌動(dòng)1.6GHz x86處理器。Android設(shè)備或者嵌入設(shè)備或者基于linux的ARM設(shè)備的啟動(dòng)過程與桌面版本相比稍微有些差別。這篇文章中,我將解釋Android設(shè)備的啟動(dòng)過程。深入linux啟動(dòng)過程是一篇講桌面linux啟動(dòng)過程的好文。
當(dāng)你按下電源開關(guān)后Android設(shè)備執(zhí)行了以下步驟。
此處圖片中step2中的一個(gè)單詞拼寫錯(cuò)了,Boot Loaeder應(yīng)該為Boot Loader(多謝@jameslast 提醒)
第一步:啟動(dòng)電源以及系統(tǒng)啟動(dòng)
當(dāng)電源按下,引導(dǎo)芯片代碼開始從預(yù)定義的地方(固化在ROM)開始執(zhí)行。加載引導(dǎo)程序到RAM,然后執(zhí)行。
第二步:引導(dǎo)程序
引導(dǎo)程序是在Android操作系統(tǒng)開始運(yùn)行前的一個(gè)小程序。引導(dǎo)程序是運(yùn)行的第一個(gè)程序,因此它是針對(duì)特定的主板與芯片的。設(shè)備制造商要么使用很受歡迎的引導(dǎo)程序比如redboot、uboot、qi bootloader或者開發(fā)自己的引導(dǎo)程序,它不是Android操作系統(tǒng)的一部分。引導(dǎo)程序是OEM廠商或者運(yùn)營商加鎖和限制的地方。
引導(dǎo)程序分兩個(gè)階段執(zhí)行。第一個(gè)階段,檢測外部的RAM以及加載對(duì)第二階段有用的程序;第二階段,引導(dǎo)程序設(shè)置網(wǎng)絡(luò)、內(nèi)存等等。這些對(duì)于運(yùn)行內(nèi)核是必要的,為了達(dá)到特殊的目標(biāo),引導(dǎo)程序可以根據(jù)配置參數(shù)或者輸入數(shù)據(jù)設(shè)置內(nèi)核。
Android引導(dǎo)程序可以在bootablebootloaderlegacyusbloader找到。
傳統(tǒng)的加載器包含的個(gè)文件,需要在這里說明:
init.s初始化堆棧,清零BBS段,調(diào)用main.c的_main()函數(shù);
main.c初始化硬件(鬧鐘、主板、鍵盤、控制臺(tái)),創(chuàng)建linux標(biāo)簽。
更多關(guān)于Android引導(dǎo)程序的可以在這里了解。
第三步:內(nèi)核
Android內(nèi)核與桌面linux內(nèi)核啟動(dòng)的方式差不多。內(nèi)核啟動(dòng)時(shí),設(shè)置緩存、被保護(hù)存儲(chǔ)器、計(jì)劃列表,加載驅(qū)動(dòng)。當(dāng)內(nèi)核完成系統(tǒng)設(shè)置,它首先在系統(tǒng)文件中尋找”init”文件,然后啟動(dòng)root進(jìn)程或者系統(tǒng)的第一個(gè)進(jìn)程。
第四步:init進(jìn)程
init是第一個(gè)進(jìn)程,我們可以說它是root進(jìn)程或者說有進(jìn)程的父進(jìn)程。init進(jìn)程有兩個(gè)責(zé)任,一是掛載目錄,比如/sys、/dev、/proc,二是運(yùn)行init.rc腳本。
init進(jìn)程可以在/system/core/init找到。
init.rc文件可以在/system/core/rootdir/init.rc找到。
readme.txt可以在/system/core/init/readme.txt找到。
對(duì)于init.rc文件,Android中有特定的格式以及規(guī)則。在Android中,我們叫做Android初始化語言。
Action(動(dòng)作):動(dòng)作是以命令流程命名的,有一個(gè)觸發(fā)器決定動(dòng)作是否發(fā)生。
語法
1
2
3
4
5
; html-script: false ]
on trigger
command
command
command
Service(服務(wù)):服務(wù)是init進(jìn)程啟動(dòng)的程序、當(dāng)服務(wù)退出時(shí)init進(jìn)程會(huì)視情況重啟服務(wù)。
語法
1
2
3
4
5
; html-script: false ]
service name pathname [argument]*
option
option
...
Options(選項(xiàng))
選項(xiàng)是對(duì)服務(wù)的描述。它們影響init進(jìn)程如何以及何時(shí)啟動(dòng)服務(wù)。
咱們來看看默認(rèn)的init.rc文件。這里我只列出了主要的事件以及服務(wù)。
Table
Action/Service
描述
on early-init
設(shè)置init進(jìn)程以及它創(chuàng)建的子進(jìn)程的優(yōu)先級(jí),設(shè)置init進(jìn)程的安全環(huán)境
on init
設(shè)置全局環(huán)境,為cpu accounting創(chuàng)建cgroup(資源控制)掛載點(diǎn)
on fs
掛載mtd分區(qū)
on post-fs
改變系統(tǒng)目錄的訪問權(quán)限
on post-fs-data
改變/data目錄以及它的子目錄的訪問權(quán)限
on boot
基本網(wǎng)絡(luò)的初始化,內(nèi)存管理等等
service servicemanager
啟動(dòng)系統(tǒng)管理器管理所有的本地服務(wù),比如位置、音頻、Shared preference等等…
service zygote
啟動(dòng)zygote作為應(yīng)用進(jìn)程
在這個(gè)階段你可以在設(shè)備的屏幕上看到“Android”logo了。
第五步
在Java中,我們知道不同的虛擬機(jī)實(shí)例會(huì)為不同的應(yīng)用分配不同的內(nèi)存。假如Android應(yīng)用應(yīng)該盡可能快地啟動(dòng),但如果Android系統(tǒng)為每一個(gè)應(yīng)用啟動(dòng)不同的Dalvik虛擬機(jī)實(shí)例,就會(huì)消耗大量的內(nèi)存以及時(shí)間。因此,為了克服這個(gè)問題,Android系統(tǒng)創(chuàng)造了”Zygote”。Zygote讓Dalvik虛擬機(jī)共享代碼、低內(nèi)存占用以及最小的啟動(dòng)時(shí)間成為可能。Zygote是一個(gè)虛擬器進(jìn)程,正如我們?cè)谇耙粋€(gè)步驟所說的在系統(tǒng)引導(dǎo)的時(shí)候啟動(dòng)。Zygote預(yù)加載以及初始化核心庫類。通常,這些核心類一般是只讀的,也是Android SDK或者核心框架的一部分。在Java虛擬機(jī)中,每一個(gè)實(shí)例都有它自己的核心庫類文件和堆對(duì)象的拷貝。
Zygote加載進(jìn)程
加載ZygoteInit類,源代碼:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
registerZygoteSocket()為zygote命令連接注冊(cè)一個(gè)服務(wù)器套接字。
preloadClassed “preloaded-classes”是一個(gè)簡單的包含一系列需要預(yù)加載類的文本文件,你可以在/frameworks/base找到“preloaded-classes”文件。
preloadResources() preloadResources也意味著本地主題、布局以及android.R文件中包含的所有東西都會(huì)用這個(gè)方法加載。
在這個(gè)階段,你可以看到啟動(dòng)動(dòng)畫。
第六步:系統(tǒng)服務(wù)或服務(wù)
完成了上面幾步之后,運(yùn)行環(huán)境請(qǐng)求Zygote運(yùn)行系統(tǒng)服務(wù)。系統(tǒng)服務(wù)同時(shí)使用native以及java編寫,系統(tǒng)服務(wù)可以認(rèn)為是一個(gè)進(jìn)程。同一個(gè)系統(tǒng)服務(wù)在Android SDK可以以System Services形式獲得。系統(tǒng)服務(wù)包含了所有的System Services。
Zygote創(chuàng)建新的進(jìn)程去啟動(dòng)系統(tǒng)服務(wù)。你可以在ZygoteInit類的”startSystemServer”方法中找到源代碼。
核心服務(wù):
啟動(dòng)電源管理器;
創(chuàng)建Activity管理器;
啟動(dòng)電話注冊(cè);
啟動(dòng)包管理器;
設(shè)置Activity管理服務(wù)為系統(tǒng)進(jìn)程;
啟動(dòng)上下文管理器;
啟動(dòng)系統(tǒng)Context Providers;
啟動(dòng)電池服務(wù);
啟動(dòng)定時(shí)管理器;
啟動(dòng)傳感服務(wù);
啟動(dòng)窗口管理器;
啟動(dòng)藍(lán)牙服務(wù);
啟動(dòng)掛載服務(wù)。
其他服務(wù):
啟動(dòng)狀態(tài)欄服務(wù);
啟動(dòng)硬件服務(wù);
啟動(dòng)網(wǎng)絡(luò)狀態(tài)服務(wù);
啟動(dòng)網(wǎng)絡(luò)連接服務(wù);
啟動(dòng)通知管理器;
啟動(dòng)設(shè)備存儲(chǔ)監(jiān)視服務(wù);
啟動(dòng)定位管理器;
啟動(dòng)搜索服務(wù);
啟動(dòng)剪切板服務(wù);
啟動(dòng)登記服務(wù);
啟動(dòng)壁紙服務(wù);
啟動(dòng)音頻服務(wù);
啟動(dòng)耳機(jī)監(jiān)聽;
啟動(dòng)AdbSettingsObserver(處理adb命令)。
第七步:引導(dǎo)完成
一旦系統(tǒng)服務(wù)在內(nèi)存中跑起來了,Android就完成了引導(dǎo)過程。在這個(gè)時(shí)候“ACTION_BOOT_COMPLETED”開機(jī)啟動(dòng)廣播就會(huì)發(fā)出去。
當(dāng)前文章:android.rc,androidrc文件
分享地址:http://chinadenli.net/article15/dsegsdi.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、搜索引擎優(yōu)化、企業(yè)建站、靜態(tài)網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)