原創(chuàng)內(nèi)容,轉(zhuǎn)載請(qǐng)注明出處,多謝配合。
這里簡(jiǎn)單說(shuō)下如何玩Android系統(tǒng)代碼。
一、rom的下載、編譯和刷機(jī)
1)rom下載與編譯
對(duì)應(yīng)的環(huán)境和工具就不提了,網(wǎng)上一搜一大把。
repo init 地址 拉下.repo
repo sync -c - -no-tags 同步
source ./build/envsetup.sh 在當(dāng)前bash環(huán)境下讀取并執(zhí)行build/envsetup.sh腳本中的命令。
lunch 選擇對(duì)應(yīng)的包
make -jn 編譯
rom局部編譯
系統(tǒng)開(kāi)發(fā)就是編譯費(fèi)勁,但是也不用每次都全編,因?yàn)橐淮稳幎鄤t幾小時(shí),少則也要半小時(shí),如果是改局部模塊可以只編譯局部就好了:
比如:
Frameowork編的比較多的:
frameworks/base/services mm可以單獨(dú)編 對(duì)應(yīng)service.jar push到system/framwork。
虛擬機(jī):
make libart 生成libart.so push到system/lib
make install 生成installd push到system/bin
等等不一一例舉。
2)rom刷機(jī)
編譯好的內(nèi)容在工程out目錄下
fastboot flash boot system userdata vendor 常見(jiàn)的就是刷這幾個(gè),如果機(jī)器沒(méi)全image,那還是按腳本來(lái)刷一次全的, 包括dtbo、 vbmeta等好多image。
各image介紹:
boot.img: 主要包括kernel。
system.img:包括了主要的包、庫(kù)等文件。
userdata.img:包括了一些用戶數(shù)據(jù),刷了之后用戶數(shù)據(jù)和安裝的應(yīng)用全部丟失,還原成出場(chǎng)設(shè)置。
vendor.img :帶有品牌標(biāo)識(shí)和驅(qū)動(dòng)的包,與芯片廠商相關(guān):比如qcom ,mtk等。谷歌要把系統(tǒng)和驅(qū)動(dòng)分開(kāi),方便之后升級(jí)系統(tǒng)。
二、版本控制:
這里簡(jiǎn)單例舉下最常用的一些命令。
1)git 命令:
基本命令:
git init、git clone、git remote 、git show、git blame 、git status、git branch、git log、git diff、git cherry-pick、git revert分支管理:
git add、git commit -s /-m /—amend 、git pull 、git push 、git merge、git reset (- - hard HEAD^) 、git checkoutrebase:回溯(修改或刪除)之前的提交
git rebase
git rebase git rebase -i【當(dāng)前修改的提交的前一個(gè)】
做修改
git add .
git commit —amend
git rebase —continue
沒(méi)有問(wèn)題可以 - - skip
退出rebase - - abort暫存:可用來(lái)暫存當(dāng)前正在進(jìn)行的工作, 比如想pull 最新代碼, 又不想加新commit, 或者另外一種情況,為了fix 一個(gè)緊急的bug, 先stash, 使返回到自己上一個(gè)commit, 改完bug之后再stash pop, 繼續(xù)原來(lái)的工作。
git stash
do some work
git stash poppatch移植:將本地修改的change保留成文件,可以應(yīng)用于跨工程的patch移植。
git am使用:將本地修改的change保留成文件,可以應(yīng)用于跨工程的patch移植
git am —keep-non-patch *.patch one by one地應(yīng)用分支
如果有沖突:
$git apply —reject patch名
生成.rej文件,是描述沖突的問(wèn)題,按它的提示把對(duì)應(yīng)文件的沖突解掉
解完沖突刪掉.rej文件,然后git add 修改文件
最后:git am --resolved
2)repo命令
repo init 、repo sync 、repo start 、repo upload
3)adb 命令:
-
基本操作:cd、pwd、ls、vim、cat、reboot -
文件:mkdir、touch 、cp、rm、mv、push、pull -
權(quán)限:chmod、chown、chgrp、root、disable-verity、remount -
進(jìn)程:ps -A 、kill -
查詢: 全局搜某個(gè)字符串 grep -r "XXXX" ./* 全局搜某個(gè)文件 find -name XXX -
dumpsys相關(guān)window、activity、meminfo、package等等,查看對(duì)應(yīng)的系統(tǒng)log信息。
三、Android系統(tǒng)模塊了解
1)基本概念
一個(gè)android項(xiàng)目包括許多的模塊,所有項(xiàng)目模塊通過(guò)repo中的manifest.xml統(tǒng)一管理,repo init的時(shí)候會(huì)拉下來(lái)一個(gè).repo里面就有它,之后repo sync的工程內(nèi)容就是manifest.xml對(duì)應(yīng)的模塊。這里還牽扯到共線與共分支的問(wèn)題,共線就是芯片相關(guān)平臺(tái)基線,共分支就是模塊各自的版本控制。這里不細(xì)說(shuō),做過(guò)系統(tǒng)的自然懂,玩aosp的不用懂。
2)核心模塊
- build/soong 和 build/make 主要是跟編譯規(guī)則相關(guān)的,大部分都是一些mk配置,來(lái)決定系統(tǒng)按什么順序來(lái)串聯(lián)和編譯。他倆適配好了,基本上就可以lunch了。
- system/core/ 包括不少系統(tǒng)核心工具,這部分可以單獨(dú)編譯boot image。
- frameworks/base/ 這里是系統(tǒng)framework部分,包括java和native,編譯后會(huì)生成兩個(gè)核心文件:framework.jar和services.jar
- art/ 虛擬機(jī)內(nèi)容
- packages/apps 系統(tǒng)app
- out/target/product/ 編譯生成的文件存在這目錄下
3).mk、.dp文件
makeFile是一份定義了源文件間依賴關(guān)系、如何編譯各個(gè)源文件并生成可執(zhí)行文件的說(shuō)明書,決定整個(gè)工程的編譯規(guī)則,實(shí)現(xiàn)自動(dòng)化編譯。android P版本開(kāi)始陸續(xù)用dp取代mk。
我這里就是記了個(gè)簡(jiǎn)單的流水賬,了解上面這些之后,基本上就能比較順利的開(kāi)始玩Android系統(tǒng)源碼了。