友情提示
因为Android系统源码过于庞大, 编译源码又需要在linux环境中, 所以整个过程会很耗时, 而且即使你参照大神的文章在实际操作过程中也很可能会出现各种各样的问题, 只能根据实际情况逐一排查, 所以如果你也想下载编译调试源码, 请做好心理准备, 尤其是没有linux系统操作经验的人.
如果只是想阅读源码, 除了下载源码外, 在这里推荐个在线阅读源码地址:
https://www.androidos.net.cn/sourcecode
下面开始进入正题, 为了说明详细一些, 尽量在每个命令上面一行标注命令的含义. 另外, 不保证参照此文章就一定没有其他问题, 如果有,请逐一排查.
一 : 源码下载
-
下载repo工具(用于管理Android源代码的Python脚本)
在正式下载repo工具之前, 需要下载用到的工具, 如果已经安装请略过
安装git:
sudo apt-get install git
安装curl库:
sudo apt-get install curl
安装python:
sudo apt-get install python
下载repo工具:
在根目录(home)下创建bin目录
mkdir ~/bin
将bin目录加入系统路径中
PATH=~/bin:$PATH
利用curl来将下载的repo保存到相应目录下
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
为/bin/repo增加执行权限
chmod a+x ~/bin/repo
- 下载源码
最新源码下载地址:
https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar
将下载后的aosp-latest.tar放在单独的一个文件夹中,终端cd到文件夹中进行解压
解压命令:
tar -xvf aosp-latest.tar
然后终端cd到解压的文件夹 ,
开始同步源码:
repo sync
**注意: 当第一次repo sync 成功后建议再repo sync 几次, 确保同步完全, 不然在之后的步骤中会有各种错误
至此, 源码下载完成
二 : 整编源码
- 先安装jdk, 版本要和下载的源码版本对应
这里因为下载的是Android9.0源码, 所以安装的是jdk8
sudo apt-get update
sudo apt-get install openjdk-8-jdk
- 安装编译源码所需要的软件包
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install git-core gnupg flex bison gperf
sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib
sudo apt-get install libc6-dev-i386
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev
sudo apt-get install lib32z-dev ccache
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install libssl-dev
sudo apt-get install aptitude
- 初始化编译环境
source build/envsetup.sh
如果编译失败, 改完错之后要重新编译, 所以删除掉之前编译产生的文件, 第一次编译时可以不执行这个命令
make clobber
- 选择编译的目标模拟器
lunch
执行完这条命令后, 会出现可选择的模拟器列表, 这里选择的是aosp_x86-eng, 所在的编号是19, 然后在终端输入序号
- 开始编译
这里可以根据自己的电脑配置进行更改make命令, 如果只是make命令就是单线程编译, 如果是make -j4就是4条线程进行编译
make
- 遇到的错误
如果在编译的过程中, 出现内存不够导致的编译失败, 要看具体原因, 这里遇到了这个问题:
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000b0600000, 534773760, 0) failed; error='Not enough space' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 534773760 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /home/zgy/study/android_source_code/aosp/hs_err_pid8492.log
[ 97% 78894/80651] //frameworks/base:hiddenapi-lists-docs Metalava
每次编译到了97%就挂了, 有的时候还卡死机, 查找资料, 说是交换区空间不足导致, 于是,增加swap空间:
先查看现在的swap空间
free -h
开始增加swap空间, 这里增加了8个G
dd if=/dev/zero of=/home/swap bs=1G count=8
把这个分区变成swap分区.
/sbin/mkswap /home/swap
使其成为有效状态
/sbin/swapon /home/swap
最后再查看一下swap空间, 确保增加空间成功
free -h
之后编译成功通过
### build completed successfully (04:59:30(hh:mm:ss)) ###
- 运行模拟器
此时可以直接在终端中执行:
emulator
如果终端已经关闭了,可以重新打开,按顺序执行以下命令(在之后的每次打开模拟器都要如此)
source build/envsetup.sh
输入目标编译的模拟器在模拟器列表中的序号, 或者名称
lunch 19
emulator
三 : 导入到studio中并调试
- 生成配置文件
如果想导入到studio中,需要配置文件, 先查看源码目录下out/host/linux-x86/framework/idegen.jar是否存在,如果不存在, 进入源码根目录执行如下的命令进行编译
source build/envsetup.sh
lunch
mmm development/tools/idegen/
这里在执行最后一行编译idegen时报错如下:
build/make/core/main.mk:766: error: CtsMediaStressTestCases.LOCAL_HOST_REQUIRED_MODULES : illegal value cts-dynamic-config :
not a host module. If you want to specify target modules to be required to be installed along with your
target module, add those module names to LOCAL_REQUIRED_MODULES instead.
15:54:44 ckati failed with: exit status 1
查找资料, 解决办法如下:
最后一行把mmm改为mmma, 即
mmma development/tools/idegen/
完成以上步骤后, 如果成功, 会在源码目录下out/host/linux-x86/framework目录下看到idegen.jar
继续执行命令
sudo development/tools/idegen/idegen.sh
成功会在源码根目录中看到android.iml 和 android.ipr两个文件, 其中android.ipr就是我们要用studio导入的文件.因为源码太庞大, 导入会占用大量内存, 所以先设置studio的内存
在home目录下面找到.AndroidStudio文件夹(隐藏文件Ctrl + h显示), 打开config/studio64.vmoptions文件,:
-Xms256m
-Xmx2196m (对其进行修改即可, 大小根据自己电脑配置进行修改, 我电脑8G内存)
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djna.nosys=true
-Djna.boot.library.path=
-da
-Dawt.useSystemAAFontSettings=lcd
-Dsun.java2d.renderer=sun.java2d.marlin.MarlinRenderingEngine
此时, 就可以打开studio通过Open an existing Android Studio project选择android.ipr来导入源码了, 导入的过程有些漫长, 耐心等待
- 调试
导入完成后先配置SDK和JDK, 确保Android源码使用的Java就是Android源码中的。具体过程这里先不写了,结尾会有其他参考文章链接, 如果以上的步骤没有问题, 剩余的步骤按部就班照着操作即可.
因为整个过程细节繁多, 本文写的不是详细, 而且每个人遇到的问题都不尽相同, 本文只是记录整体流程和遇到的一些错误及解决方案. 如果有人遇到问题可以互相交流学习. 最后, 放上参考文章链接, 特别感谢一下明哥