Android 开发笔记 3:Android 系统源码下载与编译

来源:互联网 发布:四旋翼控制算法概述 编辑:程序博客网 时间:2024/06/01 09:20

(Android源码编译环境:Ubuntu 14.04、jdk1.8)

1、Android 系统体系架构


Android 系统由5层结构构成

Linux Kernel(被修改)、HAL硬件抽象层、Library、Android Framework、APP

Android 系统源代码包括后四个层次,不包括Linux Kernel

(参考官网:https://source.android.com)


2、下载Android 源代码

1)安装环境

$ sudo apt-get update

$ 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 ccache libgl1-mesa-dev libxml2-utils xsltproc unzip


2)获取repo

说明:官网下载源码经常连接失败而且速度慢,这里使用科大代码镜像

$ curl https://storage-googleapis.proxy.ustclug.org/git-repo-downloads/repo > repo

$ sudo cp repo /bin

$ sudo chmod a+x /bin/repo

编辑repo,更改REPO_URL为科大代码镜像

REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'


选择一个工作目录,这里是android

$ cd android

$ git config --global user.name "stone927"

$ git config --global user.email "787724030@qq.com"


3)下载源码

$ repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest
(这里使用科大镜像)
可在log中查看当前支持的android分支信息,或使用下列命令

$ git --git-dir=.repo/manifests/.git/ branch -a

选一个需要下载的分支,这里选择Android-7.0.0_r7,可在repo init命令后加-b指定具体的分支,不加-b选项默认master分支。重新repo init前需先删除.repo目录

$ rm -rf .repo/

$ repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-7.0.0_r7


同步源码

$ repo sync

下载过程会持续几小时,具体看网络情况


3、安装openjdk

编译Android源代码需要安装openjdk,版本针对所选的分支有所不同,具体情况如下

(备注:不同版本分支对jdk版本有要求

Android 7.0 (Nougat) - Android 8.0 (O release): Ubuntu - OpenJDK 8, Mac OS - jdk 8u45 or newer
Android 5.x (Lollipop) - Android 6.0 (Marshmallow): Ubuntu - OpenJDK 7, Mac OS - jdk-7u71-macosx-x64.dmg
Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat): Ubuntu - Java JDK 6, Mac OS - Java JDK 6
Android 1.5 (Cupcake) - Android 2.2.x (Froyo): Ubuntu - Java JDK 5


下载openjdk安装包

http://archive.ubuntu.com/ubuntu/pool/universe/o/openjdk-8/openjdk-8-jre-headless_8u45-b14-1_amd64.deb

http://archive.ubuntu.com/ubuntu/pool/universe/o/openjdk-8/openjdk-8-jre_8u45-b14-1_amd64.deb

http://archive.ubuntu.com/ubuntu/pool/universe/o/openjdk-8/openjdk-8-jdk_8u45-b14-1_amd64.deb

安装jdk包

$sudo apt-get update

$ sudo dpkg -i /home/stone/Downloads/openjdk-8-jre-headless_8u45-b14-1_amd64.deb

$ sudo dpkg -i /home/stone/Downloads/openjdk-8-jre-headless_8u45-b14-1_amd64.deb

$ sudo dpkg -i /home/stone/Downloads/openjdk-8-jdk_8u45-b14-1_amd64.deb

安装过程会出错,不过没关系,主要是因为依赖问题,在安装好上面3个包之后使用下面的命令修复依赖关系即可

$ sudo apt-get -f install

若之前设置过java环境变量需要全部删除,重新设置环境变量

$ sudo update-alternatives --config java

$ sudo update-alternatives --config javac


4、编译Android源代码

1)设置环境变量

$ source build/envsetup.sh

$ . build/envsetup.sh

成功设置后可以输入help查看可支持的所有命令,android定义了很多特有的命令用于编译源代码,包括mm、mmm等。

(

croot  切换到源码根目录

m       在源码树的根目录执行make

mm    编译当前目录下的模块

mmm 编译指定目录下的模块

cgrep 在所有C/C++文件上执行grep

jgrep  在所有java文件上执行grep

resgrep 在所有res/*.xml文件上执行grep

godir   转到包含某个文件的目录路径

printconfig  显示当前Build的配置信息

)


2)选择编译目标

选择编译模拟器并打开调试输出(sdk表示模拟器,意思是编译出的镜像实在Android模拟器上运行的)

$ lunch sdk-eng

(备注:输入lunch命令不带参数可显示部分可用参数


参数后缀表示一定含义:

user              最终产品使用user,不带任何调试信息
userdebug    在user的基础上增加调试信息
eng               开发级,带有调试信息和开发工具

)


3)编译源码

$ make -j4

(备注:参数-jn,n表示当前CPU核数,不写默认1。此参数可最大限度提高对硬件的利用率,提高编译速度。)

(错误:


原因是内存不足导致的,按照下列方法扩大内存设置即可

$ export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"  $ ./prebuilts/sdk/tools/jack-admin kill-server  $./prebuilts/sdk/tools/jack-admin start-server  


出现如下信息表示编译成功


最终会在android/out/target/product/<product name>/目录下看到如下三个镜像文件

system.img:Android系统文件、库、可执行文件和预置应用程序等;

ramdisk.img:/init文件和部分配置文件;

userdata.img:将被挂载为/data,包含应用程序相关的数据和用户数据;