如何玩Android系統(tǒng)源碼

原創(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 checkout

  • rebase:回溯(修改或刪除)之前的提交
    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 pop

  • patch移植:將本地修改的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)源碼了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

友情鏈接更多精彩內(nèi)容