源码编译简记

  • 编译环境
  • 搭编译环境
  • 编译过程
  • 运行编译好的源码


编译环境

macbook pro 13.3 15款
2.9 GHz Intel Core i5
OS 10.13.6 (17G5019)
内存 16 GB 1867 MHz DDR3
SSD 500G

编译源码当然是cpu越高越好 我这个配置编译android8.1源码 花了4-5个小时
基本上你能搜到的教程其实都差不多,也能使用,也可以成功。我这里就总结一下我这边所遇到的一些问题和一些简单心得

搭编译环境

翻墙去按照google官方文档去做,是行不通的,repo init那一步过不去,可能和代理关系。
所以,在国内就走清华或者科大的方法。也有相应的官方文档。不过以下链接也没有说明需要mac预装那些编译工具。我会下面给出。

清华Android镜像使用帮助 https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ 科大Android镜像使用帮助 https://lug.ustc.edu.cn/wiki/mirrors/help/aosp

关于Mac 编译环境的搭建,首先是建立区分大小写的分区,网上帖子全是执行命令去建立,其实根本没必要,你只要默默的打开电脑里的磁盘工具,右上角的+号,添加一个能区分大小写的新卷宗就可以了,前提是你的磁盘空间足够,最好能空余200G,给新加的卷宗保留个200G就管够了,我这里源码加上编译后总共占了152G。

建立了大小写分区,这时候需要安装一些支持编译的工具

1.使用以下命令安装 Xcode 命令行工具:

xcode-select --install

2.通过 macports.org 安装 MacPorts。

注意:请确保在路径中 /opt/local/bin 显示在 /usr/bin 之前。否则,请将以下内容添加到 ~/.bash_profile 文件中:

export PATH=/opt/local/bin:$PATH

注意:如果主目录中没有 .bash_profile 文件,请创建一个。

3.通过 MacPorts 获取 Make、Git 和 GPG 程序包:

POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg2

原链接是指安装 gnupg,实际已经不能安装了,安装gnupg2就可以了

以上三步执行完了,需要确保你的~/.bash_profile文件内是否有NDK的环境变量,有的话请用#号注释掉

然后按照上面两个链接任意一个,安装repo,然后照着init和同步代码就可以了。

编译过程

然后是编译源码,没什么好说的,就那儿三句命令。

source build/envsetup.sh 
lunch [target]//编译目标版本
make -j4//我的cpu双核,只能j4,我也想j8,j32

根据网上诸多教程排坑就可以了,不出意外只需要处理2~3个问题,一个10.13不支持的问题,添加到配置文件里就行,不需要下什么10.12的sdk,还有一个bison需要添加一个path重新编译的问题,跟着做就行。其他问题我没遇到,还有网上的教程都适用于android原版代码的编译,其他改过的android系统,mac不一定能编译出来。比如,我折腾了好几天的友善nanoPC-T4板子带的8.1的源码,mac死活编不出来。然而ubuntu就可以。

运行编译好的源码

下来我只着重说一下,如果想用模拟器运行编译好的源码的话,对于mac来说最好lunch的时候选择x86_64的目标编译,因为mac带i5的cpu是x86_64指令集的,你编译一个arm的,模拟器运行起来会非常的卡,相反,x86_64的运行起来非常流畅。

关于怎么用模拟器运行编译好的源码?
在你的源码编译成功之后,没有关terminal的话直接

emulator
//如果关闭了,在新terminal窗口里
source build/envsetup.sh 
lunch
//选择你之前选的编译目标
emulator

就可以了,如果报错,请更新你的os系统到最新版
还有一个问题就是,不出意外你的settings会打不开,因为打开就奔溃,原因很简单,因为是模拟器,用不了wifi,需要在源码里修改wifi的代码,源码根目录下

/packages/apps/Settings/src/com/android/settings/wfd/WifiDisplaySettings.java

public static boolean isAvailable(Context context) {
        // return context.getSystemService(Context.DISPLAY_SERVICE) != null
        //         && context.getSystemService(Context.WIFI_P2P_SERVICE) != null;
        return false;
    }

把原来的注释掉直接返回false即可。然后重新make一下源码就可以。

代码修改后,直接make就可以(走编译那三步命令),别clean,clean后意味着你要重头开始编。

至此,在mac上,你就能直接模拟器运行你编译好的代码了。关于源码导入android studio,网上帖子一大堆,我就不重复了。

关于模拟器默认配置,在这个路径下

/out/target/product/generic_x86_64/config.ini

#我改成了以下配置
avd.ini.encoding=UTF-8
disk.dataPartition.size=8G#原来是2G
hw.accelerometer=yes
hw.audioInput=yes
hw.battery=yes
hw.camera.back=emulated
hw.camera.front=none
hw.dPad=no
hw.gps=yes
hw.gpu.enabled=yes
hw.keyboard=yes
hw.lcd.density=240
hw.mainKeys=no
hw.ramSize=4096#原来是2048
hw.sensors.orientation=yes
hw.sensors.proximity=yes
image.sysdir.1=x86/
skin.dynamic=no
skin.name=1080x1920#原来是480x800
skin.path=1080x1920#原来是480x800

这些参数什么意思自行百度,我也不是很清楚。