Mac OS10.12 编译Android源码8.1

Android学习 同时被 3 个专栏收录
39 篇文章 2 订阅
7 篇文章 0 订阅
5 篇文章 0 订阅

内容

介绍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

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命令

$ lunch

You're building on Darwin

Lunch menu... pick a combo:
     1. aosp_arm-eng
     2. aosp_arm64-eng
     3. aosp_mips-eng
     4. aosp_mips64-eng
     5. aosp_x86-eng
     6. aosp_x86_64-eng
     7. full_fugu-userdebug
     8. aosp_fugu-userdebug
     9. aosp_car_emu_arm-userdebug
     10. aosp_car_emu_arm64-userdebug
     11. aosp_car_emu_x86-userdebug
     12. aosp_car_emu_x86_64-userdebug
     13. mini_emulator_arm64-userdebug
     14. m_e_arm-userdebug
     15. m_e_mips-userdebug
     16. m_e_mips64-eng
     17. mini_emulator_x86-userdebug
     18. mini_emulator_x86_64-userdebug
     19. uml-userdebug
     20. aosp_dragon-userdebug
     21. aosp_dragon-eng
     22. aosp_marlin-userdebug
     23. aosp_marlin_svelte-userdebug
     24. aosp_sailfish-userdebug
     25. aosp_walleye-userdebug
     26. aosp_walleye_test-userdebug
     27. aosp_taimen-userdebug
     28. aosp_angler-userdebug
     29. aosp_bullhead-userdebug
     30. aosp_bullhead_svelte-userdebug
     31. hikey-userdebug
     32. hikey960-userdebug

Which 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

  • 0
    点赞
  • 6
    评论
  • 8
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值