ubuntu编译Android源码填坑记

前言

13年的时候做过一年Android rom开发,不过当时在公司的ubuntu开发环境都是老员工搭建好的,repo Android源代码,编译都很顺畅没有遇到什么问题。很早之前的一个周末闲来无事用windows台式机装了ubuntu,准备再编译一次Android6.0源代码。不料真是一路的坑,故有这篇填坑记给大伙参考。

开始

电脑配置:海尔 i5 8G内存,GTX750单显
系统:win7 + ubuntu 16.04 双系统
流程参考:https://source.android.com/source/downloading#using-authentication

  1. win7装ubuntu16.04就不顺利,偶尔进入ubuntu直接黑屏。
    解决办法:网上都说显卡的问题,应该进入bios禁用双显卡,这个一般都是针对笔记本。我的是台式机,启动双系统时迅速选择ubuntu可以进入,进去后软件更新》附加驱动》选择显卡驱动,比如我的是nvidia选择这个:


    image.png
  2. repo sync同步代码出错: error: Exited sync due to fetch errors
    由于我是用ss搭建了完美的翻墙网络,google什么的毫无鸭梨,直接用官方地址拉取代码:

repo init -u https://android.googlesource.com/a/platform/manifest
repo sync

报错:error: Exited sync due to fetch errors
google官网给出解决办法:


image.png

点击 密码生成器,进入:


image.png

按照他的提示执行以下命令,然后重新执行同步代码,一切OK然后是漫长的等待。

大概需要30小时左右,13G的源代码就下载下来了。如果你不具备翻墙环境可以用一些国内的代理仓库,效果我就不清楚了。

  1. 执行make命令编译源代码,报错:error: unsupported reloc 43
//开启8条线程编译源代码
make -j8

这个是ubuntu 16.04编译Android源码的bug,编译之前我们应改一个配置:

在android源码文件下art/build/Android.common_build.mk这个文件中找到

# Host.
ART_HOST_CLANG := false
ifneq ($(WITHOUT_HOST_CLANG),true)
  # By default, host builds use clang for better warnings.
   ART_HOST_CLANG := true
endif

后面两个true改为false,这个设置对Android5.0和5.1无效还是编不过,对6.0可以,其他版本未做测试。so建议装ubuntu 14.04

不限于这个报错,很多其他报错你也可以尝试这个修改。

  1. 路径错误,把源码路径修改为英文即可。

  2. 报错:Cannot launch Jack Server
    解决办法:把$HOME/.jack中的配置文件中的SERVER=true设成false,不用jack

可能还有其他一些我记录下来,只能靠不断google不断找答案尝试。请记住每次报错导致编译停止,重新开始前执行下clean:

make clean

最后大概需要3-4小时左右,make成功执行然后在这个目录:
./out/target/product/generic 生成4个img文件代表编译sucsess:
-system system.img
-data userdata.img
-ramdisk ramdisk.img

  1. 安装genymotion后一直连不上adb
    解决办法:进入genymotion发开调试开关,在型号选择界面settings 》adb 中配置SDK路径,重启genymotion

  2. 执行adb指令提示 ADB server didn't ACK, 5037端口被占用
    解决办法: 有两个原因,一是其他软件占用5037端口,二是重复安装了adb组件

第一步,netstat -ap | grep 5037 查找哪些进程占用了5037端口

第二步,cd proc/ 接着执行:ls -ail 这个里面存放所有进程,进程PID为文件夹名称

第三步,根据第一步占用PID 查找对应进程文件路径,exe 表示路径

第四步,kill pid 杀掉可疑进程,重新设置sdk环境,重启adb

  1. 准备导入源码到android studio前执行: mmm development/tools/idegen/ 报错 /bin/bash: jar: 未找到命令
    解决办法:在编译android环境时,java -version 命令明明能够正确表示java已经安装成功,环境设置正确。但是,在编译android时,检查java版本却通不过去:提示/bin/bash: java: command not found 问题,
    重装jdk几次仍是出现这种问题,没办法只好做个软链接了。
sudo ln -s /jdk1.6.0_21/bin/jar /bin/jar
sudo ln -s /jdk1.6.0_21/bin/java /bin/java
sudo ln -s /jdk1.6.0_21/bin/javac /bin/javac
sudo ln -s /jdk1.6.0_21/bin/javah /bin/javah
sudo ln -s /jdk1.6.0_21/bin/javadoc /bin/javadoc

后记

由于台式机ubuntu太卡了,打算把源代码copy到mac mini上,不了中途移动硬盘卡死导致部分文件丢失,不过还好frameworks和packages都是完整考过来了:


image.png

刚已经把源码的关键部分上传到网盘,有需要的朋友自取:

frameworks(Android核心代码):
链接:https://pan.baidu.com/s/1nwyOmJB 密码:huxw
packages (Android 内置app,系统servcie,provider等):
链接:https://pan.baidu.com/s/1kWVwtqn 密码:hh2c

推荐阅读更多精彩内容