android源码编译

本次基于google官方文档下载编译:
https://source.android.com/setup/build/requirements
还有一篇详细的博客:
https://blog.csdn.net/dd864140130/article/details/51718187

相关准备

master 分支历来都是在 Ubuntu Long Term Support (LTS) 版本中进行开发和测试,采用ubuntu-14.04-desktop-amd64。试了其它14.04.4之类的,都有冲突。
master 分支事最少,带有预编译版本的 OpenJDK;因此无需另行安装。较低的版本则需要单独进行安装。

vpn

因为要下载的是谷歌官方的,所以必不可少。采用购买ssr。
先用shadowsocks启动:https://blog.csdn.net/u011774239/article/details/53905702
在应用中使用:https://github.com/Shadowsocks-Wiki/shadowsocks/blob/master/6-linux-settings.md

此后需要外网的指令加前缀

putty+telnet

远程操控:
telnet在linux的设置:https://blog.csdn.net/linux_ever/article/details/50519028

编译环境

python 2.7
make3.81
git
java环境1.8对于ubuntu14.04特殊,参考官方安装:
https://source.android.com/setup/build/initializing#installing-the-jdk
安装所需的软件包 (Ubuntu 14.04)

1
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev libxml2-utils xsltproc unzip

下载源码

https://source.android.com/setup/build/downloading
用Repo管理git指定要下载的分支。
android-8.1.0_r1支持机型较多而且较新。目前下了这个,61G

可以用shell脚本错误时自动sync

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
#FileName source_asyn.sh
PATH=~/bin:$PATH
# 注意修改成你要编译的版本,比如这里我在mac上编译的是Android-7.1.1——r6
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-7.1.1_r6
repo sync
while [$? = 1]: do
echo "=========download failed,again============"
sleep 5
repo sync
done

学习linux脚本!

编译

https://source.android.com/setup/build/building
先找到对应版本设备的二进制文件:https://developers.google.com/android/drivers
俩个都下载按说明添加到源代码树的 vendor/ 层次结构中。
之后步骤按照官方。
遇到的错误:
jack未启动错误:jack-admin start-server再接着make
Out of memory error:
输入

1
2
3
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"
out/host/linux-x86/bin/jack-admin kill-server
out/host/linux-x86/bin/jack-admin start-server

虚拟机运行

source build/envsetup.sh这句就是在配置环境变量,可以使用jack、emulator等
编译完成后直接emulator等较长时间即可在虚拟机中运行android了

fastboot刷机

编译后配置好的fastboot直接刷到实体机(因此购买谷歌官方机十分方便测试cm的mi3编译时失败…..买个google垃圾机吧…)
购买后:
google机开启设备锁编译完成后使用fastboot flashall -w直接刷机成功。

刷机后android无法访问网络:
显示已连接,但无法正常访问网络是正常的,但所有网络请求失败原因是系统时间不正确,导致服务器无法通过时间验证,在设置处设置时间即可。

打包rom

几个补充知识

Android基于Permission的安全机制https://blog.csdn.net/luoshengyang/article/details/17131835
简记:系统文件与目录被用uid、gid划分,进程持有uid/gid,从而决定进程能否使用api或者访问文件等操作,android root后所有的root操作一定要用su提权,所以在su时检测是否给权。
system/build.prop:系统信息
default.prop:系统配置.debugger选项所在
当你获得了android的应用shell时,可以用run-as变成开了debugger权限进程的uid shell。从而越权。

android开源项目的管理https://blog.csdn.net/luoshengyang/article/details/18195205
未看完

android编译系统https://blog.csdn.net/luoshengyang/article/details/18466779
android的make由一个mk文件,include其它mk文件组成。只执行一个。

android系统的各镜像分析https://blog.csdn.net/luoshengyang/article/details/20501657
一个是正常的系统,它由boot.img、system.img、ramdisk.img和userdata.img等组成,另外一个就是recovery系统,由recovery.img组成。
boot.img启动其它几个,另一个系统是由recovery启动全部。
通过对比Android正常使用时的系统和进行升级时使用的Recovery系统,我们就可以对运行Linux系统的移动设备(或者说嵌入式设备)世界窥一斑而知全豹,实际上我们只需要有一个BootLoader、一个Linux Kernel,以及一个Ramdisk,就可以将它们运行起来。Ramdisk属于用户空间的范畴,它里面主要包含了Linux Kernel启动完成时所要加载的根文件系统。这个根文件系统的作用就是为整个系统提供一个init程序,以便Linux Kernel可以将控制权从内核空间转移到用户空间。系统提供什么样的功能给用户使用主要取决于在用户空间层运行了哪些服务和守护进程。这些服务守护进程都是直接或者间接地由init进程启动的。例如,对于recovery系统来说,它最主要提供的功能就是让用户升级系统,也就是它的主要用户空间服务就是负责执行长级任务的recovery程序。又如,我们正常使用的Android系统,它的主要用户空间服务和守护进程都是由system.img镜像提供的,此外,我们还可以通过userdata.img镜像来安装第三方应用来丰富手机的功能。因此,我们也可以说,init进程启动的服务决定了系统的功能。当然 ,这些功能是建立是硬件的基础之上的。

CM ROM

androidROM刷机https://blog.csdn.net/luoshengyang/article/details/29688041
下载编译需要前几篇的知识:repo和编译系统
用户正常使用Android设备时的系统,主要是包含有两个分区:System分区和Boot分区。System分区包含有Android运行时框架、系统APP以及预装的第三方APP等,而Boot分区包含有Kernel和Rootfs
fastboot为bootloader的一种交互启动方式,可以刷recover和普通模式,recovery则是可以刷普通模式。
recover与普通模式则是俩个系统。
关于cm:
2016年12月23日,Cyanogen公司宣布他们关闭CyanogenMod的服务器
CyanogenMod随即宣布会进行转移,并更名为LineageOS

于是编译小米3的lineageos

Cancro是mi3/4 :小米3的电信版和小米4移动版,刷机包前缀都是cancro
https://www.cnblogs.com/jiaoxiake/p/6875864.html 好的下载编译教程
https://github.com/LineageOS 其git仓库
https://www.lineageos.org/ 其官网
https://download.lineageos.org/cancro lineageos对小米的支持
https://wiki.lineageos.org/devices/cancro lineageos对mi3的信息
https://wiki.lineageos.org/devices/cancro/build 官方构建方法
https://wiki.lineageos.org/devices/cancro/install 官方刷机方法

一:找到目标测试:
在官网的支持https://download.lineageos.org/cancro上找到其编译好的镜像测试-同时按博客中的去git中查找是否存在源码与设备是否开源
刷机-adb可以在Android和恢复模式下工作
因为这个机子只能支持到14.1也就是android7.0.想测试更高版本的源代码请买google官方机
测试刷机成功

二:下载源代码
参考:https://www.cnblogs.com/jiaoxiake/p/6875864.html
https://wiki.lineageos.org/devices/cancro/build
远程连接telent
下载构建包,注意和官方的环境有所不同,不要重用
sudo apt-get install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5-dev libsdl1.2-dev libssl-dev libwxgtk2.8-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev
由于需要vpn所以一直用root权操作,注意PATH配置,环变与变量是和shell绑定的,不是用户。
其它步骤一样。直到repo sync

三:编译
获取设备文件除了breakfast。还有单独的项目提供各设备的文件
https://github.com/TheMuppets
在.repo/loccal_mainifest/roomsevice.xml 文件中新增一行:

1
<project name="TheMuppets/proprietary_vendor_xiaomi" path="vendor/xiaomi" remote="github" revision="cm-14.1"/>

然后执行repo sync 同步

编译失败,java-doc:错误找不到okhttp.connectionpool的类文件。
未找到解决方法。