编译android源码 太慢,记编译Android源码的经历

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

由于之前的渣本试过一次裸ubuntu编译Android源码,一次则用虚拟机。过程中参考了官网/网络博客的教程,失败了好几次,也成功了两次。上一次买了个稍微好一点的笔记本,也裸ubuntu编译过一次7.0的源码,后面因为其他工作的需求,暂且换成window系统,再一次重新折腾编译源码。整理下之前的笔记及参考资料,写下记录供需要者参考,减少踩坑。

题外话:把之前在ubuntu编译的源码拉到windowAS阅读,虽然能够根据方法栈不断深入查看方法调用的逻辑,但是无法调试且难以修改原生应用。所以强烈建议在ubuntu上折腾,把整个过程弄得够熟悉就行了,也对整个Android系统有个大致的了解。编译环境选择Ubuntu我的电脑 Window 64bit,8G内存,256固态硬盘

Git安装1

2

3$ sudo apt-get install git

$ gitconfig--global user.email

$ gitconfig--global user.name "yummyLau"

下载源码选择源码分支,这里我选择android-6.0.1_r66分支作为下载版本目标。1

2

3

4mkdir ~/bin

PATH=~/bin:$PATH

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

chmod a+x ~/bin/repo弃用官方下载源码方法,改用清华大学开源软件镜像

这里我选择传统的初始化方法下载源码,创建存放源码的source目录,取名自定。1

2

3

4mkdir source

$cd source

$touch auto_asyn_source.sh

$chmod +x auto_asyn_source.sh

新建auto_asyn_source.sh是用来保证执行repo编译环境选择

sync命令同步代码如果失败,则可以自动重试,参考的是自己动手编译最新Android源码及SDK一文的做法,感谢该博主。

写入shell脚本自动同步内容:1$vim auto_asyn_source.sh

把下面的代码复制进去并保存1

2

3

4

5

6

7

8PATH=~/bin:$PATH

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-6.0.1_r66

repo sync

while [$? = 1]: do

echo "=========download failed,again============"

sleep 5

repo sync

done

其中android-6.0.1_r66是我选择下载的源码分支,可替换成其他。然后添加修改Repo的url1

2$cd ~/

$vim .bashrc

把下面的链接添加进入并保存1REPO_URL = 'https://gerrit-google.tuna.tsinghua.edu.cn/git-repo'

最后,跑一下脚本下载,静心等待呗…1

2$cd source

$./auto_asyn_source.sh

Tip:过程中我的虚拟机比较卡,可能会出现卡死的现象=。=,只需要Ctrl+C结束之后重新执行脚本就行了。

由于上班折腾下很久才下载完,和下载环境的网络有关,下载完成后大概有58G大小。1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28[email protected]:~/source$ du -h --max-depth=1

53M./libcore

11M./dalvik

124M./device

128K./abi

112M./hardware

31M./system

16M./build

27G./out//编译后生成的

308M./development

84M./ndk

1.5G./frameworks

30M./docs

44G./.repo

948K./platform_testing

686M./tools

2.6G./external

278M./developers

6.5G./prebuilts

408M./packages

900K./pdk

31M./sdk

498M./cts

29M./bionic

29M./art

5.7M./bootable

232K./libnativehelper

83G.

选择编译目标

使用lunch选择要编译的目标。根据官网教程。该命令表示针对模拟器进行完整编译,并且所有调试功能均处于启用状态。 如果没有提供任何参数就运行命令,lunch将提示您从菜单中选择一个目标,所有编译目标都采用BUILD-BUILDTYPE形式。

这里,我输入以下指令选择编译目标。1$lunch aosp_arm-eng

解释下上述名下的参数,aosp_arm-eng即BUILD-BUILDTYPE形式,分为BUILD和BUILDTYPE两部分。BUILD为特定功能的组合代号,如aosp_arm为支持32位ARM架构,也有64位ARM架构,X86也有。关于CPUARM和X86架构,可以看下这篇分不清ARM和X86架构,别跟我说你懂CPU!科普文。

BUILDTYPE为编译类型,主要用于指定系统权限,有以下三种:user,权限受限,适用于生产环境;

userdebug,与“user”类似,但具有 root 权限和可调试性;是进行调试时的首选编译类型;

eng,具有额外调试工具的开发配置。

这里我选择aosp_arm-eng作为编译目标进行编译。

开始编译

官方使用make来编译任何代码。Make可以借助 -jN 参数处理并行任务,通常使用的任务数 N 介于编译时所用计算机上硬件线程数的 1-2 倍之间。由于我用的是虚拟机,主机是司核四线程,虽然我Ubuntu虚拟机分配了2个处理器,每个处理器核数为2。一开始我用make -j4编译,可卡死我了,不小心点击了清理内存和高CPU程序,把我虚拟机直接杀了,后面直接使用make编译,大家随自己设备决定即可。

window平台下可在运行中输入wmic,在新窗口中输入cpu get即可查看物理CPU数、CPU核心数、线程数。Name:表示物理CPU数

NumberOfCores:表示CPU核心数

NumberOfLogicalProcessors:表示CPU线程数

运行make使用单线程编译。1$make

慢悠悠看了几集冰与火之歌,大概编译了4个多小时,就搞定了,编译后的产物有out目录中。1

2

3

4yummylau@ubuntu:~/source/out$du -h --max-depth=1

8.5G./host

18G./target

27G.

其中各个目录的内容为:

/out/host/:该目录下包含了针对主机的 Android 开发工具的产物。即 SDK 中的各种工具,例如:emulator,adb,aapt 等。

/out/target/common/:该目录下包含了针对设备的共通的编译产物,主要是 Java 应用代码和 Java 库。

/out/target/product//:包含了针对特定设备的编译结果以及平台相关的 C/C++ 库和二进制文件。其中,是具体目标设备的名称,产物如下图。1

2

3

4

5

6

7

8

9

10yummylau@ubuntu:~/source/out/target/product$cd generic/

yummylau@ubuntu:~/source/out/target/product/generic$ls

android-info.txt hardware-qemu.ini symbols

cache installed-files.txt system

cache.img obj system.img

clean_steps.mk previous_build_config.mk userdata.img

data ramdisk.img userdata-qemu.img

dex_bootjars recovery

gen root

yummylau@ubuntu:~/source/out/target/product/generic$

注意下,上述有三个核心的镜像文件:system.img,ramdisk.img和userdata.img。

system.img:包含了 Android OS 的系统文件,库,可执行文件以及预置的应用程序,将被挂载为根分区。

ramdisk.img:在启动时将被 Linux 内核挂载为只读分区,它包含了 /init 文件和一些配置文件。它用来挂载其他系统镜像并启动 init 进程。

userdata.img:将被挂载为 /data,包含了应用程序相关的数据以及和用户相关的数据。

关于如何理解Android的Build系统,推荐阅读IBM-理解 Android Build 系统。

运行编译系统

在源码个目录重新执行1

2

3[email protected]:~/source$ source build/envsetup.sh

[email protected]:~/source$ lunch aosp_arm-eng

[email protected]:~/source$ emulator

在之前的编译流程会自动将模拟器添加到您的路径中,emulator加载的内核所在的目录为1

2

3yummylau@ubuntu:~/source/prebuilts/qemu-kernel/arm$ls

2.6 kernel-qemu-armv7 README vmlinux-qemu

kernel-qemu LINUX_KERNEL_COPYING rebuild.sh vmlinux-qemu-armv7

其中,kernel-qemu为加载的内核。

同时在~/source/out/target/product/generic中生成的system.img,ramdisk.img和userdata.img也被载入了。

最后,我们就静静地等待系统启动吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值