【AOSP-编译】Ubuntu环境下编译Android源码

目录

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

 

1. 安装 Repo

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. 下载Android源码

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. 编译前的支持库安装

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. 编译AOSP

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. 普通刷机-Linux

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

 

 

10. F&Q

10.1 repo: error: "git" failed with exit status 128

下载源码过程中报错:

repo: error: "git" failed with exit status 128

 原因与方案:

后来发现是凭据错误。验证密码时输错密码了。

 

10.2 fatal: cannot create directory at 'pathtools/testdata/escapes/**': Invalid argument

下载源码时报错:

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

进入到编译根目录(也就是像 bionic/, development/, device/, 等等文件夹所在的目录)然后尝试:

$ 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)”字样】

你可能感兴趣的:(Linux,AOSP,aosp,android,ubuntu,编译源码)