目录
1. 安装 Repo
2. 下载Android源码
3. 编译前的支持库安装
4. 编译AOSP
10. F&Q
10.1 repo: error: "git" failed with exit status 128
10.2 fatal: cannot create directory at 'pathtools/testdata/escapes/**': Invalid argument
参考:
理解 Android Build 系统 # https://developer.ibm.com/zh/articles/os-cn-android-build/
理解Android编译命令 # http://gityuan.com/2016/03/19/android-build/
[安卓文档]Android 开发设置 # https://source.android.com/setup
[安卓文档]搭建编译环境 # https://source.android.com/source/initializing.html
[安卓文档]下载源代码 # https://source.android.com/source/downloading
[安卓文档]编译 Android # https://source.android.com/setup/build/building
[安卓文档]开发 # https://source.android.com/source/developing
使用Android Studio调试Android Framework代码 # https://blog.csdn.net/industriously/article/details/50548474
用Android Studio 导入整个android 源码,调试系统代码 # https://blog.csdn.net/aaa111/article/details/43227367
Repo 是一款工具,可让您在 Android 环境中更轻松地使用 Git。要安装 Repo,请执行以下操作:
1.1 确保主目录下有一个 bin/ 目录,并且该目录包含在路径中:
$ mkdir ~/bin
$ PATH=~/bin:$PATH
1.2 下载 Repo 工具,并修改执行权限确保它可执行(注:国内访问第一步网址可能需要那个,可用链接: https://pan.baidu.com/s/1bpLwXCb 密码: hjsp (下载放到~/bin底下)):
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
1.3 (按需配置)使用您的真实姓名和电子邮件地址配置 Git。要使用 Gerrit 代码审核工具,您需要一个与已注册的 Google 帐号关联的电子邮件地址。确保这是您可以接收邮件的有效地址。您在此处提供的姓名将显示在您提交的代码的提供方信息中。
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
要详细了解 Repo,可参阅:
[需那个]开发 # https://source.android.com/source/developing
[需那个]Repo 命令参考资料 # https://source.android.com/source/using-repo.html
2.1 寻找 repo init
指令
从官网或者各种私有库中获取到安卓系统源码的repo地址,在此之前,您可能需要使用 Gerret 并获取相应 Gerret 仓库的访问权限。(重要,但略)
比如Android源码的 rope init 指令Gerret仓库地址为:
repo init -u https://android.googlesource.com/platform/manifest (Master分支)
repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1 ( -b 指令指定分支,要查看分支列表,请参阅源代码标记和版本。)
2.2 创建一个空目录来存放您的工作文件。为其指定一个您喜欢的任意名称:
$ mkdir AOSP # [AOSP]为自定义目录名称,只要符合操作系统命名规则即可
$ cd AOSP
2.3 执行repo init指令初始化repo
在2.2步骤中的新建的工作目录中运行 repo init
以获取最新版本的 Repo 及其最近的所有错误更正内容。
$ repo init -u https://android.googlesource.com/platform/manifest # 主分支
或
$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1 # -b 参数指定分支
初始化成功后,系统将显示一条消息,告诉您 Repo 已在工作目录中完成初始化。客户端目录中现在应包含一个 .repo
目录,清单等文件将保存在该目录下。
2.4 下载指定的Android系统源代码树
$ repo sync # 默认线程数同步源码
或
$ repo sync -j8 # 使用多线程同步源码,j(ob)数字可设置为:CPU核心数 * 2
Android 源代码文件将位于工作目录中对应的项目名称下。初始同步操作将需要 n 个小时或更长时间才能完成。此时十分建议出去吃个饭。
3.1 安装JDK(已安装JDK的可以跳过本步骤)
需要注意不同Android版本是需要不同的JDK版本, Android K之前的是JDK 1.6, L, M是JDK 1.7, N是JDK 1.8。以JDK1.8为例:
$ sudo apt-get update
$ sudo apt-get install openjdk-8-jdk
$ java -version # 安装完成后可执行此命令验证是否安装成功并验证版本
3.2 安装支持库(以Ubuntu 14.04为例)
$ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
要详细了解编译环境的搭建,可参考:
[需那个]搭建编译环境-安装JDK # https://source.android.com/source/initializing.html#installing-the-jdk
4.1 切换到刚才repo sync的根目录($ cd ~/AOSP)
4.2 设置环境【每次打开Terminal终端时均需执行】
envsetup.sh
脚本会导入若干命令,让您能够使用 Android 源代码。使用 envsetup.sh
脚本初始化环境:
$ source build/envsetup.sh
或
$ . build/envsetup.sh
4.3 选择目标【每次打开Terminal终端时均需执行】
4.3.1 使用 lunch
选择要构建的目标
lunch
-
会选择 product_name 作为需要构建的产品,并选择 build_variant 作为需要构建的变体,然后将这些选择存储在环境中,以便供后续对 m
和其他类似命令的调用读取。确切的配置可作为参数进行传递。
$ lunch # 比如:$ lunch aosp_arm-eng // 例子中的命令表示针对模拟器进行完整构建,并且启用所有调试功能。
或
$ lunch // (会出现一个数字选择列表可以进一步选择)
> (然后根据列表选择具体的产品)
所有构建目标都采用 BUILD-BUILDTYPE
形式,其中 BUILD
是表示特定功能组合的代号。BUILDTYPE
是以下类型之一:
构建类型 | 使用情况 |
---|---|
user | (release版本)权限受限;适用于生产环境 |
userdebug | (可root的release版本)与“user”类似,但具有 root 权限和调试功能;是进行调试时的首选编译类型 |
eng | (debug版本)具有额外调试工具的开发配置 |
userdebug build 的运行方式应该与 user build 一样,且能够启用通常不符合平台安全模型的额外调试功能。这就使得 userdebug 版本具有更强大的诊断功能,因此是进行 user 测试的最佳选择。使用 userdebug 编译系统进行开发时,请遵循 userdebug 指南。
eng 编译系统会优先考虑在平台上工作的工程师的工程生产率。eng 编译系统会关闭用于提供良好用户体验的各种优化。除此之外,eng build 的运行方式类似于 user 和 userdebug build,以便设备开发者能够看到代码在这些环境下的运行方式。
4.3.2 选择语言版本
$ deploy // 会出现数字选择列表, 可以选国内版或国际版
> (然后选择版本)
4.4 拉取解耦APP【跳过】
$ python ****/manifest/sync_tool.py
4.4.1 安装python2 和 maven
maven可以在这里下载 http://maven.apache.org/download.cgi 在~/.bashrc 裡面加上以下兩行
# set maven environment
export M2_HOME=/home/Hadoop/apache-maven-3.2.3
export PATH=$M2_HOME/bin:$PATH
4.4.2 设置大一点的目录给解耦APP
# you can use export MAVEN_LOCAL_REPOSITORY=/home/work/decoupled_apps_maven_repo to change the cache position
4.5 编译构建
开始编译,全量编译的时间大约1~2小时
可以使用 -jN
参数处理并行任务。如果您没有提供 -j
参数,构建系统会自动选择您认为最适合您系统的并行任务计数。
$ make -j4 // -j(ob)4中的数字4代表工作线程数,一般为CPU核心数 * 2
或
$ m
也可以通过在 m
命令行中列出相应名称来构建特定模块,而不是构建完整的设备映像,这样只编译与你开发相关的特定模块会节约时间和硬盘。比如只编译设置模块:
$ make Settings -j4 # 只编译 Settings 模块
参考:理解Android编译命令 # http://gityuan.com/2016/03/19/android-build/
4.6 编译成功
编译过程中可能会遇到问题,直到编译成功:
#### build completed successfully (100:15 (mm:ss)) ####
编译成功似乎也不太容易。
编译结果输出目录在源码根目录下的 /out/ 目录
5. 将自己编译的Image刷到手机上
6.1 下载ROM
举例,以刷MIUI为例,可从这个网站下载线刷包:https://www.miui.com/shuaji-393.html
6.2 解压缩tgz压缩包
6.3 在手机的【开发者选项】中,打开【USB调试】,之后手机连接PC
6.4 进入Fastboot模式
$ adb reboot bootloader
6.5 确认fastboot权限是否通过
$ sudo fastboot -l devices
如果有如下样式,说明权限够用
6.6 cd进入到6.2的tgz解压缩之后的目录,修改其中的flash_all.sh执行权限
$ chmod a+x flash_all.sh
6.7 开始刷机
$ sudo ./flash_all.sh
之后静静等待即可。
附1:关于解压后的刷机包中的刷机指令:
命令 | 系统 | 刷文件 | 用户数据 | 内置存储数据 | 备注 |
flash_all.sh | Linux | 刷所有文件 | 清除 | 清除 | |
flash_all_except_data_storage.sh | Linux | 刷升级文件 | 保留 | 保留 | |
flash_all_except_storage.sh | Linux | 刷升级文件 | 清除 | 保留 | 最常用的 |
flash_all.bat | Windows | 刷所有文件 | 清除 | 清除 | |
flash_all_except_data_storage.bat | Windows | 刷升级文件 | 保留 | 保留 | |
flash_all_except_storage.bat | Windows | 刷升级文件 | 清除 | 保留 | 最常用的 |
附2:Windows下的刷机参考:https://www.miui.com/shuaji-393.html
下载源码过程中报错:
repo: error: "git" failed with exit status 128
原因与方案:
后来发现是凭据错误。验证密码时输错密码了。
下载源码时报错:
Fetching projects: 99% (1390/1394) Fetching project alps/device/***/k**_64_32_bsp
Fetching projects: 100% (1394/1394), done.
error: unable to create file pathtools/testdata/escapes/*: Invalid argument(无效的参数)
fatal: cannot create directory at 'pathtools/testdata/escapes/**': Invalid argument(无效的参数)
Traceback (most recent call last):
File "/media/***/Android/.repo/repo/main.py", line 531, in
_Main(sys.argv[1:])
File "/media/***/Android/.repo/repo/main.py", line 507, in _Main
result = repo._Run(argv) or 0
File "/media/***/Android/.repo/repo/main.py", line 180, in _Run
result = cmd.Execute(copts, cargs)
File "/media/***/Android/.repo/repo/subcmds/sync.py", line 824, in Execute
project.Sync_LocalHalf(syncbuf, force_sync=opt.force_sync)
File "/media/***/Android/.repo/repo/project.py", line 1327, in Sync_LocalHalf
self._InitWorkTree(force_sync=force_sync)
File "/media/***/Android/.repo/repo/project.py", line 2486, in _InitWorkTree
raise GitError("cannot initialize work tree")
error.GitError: cannot initialize work tree
相似的报错还包括类似:
error: unable to create file frontend/**/src/**/Open+Sans:300.woff: Invalid argument(无效的参数)
error: unable to create symlink testsuite/******/drivers/usb:btusb: Invalid argument(无效的参数)
fatal: cannot create directory at 'aux': Invalid argument(无效的参数)
error: unable to create file tests/***/str\\escape.rs: Invalid argument(无效的参数)
error: unable to create file drivers/******/i*c/aux.h: Invalid argument(无效的参数)
error: unable to create file **/src/***/java/lang/test?.properties: Invalid argument(无效的参数)
fatal: cannot create directory at 'apps/**List/cta/*': Invalid argument(无效的参数)
fatal: cannot create directory at 'normal****/com.google.***.nbu.': Invalid argument(无效的参数)
error: unable to create file q?:q: Invalid argument(无效的参数)
fatal: cannot create directory at 'include/aux': Invalid argument(无效的参数)
问题分析:
这很有可能是跨操作系统(Windows/Linux)时由于文件系统的对文件名称的命名规则不同造成的。
方案一:(该方案未解决我的问题)
参考:
repo sync error: cannot initialize work tree # https://blog.csdn.net/ly890700/article/details/54848373
repo sync error: cannot initialize work tree # https://www.jianshu.com/p/283a209a0a87
先使用如下命令,将repo的所有动作详细输出,等待报错出现
$ repo --trace sync -cdf
等出现报错信息之后,将报错文件夹删除,在manifest中查找这个路径对应的project是
于是,在.repo/projects下删除.repo/projects/***/***/ABC.git目录,以及
.repo/project-objects/***/***/ABC.git目录
之后重新同步下载即可
$ repo sync
方案二:(可以实现跳过有命名问题的文件或文件夹,先下载其他的部分。不过并不能从根本上解决问题,因为如果下一步的编译用不到这些奇怪的文件还好,如果因为这些未被下载的文件的缘故儿造成编译失败,则还是绕不过这一步。)
参考:https://superuser.com/questions/1462485/cant-download-android-source-with-repo-cannot-initialize-work-tree-for-platfo
进入到
$ repo sync --force-sync build/blueprint
如果在多个目录都遇到这个问题,可以尝试:
$ for subprj in $(repo status | grep ^project | cut -d ' ' -f2);
> do
> repo sync --force-sync $subprj;
> done
方案三:(如果维护远程库的代码是你的同事,那么这也算是一种可行的方案吧。如果你要从你不认识的地方下载代码,就比如本文要下载Android的源码,那么本方法也没啥卵用)
参考:https://blog.csdn.net/chinassj/article/details/82661884
问题:fatal: cannot create directoryxxxx': Invalid argument
环境:git 拉取远程仓库的代码后
原因:同事是mac,这个文件夹命名规则在苹果上没有问题,但是在windows上,不能通过git创建这个文件夹.
解决方法:让同事,重新命名使其适用mac,win,linux.
方案四:(小众情况,然鹅被遇到了)
可能由于装的是Windows/Ubuntu双系统,或者在Ubuntu 中使用了 NTFS 的格式的硬盘来存储下载的数据。这种情况下,由于Windows系统下的NTFS文件格式不允许文件夹命名中出现“: / ? * aux ...”等字符。所以导致从远程代码库中下载的该文件不会被创建。
解决办法:格式化磁盘 成 Linux系统 的 ext4 文件系统格式。【应用——磁盘——选中目标磁盘——其他分区选项(小齿轮)——格式化分区——类型选择“Linux(Ext4)”字样】