Mac OS10.12 编译Android源码8.1
内容
介绍mac os10.12拉取android源码,并且编译后,刷入手机的过程。
下载的rom是android 8.1,手机是pixel
准备工作
硬盘大小
本人Mac磁盘空间只有256GB,而编译8.1源码,至少需要150GB以上空间,所以使用了一个移动硬盘进行源码存储。
软件
- 安装JDK 8
- 安装git
- 安装XCode 10.11-10.12都行
- 安装android sdk(后面刷机用)
PS:按照下面的流程执行的时候,如果出现缺少软件再自行补上就行。
建立磁盘映像
- 打开
磁盘工具
- 在菜单中 文件 - 新建映像 - 空白映像
- 填写映像信息
因为是用移动硬盘,所以位置选的硬盘。大小200GB,格式必须是Mac OS扩展(区分大小写,日志式)
,点击存储,漫长的等待。
拉取源码
1. 下载代码同步工具repo
使用google官方地址下载:
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
如果无法访问storage.googleapis.com,可以使用清华的地址:
mkdir ~/bin
PATH=~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo
2. 修改环境变量
为了让repo
在拉取代码的时候,走国内清华的地址,需要把下面这一行加入到环境变量配置文件中。
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
3. 拉取源码
3.1. 打开刚刚建立好的Android.dmg
3.2. 建立工作目录
cd /Volumes/AOSP/
mkdir work
cd work
3.3. 查询特定的 Android 版本(列表)
我选取的是android-8.1.0_r15
分支,对应pixel手机的分支。对应的细分版本号是OPM1.171019.021
,这个细分版本号一会下载驱动需要用到。
3.4 初始化repo仓库
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.1.0_r15
3.5 同步源码
repo sync -f -j5
漫长的等待…,可以提前进入下一个环节,驱动下载。
下载驱动
编译之前,需要下载好驱动,否则编译后的镜像即使刷到手机上也无法启动系统(驱动下载)根据当时sync的时候拉取的细分版本号OPM1.171019.021
,以及手机的型号pixel
,下载对应的驱动,
下载好之后,解压得到sh脚本文件,拷贝到编译所在目录,刚刚建立的work
目录里。
依次执行脚本,会在当前目录生成vendor
目录,运行脚本的时候,需要不断的按回车看协议内容,到最后再输入I ACCEPT
回车同意协议。
技巧: 长按回车,直到第八条协议,放慢速度一条一条按,直到提示输入I ACCEPT
。
启动编译
依次执行
source build/envsetup.sh
执行lunch
命令
$ lunchYou're building on DarwinLunch menu... pick a combo:1. aosp_arm-eng2. aosp_arm64-eng3. aosp_mips-eng4. aosp_mips64-eng5. aosp_x86-eng6. aosp_x86_64-eng7. full_fugu-userdebug8. aosp_fugu-userdebug9. aosp_car_emu_arm-userdebug10. aosp_car_emu_arm64-userdebug11. aosp_car_emu_x86-userdebug12. aosp_car_emu_x86_64-userdebug13. mini_emulator_arm64-userdebug14. m_e_arm-userdebug15. m_e_mips-userdebug16. m_e_mips64-eng17. mini_emulator_x86-userdebug18. mini_emulator_x86_64-userdebug19. uml-userdebug20. aosp_dragon-userdebug21. aosp_dragon-eng22. aosp_marlin-userdebug23. aosp_marlin_svelte-userdebug24. aosp_sailfish-userdebug25. aosp_walleye-userdebug26. aosp_walleye_test-userdebug27. aosp_taimen-userdebug28. aosp_angler-userdebug29. aosp_bullhead-userdebug30. aosp_bullhead_svelte-userdebug31. hikey-userdebug32. hikey960-userdebugWhich would you like? [aosp_arm-eng] 24
这里因为的手机是pixel
,而且需要的是userdebug
系统,所以输入24,回车。
开始编译:
make -j40
漫长的等待…
刷入手机
编译系统完成后,在out/target/product/sailfish/
目录下,能看到很多.img
后缀的文件,此时,就可以愉快的刷机了。
- 手机进入开发者选项,打开
OEM解锁
,打开USB调试
- 执行
adb reboot bootloader
进入bootloader模式(需要安装Android SDK并配置环境变量) - 进入bootloader模式后,需要解锁bootloader,执行
fastboot flashing unlock
,手机会进入到解锁页面,用音量上下键选中unlock选项,使用电源键确认。 - 解锁bootloader之后,再次进入bootloader模式,进入
work
目录,执行fastboot flashall -w
刷入,等待重启,如果没有做下载驱动这一步,即使刷入,还是无法进入系统,此时,只需要重新下载驱动,再次执行编译命令。
点击查看更多刷机相关的内容
AndroidStudio中查看源码
在android源码中有这么一个目录development/tools/idegen。
顾名思义,是生成ide的project文件,主要是生成intellij的project文件,可用于AndroidStudio。
1. 在整个Android源码全编成功之后,然后编译idegen模块,用以生成Android studio的工程配置文件,编译成功之后就生成了idegen.jar(out/host/darwin-x86/framework/idegen.jar),运行如下命令:
$ mmm development/tools/idegen/
注:如果刚才编译AOSP的那个命令行窗口关闭了,必须要在执行source build/envsetup.sh一次,用了初始化编译环境。
2. 在源码根目录生成对应的android.ipr、android.iml IEDA工程配置文件。以便于AndroidStudio可以打开项目
sudo ./development/tools/idegen/idegen.sh
android.ipr:通常是保存工程相关的设置,比如编译器配置,入口,相关的libraries等
android.iml:则是主要是描述了modules,比如modules的路径,依赖关系等.
android.iws:则主要是包含了一些个人工作区的设置.
3. 导入Android Studio
由于Android源码太大,导入之前,需要对studio进行配置
1. 修改VM内存大小
打开IDEA 菜单栏 Help > Edit Custom VM Options,添加
-Xms1g
-Xmx5g
2. 修改文件大小限制,打开区分大小写选项
打开IDEA 菜单栏 Help -> Edit custom properties, 添加
idea.max.intellisense.filesize=100000
idea.case.sensitive.fs=true
重启Android Studio,然后打开Android.ipr
就可以查看源码了。首次导入会很慢。
编译遇见的坑
源码拉取,以及编译顺序大家都会,但是编译坑太多,坑得记一下,以免后面再掉下去。解决完问题好,重新执行上面的命令编译命令即可。
在出现报错之后,仔细查看FAILED: XXXXX
这一行下面的提示,进行问题的定位。
Fuck Jack-Server
jack-server报错如下
[ 53% 48295/89583] Ensuring Jack server is installed and started
FAILED: setup-jack-server
/bin/bash -c "(prebuilts/sdk/tools/jack-admin install-server prebuilts/sdk/tools/jack-launcher.jar prebuilts/sdk/tools/jack-server-4.11.ALPHA.jar 2>&1 || (exit 0) ) && (JACK_SERVER_VM_ARGUMENTS=\"-Dfile.encoding=UTF-8 -XX:+TieredCompilation\" prebuilts/sdk/tools/jack-admin start-server 2>&1 || exit 0 ) && (prebuilts/sdk/tools/jack-admin update server prebuilts/sdk/tools/jack-server-4.11.ALPHA.jar 4.11.ALPHA 2>&1 || exit 0 ) && (prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-4.32.CANDIDATE.jar 4.32.CANDIDATE || exit 47 )"
Unsupported curl, please use a curl not based on SecureTransport
Launching Jack server java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=/var/folders/v3/qcs7l6gd5l954fzkrg13z0h40000gn/T/ -Dfile.encoding=UTF-8 -XX:+TieredCompilation -cp /Users/chenwangwang/.jack-server/launcher.jar com.android.jack.launcher.ServerLauncher
解决方案:
###1. 删除原来安装的jack-server
rm -r ~/.jack-server
###2. 自己尝试安装jack-server
prebuilts/sdk/tools/jack-admin install-server prebuilts/sdk/tools/jack-launcher.jar prebuilts/sdk/tools/jack-server-4.11.ALPHA.jar
上面的命令,是从报错信息里复制出来的,不同的android版本可能不一样。
###3. 安装jack-server报错
Unsupported curl, please use a curl not based on SecureTransport
curl不对,不能是基于SecureTransport的curl,需要重新下载,并编译一个带OpenSSL的curl。
下载curl,解压,命令行进入到解压后的目录。
首先使用下面命令查看自己的openssl版本
ls /usr/local/Cellar/openssl/
我的机器上,openssl版本是1.0.2g
得到版本后,依次执行:
./configure --prefix=/usr/local/curl --with-ssl=/usr/local/Cellar/openssl/1.0.2g
make
make install
这里的1.0.2g
是我机器上的openssl版本,需要根据自己机器的openssl做替换。
接着,/usr/local/curl/bin
添加到环境变量,然后然后使用source命令使环境变量立即生效。
再使用curl --version
查看当前curl
的信息,如果出现openssl
,而不是SecureTransport
则说明替换curl成功。
下面是我替换之后的信息:
curl 7.61.0 (x86_64-apple-darwin16.7.0) libcurl/7.61.0 OpenSSL/1.0.2g zlib/1.2.8
Release-Date: 2018-07-11
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP UnixSockets HTTPS-proxy
4. 再次安装jack-server
替换掉curl
之后,重新安装jack-server
prebuilts/sdk/tools/jack-admin install-server prebuilts/sdk/tools/jack-launcher.jar prebuilts/sdk/tools/jack-server-4.11.ALPHA.jar
顺利通过。
5. 尝试启动jack-server
启动之前,先把jack-server杀掉,进入到源码编译目录,接着
./prebuilts/sdk/tools/jack-admin kill-server
然后尝试启动:
./prebuilts/sdk/tools/jack-admin start-server
成功启动,而不是一直卡着。
6. 清除刚刚的测试环境
杀了jack-server
服务
./prebuilts/sdk/tools/jack-admin kill-server
移除已经安装的jack-server
rm -r ~/.jack-server
7. 重新编译
上面步骤完成后,重新编译源码
make -j40
/bin/bash: xz: command not found
报错信息:
Couldn't find end of symbol
[ 80% 33059/41252] target Strip (mini debug info): libandroid_net (out/target/p...t/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so)
FAILED: out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so
/bin/bash -c "(rm -f out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so.dynsyms out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so.funcsyms out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so.keep_symbols out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so.debug out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so.mini_debuginfo.xz ) && (if prebuilts/gcc/darwin-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-strip --strip-all -R .comment out/target/product/sailfish/symbols/system/lib64/libandroid_net.so -o out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so; then prebuilts/gcc/darwin-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-objcopy --only-keep-debug out/target/product/sailfish/symbols/system/lib64/libandroid_net.so out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so.debug && prebuilts/gcc/darwin-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-nm -D out/target/product/sailfish/symbols/system/lib64/libandroid_net.so --format=posix --defined-only | awk '{ print \$1 }' | sort >out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so.dynsyms && prebuilts/gcc/darwin-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-nm out/target/product/sailfish/symbols/system/lib64/libandroid_net.so --format=posix --defined-only | awk '{ if (\$2 == \"T\" || \$2 == \"t\" || \$2 == \"D\") print \$1 }' | sort >out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so.funcsyms && comm -13 out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so.dynsyms out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so.funcsyms >out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so.keep_symbols && prebuilts/gcc/darwin-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-objcopy --rename-section .debug_frame=saved_debug_frame out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so.debug out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so.mini_debuginfo && prebuilts/gcc/darwin-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-objcopy -S --remove-section .gdb_index --remove-section .comment --keep-symbols=out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so.keep_symbols out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so.mini_debuginfo && prebuilts/gcc/darwin-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-objcopy --rename-section saved_debug_frame=.debug_frame out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so.mini_debuginfo && rm -f out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so.mini_debuginfo.xz && xz out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so.mini_debuginfo && prebuilts/gcc/darwin-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-objcopy --add-section .gnu_debugdata=out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so.mini_debuginfo.xz out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so; else cp -f out/target/product/sailfish/symbols/system/lib64/libandroid_net.so out/target/product/sailfish/obj/SHARED_LIBRARIES/libandroid_net_intermediates/libandroid_net.so; fi )"
/bin/bash: xz: command not found
解决方案:
没有安装xz
解压工具,参考mac安装xz解压命令
bison错误
FAILED: out/soong/.intermediates/external/selinux/checkpolicy/checkpolicy/darwin_x86_64/gen/yacc/external/selinux/checkpolicy/policy_parse.c out/soong/.intermediates/external/selinux/checkpolicy/checkpolicy/darwin_x86_64/gen/yacc/external/selinux/checkpolicy/policy_parse.h
BISON_PKGDATADIR=external/bison/data prebuilts/misc/darwin-x86/bison/bison -d --defines=out/soong/.intermediates/external/selinux/checkpolicy/checkpolicy/darwin_x86_64/gen/yacc/external/selinux/checkpolicy/policy_parse.h -o out/soong/.intermediates/external/selinux/checkpolicy/checkpolicy/darwin_x86_64/gen/yacc/external/selinux/checkpolicy/policy_parse.c external/selinux/checkpolicy/policy_parse.y
解决方案
为bison
打补丁,重新编译(Patch bison fix for High Sierra and build bison:):
进入aosp主目录work
cd external/bison
git cherry-pick c0c852bd6fe462b148475476d9124fd740eba160
mm
cd ../..
cp out/host/darwin-x86/bin/bison prebuilts/misc/darwin-x86/bison/
ERROR: Unable to create a plug-in (e00002be)
描述
执行fastboot flashall -w
刷机的时候,报错:
ERROR: Unable to create a plug-in (e00002be)
报错原因是因为AOSP自带的fastboot版本太低了,在源码目录执行fastboot --version
BJ1664:work chenwangwang$ fastboot --version
fastboot version 0.0.0-eng.chenwa.20180806.145659
Installed as /Volumes/AOSP/work/out/host/darwin-x86/bin/fastboot
解决方案
自行下载最新的SDK,解压后,仍然是在源码编译根目录,执行命令
/Users/liangqiu/android/android-sdk-macosx/platform-tools/fastboot flashall -w
/Users/liangqiu/android/android-sdk-macosx/platform-tools/fastboot
是加压后的SDK里,fastboot路径。
参考
Mac下编译Android源码,并导入IntelliJ IDEA进行源码阅读
尊重原创,转载请注明出处:https://blog.csdn.net/a740169405/article/details/81142263
Mac OS10.12 编译Android源码8.1相关推荐
- android:自己动手编译Android源码(超详细)
自己动手编译Android源码(超详细) 涅槃1992 2016.06.20 02:12* 字数 4330 阅读 86819评论 89喜欢 339赞赏 7 在Android Studio代码调试一文中 ...
- win10最新下载编译Android源码的简易方法分享(已亲测)
win10最新下载编译Android源码的简易方法分享(已亲测) 准备至少150G的硬盘空间 win+R 输入control 打开程序与功能-启用或关闭Windows功能 勾选"适用于Lin ...
- 在Virtual Box的shared folder中编译android源码。
一些诡异的选择会带来诡异的问题,比如android源码sync到一个shared folder里面,然后在这个Folder里面编译android源码. 问题:在SharedFolder下使用make ...
- 编译android源码及遇到的问题
编译android源码,首先当然是下载源码. 在source.android.com中可以方便的找到下载流程. 虽然有现成的方法(GIT&REPO)不过最好还是先熟悉一下这两个工具使用方法最好 ...
- 《深入解析Android 虚拟机》——第1章,第1.3节编译Android源码
本节书摘来自异步社区<深入解析Android 虚拟机>一书中的第1章,第1.3节编译Android源码,作者 钟世礼,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...
- 编译Android源码
通过参考网上的相关资料,我编译Android源码的步骤如下: 1 我的系统是Ubuntu 8.04 2 系统上必须安装以下工具(摘自网上的资料): sudo apt-get install bu ...
- (转)编译Android源码的全过程
在网上看到一篇编译android源码的文章,照着做挺行的, 通过参考网上的相关资料,我编译Android源码的步骤如下: * 1 我的系统是Ubuntu 8.04 * 2 系统上必须安装以下 ...
- ubuntu 11.10下载和编译Android源码
ubuntu 11.10下载和编译Android源码 由衷感谢网上的各个博主的文章,给了小弟我莫大的帮助.这里呢,小弟也把自己的经历记录下来,以供大家参考^^.这篇应该算是零基础.从无到有的流程介绍了 ...
- Ubuntu12.04编译Android4.0.1源码全过程-----附wubi安装ubuntu编译android源码硬盘空间不够的问题解决
Ubuntu12.04编译Android4.0.1源码全过程-----附wubi安装ubuntu编译android源码硬盘空间不够的问题解决 参考文章: (1)Ubuntu12.04编译Android ...
- 编译Android源码致命错误解决方案
编译Android源码致命错误解决方案 参考文章: (1)编译Android源码致命错误解决方案 (2)https://www.cnblogs.com/cliuwei/p/5605789.html 备 ...
最新文章
- Hive metastore三种配置方式
- iOS开发 关于启动页和停留时间的设置
- ASP.NET 防盗链源码
- 再来一次的C语言贪吃蛇小游戏(三)
- ruby连接mysql
- prompt-toolkit 版本问题
- 2021-10-21 二叉堆 恋上数据结构笔记
- 一个简单的从windows系统往AWS上直接拷贝文件的脚本
- 07-对图像进行膨胀操作
- 汽车引擎是怎么工作的
- php phpredis,PHP_PHP中redis的用法深入解析,redis是一个key-value存储系统。 - phpStudy...
- html页面显示dcm文件,基于HTML5标准的Dicom图像显示.doc
- 行为树BT设计与实现
- 管理经济学的大作业——边际效应分析在学习生活中的应用
- mac利用无线路由器在校园网中曲线分享文件,ipad随航及多设备共享上网等功能的一些想法和实现
- python 下三角矩阵_Python | 矩阵的下三角
- 案例分享 | 方形锂电池“极柱”检测解决方案
- 将微信文章含图片复制到word中方法
- python如何利用淘宝赚钱_Python攻破淘宝网各类反爬手段,采集淘宝网ZDB(女用)的销量!...
- AD学习记录 2021.1.28
热门文章
- 【PRML 学习笔记】第二章 - 概率分布 (Probability Distributions)
- 圆周移位是怎么移的_【装修干货】马桶移位改造全攻略,总有一天你能用得上!赶紧收藏...
- Centos7 安装MySQL5
- Unity3D笔记 英保通三 脚本编写 、物体间通信
- mybatis-generator自动生成代码(lombok带注释)
- 【English】20190430
- SpringMVC初写(四)上传和下载功能的实现
- Android Studio打开项目提示找不到sdk路径的问题。
- jsonp实现原理详细介绍
- div+css强制(不)换行 .