原创内容,转载请注明出处,多谢配合。
这里简单说下如何玩Android系统代码。
一、rom的下载、编译和刷机
1)rom下载与编译
对应的环境和工具就不提了,网上一搜一大把。
repo init 地址 拉下.repo
repo sync -c - -no-tags 同步
source ./build/envsetup.sh 在当前bash环境下读取并执行build/envsetup.sh脚本中的命令。
lunch 选择对应的包
make -jn 编译
rom局部编译
系统开发就是编译费劲,但是也不用每次都全编,因为一次全编多则几小时,少则也要半小时,如果是改局部模块可以只编译局部就好了:
比如:
Frameowork编的比较多的:
frameworks/base/services mm可以单独编 对应service.jar push到system/framwork。
虚拟机:
make libart 生成libart.so push到system/lib
make install 生成installd push到system/bin
等等不一一例举。
2)rom刷机
编译好的内容在工程out目录下
fastboot flash boot system userdata vendor 常见的就是刷这几个,如果机器没全image,那还是按脚本来刷一次全的, 包括dtbo、 vbmeta等好多image。
各image介绍:
boot.img: 主要包括kernel。
system.img:包括了主要的包、库等文件。
userdata.img:包括了一些用户数据,刷了之后用户数据和安装的应用全部丢失,还原成出场设置。
vendor.img :带有品牌标识和驱动的包,与芯片厂商相关:比如qcom ,mtk等。谷歌要把系统和驱动分开,方便之后升级系统。
二、版本控制:
这里简单例举下最常用的一些命令。
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【当前修改的提交的前一个】
做修改
git add .
git commit —amend
git rebase —continue
没有问题可以 - - skip
退出rebase - - abort -
暂存
:可用来暂存当前正在进行的工作, 比如想pull 最新代码, 又不想加新commit, 或者另外一种情况,为了fix 一个紧急的bug, 先stash, 使返回到自己上一个commit, 改完bug之后再stash pop, 继续原来的工作。
git stash
do some work
git stash pop -
patch移植
:将本地修改的change保留成文件,可以应用于跨工程的patch移植。
git am使用:将本地修改的change保留成文件,可以应用于跨工程的patch移植
git am —keep-non-patch *.patch one by one地应用分支
如果有冲突:
$git apply —reject patch名
生成.rej文件,是描述冲突的问题,按它的提示把对应文件的冲突解掉
解完冲突删掉.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 -
权限
:chmod、chown、chgrp、root、disable-verity、remount -
进程
:ps -A 、kill -
查询
: 全局搜某个字符串 grep -r "XXXX" ./* 全局搜某个文件 find -name XXX -
dumpsys相关
window、activity、meminfo、package等等,查看对应的系统log信息。
三、Android系统模块了解
1)基本概念
一个android项目包括许多的模块,所有项目模块通过repo中的manifest.xml统一管理,repo init的时候会拉下来一个.repo里面就有它,之后repo sync的工程内容就是manifest.xml对应的模块。这里还牵扯到共线与共分支的问题,共线就是芯片相关平台基线,共分支就是模块各自的版本控制。这里不细说,做过系统的自然懂,玩aosp的不用懂。
2)核心模块
- build/soong 和 build/make 主要是跟编译规则相关的,大部分都是一些mk配置,来决定系统按什么顺序来串联和编译。他俩适配好了,基本上就可以lunch了。
- system/core/ 包括不少系统核心工具,这部分可以单独编译boot image。
- frameworks/base/ 这里是系统framework部分,包括java和native,编译后会生成两个核心文件:framework.jar和services.jar
- art/ 虚拟机内容
- packages/apps 系统app
- out/target/product/ 编译生成的文件存在这目录下
3).mk、.dp文件
makeFile是一份定义了源文件间依赖关系、如何编译各个源文件并生成可执行文件的说明书,决定整个工程的编译规则,实现自动化编译。android P版本开始陆续用dp取代mk。
我这里就是记了个简单的流水账,了解上面这些之后,基本上就能比较顺利的开始玩Android系统源码了。
网友评论