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,包含应用程序相关的数据和用户数据;
- Android 开发笔记 3:Android 系统源码下载与编译
- Android源码下载与编译
- Android源码下载与编译
- android 源码 下载与编译
- Android源码下载与编译:
- android源码下载与编译
- Android系统源码下载与编译、刷机--Nexus6实测
- Mac 系统下Android 源码的下载与编译
- Android 开发笔记 5:Android 内核下载、编译与调试
- android系统源码的下载及编译
- Android系统源码下载及编译
- Ubuntu下android源码下载与编译
- Android内核源码下载与编译
- Android源码下载与编译全过程
- android源码下载与编译过程记录
- Ubuntu下android源码下载与编译
- Android 源码下载编译
- 下载编译Android源码
- 浅谈隐式马尔可夫模型
- 从多个url下载pdf,并且合并成一个
- exists (orcale 返回结果集为真)
- 使用JsonPath解析json数据
- leetcode121- Best Time to Buy and Sell Stock
- Android 开发笔记 3:Android 系统源码下载与编译
- 什么是HashMap?
- root登录Linux图形界面
- python列表与pandas库dataframe:小笔记
- Selenium和PhantomJS介绍
- cookie的expires属性和max-age属性
- 6.2 实现接口
- 配置eclipse反编译
- Java中的正则表达式