![]() 本文为看雪论坛优秀文章 看雪论坛作者ID:xmhwws 碎碎念:之前编译编译安卓4.4.4_r1出现问题,前来论坛求助。 还说了事后会把那次编译过程记录下来,发到看雪上,帮助他人少走弯路。 junkboy大佬给了aosp的docker链接,然而我的windows10死活无法正常运行docker,于是放弃。 最近,给电脑装了ubuntu系统,成功编译安卓系统。 这期间,遇到了不少问题,论坛很多热心的大佬给了帮助。 于是,就有了本文,希望能给之后编译aosp的人提供一些帮助。 前提:
正文: 更换软件源为阿里云: sudo gedit /etc/apt/sources.list 在文件最前面加入下面代码: deb http://mirrors.aliyun.com/ubuntu/ quantal main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ quantal-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ quantal-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ quantal-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ quantal-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ quantal main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ quantal-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ quantal-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ quantal-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ quantal-backports main restricted universe multiverse 安装依赖: 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 build-essential 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 所需JDK: ![]() (图片来源:https://source.android.com/source/requirements.html) 因为是编译安卓6,所以安装openJDK7。 网上安装openJDK7的方法基本都失效了,我废了很大功夫才在csdn找到一个能用的,下载链接: https://download.csdn.net/download/tenyearsafterg/10462952 去某宝找代下,1元就可以下载了。 将openJDK7解压到/usr/lib/jvm这个目录下面,比如我的目录/usr/lib/jvm/openjdk-1.7.0_121。 打开/etc/profile文件: sudo gedit /etc/profile 修改了/etc/profile文件需要 重启 才能生效,但使用下面命令可以在不重启的情况下在 当前 bash环境生效: source /etc/profile 在末尾追加下面代码: export JAVA_HOME=/usr/lib/jvm/openjdk-1.7.0_121 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH 验证: java -version javac -version 下载安卓系统(AOSP)源码: 【推荐】方法1:直接下载别人分享的:
我在网上找的别人通过百度网盘分享的源码下载链接: http://pan.baidu.com/s/1ngsZs 通过repo下载安卓6.0.0_r1,我下载了几百GB还没有下载完,无奈放弃。有没有大佬这是这么一回事啊?到底哪里出问题了?安卓一个版本不应该有几百GB这么大啊...... 我是先下载每月更新的初始化包,然后在这个目录通过repo下载安卓6.0.0_r1,是不是应该直接通过repo下载,而不用 先下载每月更新的初始化包呢? 【我尝试了,下载了半天,受不了,放弃】 方法2:通过国内镜像网站下载:
下载 repo 工具: mkdir ~/bin PATH=~/bin:$PATH curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo chmod +x repo 使用每月更新的初始化包。 由于首次同步需要下载约 30GB 数据,过程中任何网络故障都可能造成同步失败,我们强烈建议您使用初始化包进行初始化。 下载https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar,下载完成后记得根据 checksum.txt 的内容校验一下。 由于所有代码都是从隐藏的 .repo 目录中 checkout 出来的,所以我们只保留了 .repo 目录,下载后解压 再 repo sync 一遍即可得到完整的目录。 使用方法如下: wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包 tar xf aosp-latest.tar cd AOSP # 解压得到的 AOSP 工程目录 # 这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录 repo sync -l # 仅checkout代码 # 或 repo sync # 正常同步一遍即可得到完整目录,时间非常久 建立工作目录: mkdir AOSP cd AOSP 初始化仓库: repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest 如果提示无法连接到 gerrit.googlesource.com,repo的运行过程中会尝试访问官方的git源更新自己,如果想使用tuna的镜像源进行更新,可以将如下内容复制到你的~/.bashrc里。 export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/' 并重启终端模拟器。 如果需要某个特定的Android版本 (https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds): repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-6.0.0_r1 同步源码树(以后只需执行这条命令来同步): repo sync 问题: error: Exited sync due to fetch errors 解决方法: repo sync -f //-f or --force-broken flag allows it to recover from network error and more important recover on broken/missing objects. 替换已有的 AOSP 源代码的 remote。 如果你之前已经通过某种途径获得了 AOSP 的源码(或者你只是 init 这一步完成后), 你希望以后通过 TUNA 同步 AOSP 部分的代码,只需要将 .repo/manifest.xml 把其中的 aosp 这个 remote 的 fetch 从 https://android.googlesource.com 改为 https://aosp.tuna.tsinghua.edu.cn/。 <manifest> <remote name="aosp" - fetch="https://android.googlesource.com" + fetch="https://aosp.tuna.tsinghua.edu.cn" review="android-review.googlesource.com" /> <remote name="github" 同时,修改 .repo/manifests.git/config,将: url = https://android.googlesource.com/platform/manifest 更改为: url = https://aosp.tuna.tsinghua.edu.cn/platform/manifest 根据机型及想要编译的安卓版本,去官方 Nexus 和 Pixel 设备的二进制驱动下载页面:https://developers.google.com/android/drivers 下载了相应的二进制驱动。 ![]() 因为附件限制大小8MB,而驱动大小为23.4MB,所以只能靠你们自己去下载了。 下载好,解压,得到几个sh脚本,将它们复制到安卓源码目录下面并运行。 运行后,会提示你查看证书,按Enter键一行行的查看(最后一项是第8条第e项),出现下面的输入提示时,输入:I ACCEPT,会在安卓源码下生成vendor目录。其它几个自解压脚本也是这样执行。 修改 源码目录/art/build/Android.common_build.mk 文件,定位到75行,将下面的代码: ifneq ($(WITHOUT_HOST_CLANG),true)改为ifeq ($(WITHOUT_HOST_CLANG),false) //对应问题3 开始编译: 如果之前编译过,删除所有以前编译操作的已有输出: make clobber make clean (1) 在 .bashrc文件末尾添加:export USE_CCACHE = 1 echo export USE_CCACHE=1 >> ~/.bashrc //只要编译过aosp,执行过这一句代码,以后再编译aosp,就不用再执行了 (2) 为了提高编译效率,设置编译器高速缓存: prebuilts/misc/linux-x86/ccache/ccache -M 100G (3) 接着导入编译Android源码所需的环境变量和其它参数: source build/envsetup.sh (4) 运行lunch命令选择编译目标: ![]() 图片来源: https://source.android.google.cn/setup/develop/new-device#userdebug-guidelines lunch //输入17 //1. aosp_arm-eng不会生成我们需要的5个文件,17. aosp_hammerhead-userdebug可以 export LC_ALL=C //对应问题2 查看CPU核心数: cat /proc/cpuinfo | grep processor (5) 开始编译,执行make -j12, 12为同时编译的线程数,一般google推荐这个数字为2倍的cpu个数再加上2,比如4核,就是10。我使用的是12: make -j12 花了1个多小时编译成功。 ![]() 编译后输出的文件都放在了源码根目录下的out文件中,比如我的目录:/android-6.0.0_r1/out/target/product。可以在该目录下面找到boot.img、system.img、recovery.img、cache.img、userdata.img五个镜像文件,这表示编译成功,这也是刷机需要的文件。 问题1: Export includes file: frameworks/base/tools/aapt/Android.mk -- out/host/linux-x86/obj/STATIC_LIBRARIES/libaapt_intermediates/export_includes cat out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.hpp >> out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.h build/core/binary.mk:646: recipe for target 'out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_l.cpp' failed make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_l.cpp] 已放弃 (core dumped) make: *** 正在等待未完成的任务.... Export includes file: frameworks/base/libs/androidfw/Android.mk -- out/host/linux-x86/obj/STATIC_LIBRARIES/libandroidfw_intermediates/export_includes echo '#endif' >> out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.h 注: 某些输入文件使用了未经检查或不安全的操作。 注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。 注: 某些输入文件使用了未经检查或不安全的操作。 注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。 #### make failed to build some targets (51 seconds) #### 解决方法: make -j12 update-api 问题2: Lex: aidl <= frameworks/base/tools/aidl/aidl_language_l.l flex-2.5.39: loadlocale.c:130:_nl_intern_locale_data: ?? 'cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' ??? build/core/binary.mk:646: recipe for target 'out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_l.cpp' failed make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_l.cpp] 已放弃 (core dumped) 解决方法: 编译前:export LC_ALL=C 问题3: clang: error: linker command failed with exit code 1 (use -v to see invocation) build/core/host_shared_library_internal.mk:51: recipe for target 'out/host/linux-x86/obj/lib/libart.so' failed make: *** [out/host/linux-x86/obj/lib/libart.so] Error 1 解决方法: 修改 源码目录/art/build/Android.common_build.mk 文件,定位到75行,将下面的代码: ifneq ($(WITHOUT_HOST_CLANG),true)改为ifeq ($(WITHOUT_HOST_CLANG),false) 参考:网上各种教程,因为链接太多了,就不一一列举了。 感谢各位大佬们! ![]() - End - ![]() 看雪ID:xmhwws https://bbs.pediy.com/user-797907.htm *本文由看雪论坛 xmhwws 原创,转载请注明来自看雪社区 推荐文章++++ ![]() * 开源自己开发的一些工具--封包嗅探工具SnifferView * Windows提权逆向 * 动态过DSE代码以及原理 * ollvm源码分析 - Pass之SplitBaiscBlocks * Linux内核驱动调试遇到的一些坑以及解决方法(新手必看指南) 进阶安全圈,不得不读的一本书 ![]() ﹀ ﹀﹀ ![]() 公众号ID:ikanxue 官方微博:看雪安全商务合作:wsc@kanxue.com ![]() 戳“阅读原文”一起来充电吧! ---------------------------------------------------------------------------------------------------------------------- 我们尊重原创,也注重分享,文章来源于微信公众号:看雪学院,建议关注公众号查看原文。如若侵权请联系qter@qter.org。 ---------------------------------------------------------------------------------------------------------------------- |