内容

介绍mac os10.12拉取android源码,并且编译后,刷入手机的过程。
下载的rom是android 8.1,手机是pixel

准备工作

硬盘大小

本人Mac磁盘空间只有256GB,而编译8.1源码,至少需要150GB以上空间,所以使用了一个移动硬盘进行源码存储。

软件

  1. 安装JDK 8
  2. 安装git
  3. 安装XCode 10.11-10.12都行
  4. 安装android sdk(后面刷机用)

PS:按照下面的流程执行的时候,如果出现缺少软件再自行补上就行。

建立磁盘映像

  1. 打开磁盘工具
  2. 在菜单中 文件 - 新建映像 - 空白映像
  3. 填写映像信息

    因为是用移动硬盘,所以位置选的硬盘。大小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后缀的文件,此时,就可以愉快的刷机了。

  1. 手机进入开发者选项,打开OEM解锁,打开USB调试
  2. 执行adb reboot bootloader进入bootloader模式(需要安装Android SDK并配置环境变量)
  3. 进入bootloader模式后,需要解锁bootloader,执行fastboot flashing unlock,手机会进入到解锁页面,用音量上下键选中unlock选项,使用电源键确认。
  4. 解锁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相关推荐

  1. android:自己动手编译Android源码(超详细)

    自己动手编译Android源码(超详细) 涅槃1992 2016.06.20 02:12* 字数 4330 阅读 86819评论 89喜欢 339赞赏 7 在Android Studio代码调试一文中 ...

  2. win10最新下载编译Android源码的简易方法分享(已亲测)

    win10最新下载编译Android源码的简易方法分享(已亲测) 准备至少150G的硬盘空间 win+R 输入control 打开程序与功能-启用或关闭Windows功能 勾选"适用于Lin ...

  3. 在Virtual Box的shared folder中编译android源码。

    一些诡异的选择会带来诡异的问题,比如android源码sync到一个shared folder里面,然后在这个Folder里面编译android源码. 问题:在SharedFolder下使用make ...

  4. 编译android源码及遇到的问题

    编译android源码,首先当然是下载源码. 在source.android.com中可以方便的找到下载流程. 虽然有现成的方法(GIT&REPO)不过最好还是先熟悉一下这两个工具使用方法最好 ...

  5. 《深入解析Android 虚拟机》——第1章,第1.3节编译Android源码

    本节书摘来自异步社区<深入解析Android 虚拟机>一书中的第1章,第1.3节编译Android源码,作者 钟世礼,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...

  6. 编译Android源码

    通过参考网上的相关资料,我编译Android源码的步骤如下: 1 我的系统是Ubuntu 8.04 2 系统上必须安装以下工具(摘自网上的资料):    sudo apt-get install bu ...

  7. (转)编译Android源码的全过程

    在网上看到一篇编译android源码的文章,照着做挺行的, 通过参考网上的相关资料,我编译Android源码的步骤如下: * 1 我的系统是Ubuntu 8.04      * 2 系统上必须安装以下 ...

  8. ubuntu 11.10下载和编译Android源码

    ubuntu 11.10下载和编译Android源码 由衷感谢网上的各个博主的文章,给了小弟我莫大的帮助.这里呢,小弟也把自己的经历记录下来,以供大家参考^^.这篇应该算是零基础.从无到有的流程介绍了 ...

  9. Ubuntu12.04编译Android4.0.1源码全过程-----附wubi安装ubuntu编译android源码硬盘空间不够的问题解决

    Ubuntu12.04编译Android4.0.1源码全过程-----附wubi安装ubuntu编译android源码硬盘空间不够的问题解决 参考文章: (1)Ubuntu12.04编译Android ...

  10. 编译Android源码致命错误解决方案

    编译Android源码致命错误解决方案 参考文章: (1)编译Android源码致命错误解决方案 (2)https://www.cnblogs.com/cliuwei/p/5605789.html 备 ...

最新文章

  1. Hive metastore三种配置方式
  2. iOS开发 关于启动页和停留时间的设置
  3. ASP.NET 防盗链源码
  4. 再来一次的C语言贪吃蛇小游戏(三)
  5. ruby连接mysql
  6. prompt-toolkit 版本问题
  7. 2021-10-21 二叉堆 恋上数据结构笔记
  8. 一个简单的从windows系统往AWS上直接拷贝文件的脚本
  9. 07-对图像进行膨胀操作
  10. 汽车引擎是怎么工作的
  11. php phpredis,PHP_PHP中redis的用法深入解析,redis是一个key-value存储系统。 - phpStudy...
  12. html页面显示dcm文件,基于HTML5标准的Dicom图像显示.doc
  13. 行为树BT设计与实现
  14. 管理经济学的大作业——边际效应分析在学习生活中的应用
  15. mac利用无线路由器在校园网中曲线分享文件,ipad随航及多设备共享上网等功能的一些想法和实现
  16. python 下三角矩阵_Python | 矩阵的下三角
  17. 案例分享 | 方形锂电池“极柱”检测解决方案
  18. 将微信文章含图片复制到word中方法
  19. python如何利用淘宝赚钱_Python攻破淘宝网各类反爬手段,采集淘宝网ZDB(女用)的销量!...
  20. AD学习记录 2021.1.28

热门文章

  1. 【PRML 学习笔记】第二章 - 概率分布 (Probability Distributions)
  2. 圆周移位是怎么移的_【装修干货】马桶移位改造全攻略,总有一天你能用得上!赶紧收藏...
  3. Centos7 安装MySQL5
  4. Unity3D笔记 英保通三 脚本编写 、物体间通信
  5. mybatis-generator自动生成代码(lombok带注释)
  6. 【English】20190430
  7. SpringMVC初写(四)上传和下载功能的实现
  8. Android Studio打开项目提示找不到sdk路径的问题。
  9. jsonp实现原理详细介绍
  10. div+css强制(不)换行 .