1、在上一篇文章《Ubuntu 10.10下搭建Android开发环境》的基础上,安装JDK1.5并配置环境变量
java版本
显示信息:
java版本“1.5.0_22”
Java(TM) 2 运行时环境,标准版(内部版本 1.5.0_22-b03)
Java HotSpot(TM) 服务器 VM(内部版本 1.5.0_22-b03,混合模式)
然后就安装成功了。
2.安装必要的工具
1.GIT工具
Git 是 Linux Torvalds 开发的开源分布式版本控制软件,用于帮助管理 Linux 内核的开发。 它与Subversion、CVS等集中式版本控制系统不同。 在集中式版本控制系统中,只有一个存储库(repository)和许多工作目录(working copy),而在像 Git 这样的分布式版本控制系统中(其他主要的分布式版本控制系统包括 BitKeeper、Mercurial、GNU Arch、Bazaar、 Darcs、SVK、Monotone等),每个工作目录都包含一个完整的仓库,它们可以支持离线工作,本地提交可以稍后提交到服务器。 理论上,分布式系统也比集中式单服务器系统更强。 单服务器系统中一旦有一台服务器出现故障,整个系统就无法运行。 一般来说,分布式系统不会受到一两个节点的深刻影响。
2. 卷曲
Curl 是一个文件传输工具,在 URL 语句的帮助下在命令行上工作。 它支持很多合约,包括FTP、FTPS、HTTP、HTTPS、TELENT等。我们需要安装它才能从互联网上获取Repo脚本文件。
3. 回购协议
由于Android是由kernel、Dalvik、Bionic、prebuilt、build等多个Git项目组成,因此Android项目编译了一个名为Repo的Python脚本来统一管理这个项目的仓库搭建android源码编译环境,使得Git的使用更加简单。
在终端上,使用以下命令进行安装:
sudo apt-get install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
安装仓库脚本
在终端执行:
光盘~
目录目录
然后,将 bin 路径添加到 PATH:
导出 PATH=$PATH:~/bin
然后执行以下两行指令下载repo脚本并更改可执行属性:
卷曲 > ~/bin/repo
chmod a+x ~/bin/repo
3.获取Android源码
1.首先创建一个目录来保存源码
mkdir ~/myandroid
2.使用以下命令获取源码:
仓库初始化 –u git://android.git.kernel.org/platform/manifest.git
这个过程会持续很长时间(作者下载了三天)。 下载完成后,会听到类似repoinitializedin/android的提示,说明本地仓库已经初始化完毕,包含了最新的源码。
如果我们想要获取某个分支版本的代码而不是主线代码,我们需要使用-b参数来指定分支的名称,例如:
repo init -u git://android.git.kernel.org/platform/manifest.git –b android-2.1_r2
如果我们只是想获取某个项目的代码,比如kernel/common,则不需要repo脚本,直接使用Git工具即可。 如果你仔细研究一下repo脚本,你会发现,repo脚本虽然是组织Git工具来获取各个Project并组织成同一个Android项目。
git 克隆 git://android.git.kernel.org/kernel/common.git
我们使用repo脚本来获取各个项目,那么我们需要将整个Android代码树同步到本地,如下:
仓库同步项目1 项目2 ...
3. 同步代码
回购同步。
4.编译Android源码
进入android源码目录,执行以下命令:
$make
这将显示以下信息:
xiongmc@xiongmc-pc:~/android/bin$ cd src-2.2/
xiongmc@xiongmc-pc:~/android/bin/src-2.2$ ls
仿生cts设备硬件出sdk
可启动的 dalvik 外部 Makefile 软件包系统
构建开发框架 ndk prebuilt
xiongmc@xiongmc-pc:~/android/bin/src-2.2$
=================================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.2
TARGET_PRODUCT=通用
TARGET_BUILD_VARIANT=eng
目标模拟器=
TARGET_BUILD_TYPE=发布
TARGET_BUILD_APPS=
TARGET_ARCH=手臂
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=发布
BUILD_ID=主控
。 。 。 。 。 。 。
。 。 。 。
。 。 。
。 。 。 。 。
。 。 。 。 。 。
这个过程花了很长时间(大概2小时左右,和我自己的杯子有关)
5.在模拟器上运行并编译android
android SDK的模拟器程序在android-sdk-linux_x86-1.0_r2/tools/下,模拟器需要加载一些后缀为.image的文件,内核在android-sdk-linux_x86-1.0_r2/tools/lib下/images 默认加载 -qemu (kernel) ramdisk.img system.img userdata.img 这三个
编译完android后,
模拟器程序在~/project/android/cupcake/out/host/linux-x86/bin下,
ramdisk.img system.img userdata.img 文件位于 ~/project/android/cupcake/out/target/product/generic 下
我们降低模拟器的环境变量
$ vim ~/.bashrc
在.bashrc中添加环境变量,如下
#java 程序开发/运行的一些环境变量
导出 ANDROID_PRODUCT_OUT=~/project/android/cupcake2/out/target/product/generic
ANDROID_PRODUCT_OUT_BIN=~/project/android/cupcake2/out/host/linux-x86/bin
导出路径=${PATH}:${ANDROID_PRODUCT_OUT_BIN};
最后,同步此更改:
$源~/.bashrc
启动模拟器:
$ 模拟器-image system.img -data userdata.img -ramdisk ramdisk.img
最后,进入android桌面,即表示成功。
out/host/linux-x86/bin下生成了很多有用的工具(包括android SDK/tools的所有工具),所以可以在eclipse中指定android SDK的路径到out/host/linux-x86/bin进行开发
=================================================== == ===============
6.编译linux内核(可选,主要是系统移植所需)
直接制作android源码时,没有制作linux内核。 因此,模拟器正在运行,所以不需要编译linux内核。 如果要迁移android,或者添加、删除驱动,需要编译linux内核
Linux内核的编译将在后面的文章中介绍。
7、编译单个模块(如果需要更改系统的个别应用,则需要编译单个应用)
android中的应用程序可以单独编译,编译后需要重新生成system.img
在源码目录下执行
$.build/envsetup.sh (注意:后面有一个空格。)
只需要几个命令即可:
- croot:将目录更改为树的顶部。
- m:从树的顶部开始。
- mm:构建当前目录中的所有模块。
- mmm:构建提供的目录中的所有模块。
- cgrep:对所有本地 C/C++ 文件进行 Greps。
- jgrep:对所有本地 Java 文件进行 Greps。
- resgrep:对所有本地 res/*.xml 文件进行 Greps。
- godir:转到包含文件的目录。
可以添加--help来查看使用情况
我们可以使用mmm来编译指定目录的模块,比如编译联系人,具体操作如下:
$.build/envsetup.sh
$mmm 包/应用程序/联系人/
编译后生成两个apk文件:
输出/目标/产品/通用/数据/应用程序/ContactsTests.apk
出/目标/产品/通用/系统/应用程序/Contacts.apk
system.img 可以使用 make snod 重新生成
再次运行模拟器
8、android SDK源码编译【直接执行make命令不包含make sdk。 make sdk用于生成SDK,以便我们使用与源码同步的SDK来开发android】步骤如下:
1)修改/frameworks/base/include/utils/Asset.h
将“UNCOMPRESS_DATA_MAX = 1 * 1024 * 1024”更改为“UNCOMPRESS_DATA_MAX = 2 * 1024 * 1024”
原因是Eclipse编译项目需要小于1.3M的缓冲区
2)编译ADT(记住我们先编译adt,然后编译sdk)
如果下载cupcake源码,需要进入:development/tools/eclipse/scripts目录,如果下载主线代码,需要进入:sdk/eclipse/scripts目录(会有build_server.sh脚本命令) ,执行以下命令
$export ECLIPSE_HOME=你的 Eclipse 路径
$./build_server.sh 放置ADT的路径
注意:执行./build_server.sh命令时,out/host/linux-x86/目录下生成的sdk以及我们之前make后生成的文件(ramdisk.img、userdata.img、system.img)都会被消除这就是我们先编译adt再编译sdk的原因。
3)执行make sdk。
$ 制作 SDK
编译很慢。 编译好的SDK存放在out/host/linux-x86/sdk/目录下,其中包含android-sdk_eng.xxx_linux-x86.zip文件和android-sdk_eng.xxx_linux-x86目录。 android-sdk_eng.xxx_linux-x86 是SDK目录
注意:使用mmm命令编译模块时,SDK输出文件也会被清理,所以最好删除android-sdk_eng.xxx_linux-x86
4)关于环境变量和android工具的选择
目前的android工具有:
A.我们从网上下载的SDK(tools下有很多android工具,lib/images下有img图片)
B、make sdk编译出来的SDK(tools下还有很多android工具,lib/images下还有img图片)
C、make编译出来的out目录(tools下还有很多android工具,lib/images下还有img图片)
那么我们应该如何使用这些工具和img呢?
首先,我们不会使用选项A的工具和img,因为一般来说它比较旧,并且源代码不同步。 测试发现,如果使用选项B的tool和img搭建android源码编译环境,android模拟器的窗口会变小(可能无法加载皮肤),而选项C的tool和img则不会出现这个问题。
有些android工具依赖于android.jar(比如android),所以我们在eclipse中使用选项B的工具(SDK),以及选项C的img。其实从emulator -help-build-也可以看出ANDROID_PRODUCT_OUT指向C选项的img目录的图像
但除了A选项的tool和img之外,sdcard无法加载B或C的模拟器,原因尚不清楚。
5)安装并配置ADT
安装和配置ADT请参考官方文档
(1)Eclipse IDE下载地址:
(2)ADT安装地址: ,注意安装与eclipse的版本一致,通常JEE版本无法更新ADT,最好使用java Base版本。
6)创建Android虚拟设备
编译出来的SDK没有AVD(Android Virtual Device),我们可以通过android工具查看:
安卓列表
输出是:
可用的 Android 目标:
[1] 安卓1.5
API 级别:3
外观:HVGA-P、QVGA-L、HVGA-L、HVGA(默认)、QVGA-P
可用的 Android 虚拟设备:
表明没有AVD。 如果没有AVD,eclipse编译项目时会出现错误(Failed to find a AVD Compatible with target 'Android 1.5'. Launch aborted.)
创建 AVD:
android 创建avd -t 1 -c ~/sdcard.img -n myavd
可以使用android –help查看之前命令选项的使用情况。创建中有一些选项,默认即可
然后执行android list,可以看到AVD存放的位置
以后每次运行模拟器的时候都必须加上-avd myavd或者@myavd选项,这样eclipse才能在你打开的模拟器中调试程序
注意:
这样就生成了SDK和ADT,并按照官方文档集成到Eclipse中,这里不再赘述。
建立一个新的android项目并尝试自己编译的sdk。
事实上,我现在的工作早已与Android源码脱节了。 看起来开发应用程序会有一些困难,但是当我需要查看Android源代码时几乎不存在。 但最近我遇到了一些事情。 有同学告诉我,你以前不是做Framework开发的吗? 我这里有一个项目,你看看你能不能做...很尴尬的发现我现在不但做不了这份工作,而且我已经缺乏整理思绪的能力了,因为我太对这个领域不熟悉。 这是不可能的,我必须果断地重新捡起来。
1、编译软硬件环境要求
由于你现在不应该编译非常旧的Android源代码(指2.2或更早版本),64位系统现在是必然的选择。 我还是根据自己的习惯选择Ubuntu系统。 很久很久以前,上一家公司做开发的时候android 编译源码环境,我用的是Ubuntu10.04和12.04。 后来自己玩就用了14.04。 现在已经快2018年了,虽然18.04版本还没有发布,但是怎么用都没有问题。 你必须使用16.04,对吧? 不要问我为什么一直使用LTS版本,因为Google的官方文档推荐了这个系统,可能是因为Canonical对LTS系统的支持周期很长。
硬件方面,对硬盘的需求比较大。 如果使用Repo方式更新源码,源码下载下来并解压一些压缩包后,整个源码目录会有60G-70G的大小,然后编译会生成一些镜像和库文件占用更多空间。 120GB是最低要求android 编译源码环境,如果可以的话给更多,比如有人会在这个环境下开发App。 内存和CPU自然是越强越好。 内存+swap最好16G以上。
值得一提的是,如果硬盘是SSD固态硬盘,编译速度可以明显提升。 编译时检查硬件资源时,发现硬盘的利用率仍然很高,在95%-100%。 这里的硬件是虚拟机上安装的Ubuntu 16.04.3,CPU是E3 1231V3,给虚拟机4个线程,内存8GB,硬盘直接分配200G。
Java在Android中的作用不用说,没有JDK肯定是不够的。 但众所周知,Oracle和Google在Java领域的骂战非常激烈,甚至严重。 如果你直接使用OracleJDK,很快就会有大量Oracle支持的法务人员找上门来。 Google虽然不是肉食者,但总是会花很多心思,它无时无刻不在想着摆脱Oracle的纠缠(让Kotlin在App开发层面取得领先是一个非常明显的迹象),所以最近的Android各大版本(我觉得好像是从5.0或者5.1开始)源码编译都使用OpenJDK(其实也可以用OracleJDK编译,但是需要做一些改动)。
由于使用的是Ubuntu 16.04,所以安装OpenJDK只需要2行命令:
sudo apt-get update sudo apt-get install openjdk-8-jdk
官方文档给出的需要安装的包如下:
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-mul tilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
如果一切顺利,那么理论上你已经完成了Android源码编译环境的搭建。 当然,在安装上述包的时候,你可能会遇到各种各样的问题。
这一步可以参考官方文档:
2.下载Android源码
这一步可以参考官方文档:
首先安装Repo,这是Google为我们提供的,用于处理Android相关的git操作。 我们知道Android源代码的体积非常大(几十GB),实际上是由无数小的git项目组成的。 该命令直接完成了整个AOSP的源码。
首先来到你的主目录,例如我的系统中cd到/home/kael。
然后执行2步:
mkdir ~/bin PATH=~/bin:$PATH
之后,下载Repo工具并授予执行权限
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repochmod a+x ~/bin/repo
下载完成后,您可以初始化Repo。 你可以理解为这一步是让Repo工具知道你要下载那个分支的Android源码。 本质上,就像为git设置代码源一样。
首先创建一个目录,后面用来下载源码,名字任意,比如AndroidSource:
mkdir WORKING_DIRECTORY cd WORKING_DIRECTORY
然后配置git的姓名和电子邮件地址,虽然我完全不明白为什么Google让我们这样做:
git config --global user.name "Your Name" git config --global user.email "you@example.com"
接下来,选择您要下载的 Android 源代码分支。 如果选择master分支,则只需要
repo init -u https://android.googlesource.com/platform/manifest
就是这样,下载的代码就是最新的master分支。 而如果你有目的下载源码,你可以参考它来选择你需要的分支。
选择合适的Android源代码分支,我的Nexus 6没有8.0源代码,哎…
比如你有Nexus 5X手机,你可以选择android-8.0.0_r32,这样你编译的系统镜像就可以自己刷到手机上(有风险,谨慎操作)。
repo init -u https://android.googlesource.com/a/platform/manifest -b android-8.0.0_r32
完成Repo的初始化后,执行sync即可。
repo sync
OK,如果一切正常,执行后仍然可以看到正在下载的源码。 然而,由于众所周知的原因,下载Android源代码很可能会遇到网络问题。 好吧好吧,作为一个开发者,你应该有自己的解决方案……不多说了,说多了我可能就做不到了 Blogging 就无从谈起了。
当世界老了,下载完成后,就可以开始编译了。
3.编译源码
源代码的clean命令和很久以前不一样了。 我记得以前是clean.run
make clobber
可以清除之前的编译结果。 当然,刚刚下载源码的人不需要运行这一步。
然后初始化编译环境:
source build/envsetup.sh
如果你懒得打字,可以用“。” 而不是来源,那就是
. build/envsetup.sh
然后选择编译的目标模式,有3个选项,分别是
用户
用户模式的限制最多。 如果你的编译结果要作为市场产品使用,那么就使用这些模式。 这种模式就像普通的手机ROM一样。 没有root权限,各种复制日志默认关闭。
用户调试
提供root权限,还可以调试,适合公开测试。
英语
基本上所有权限都开放了,还带了一些额外的调试工具。其实开发阶段就选择了这种模式。
由于您基本上是自己研究,因此必须选择 eng 模式。
lunch aosp_arm-eng
然后才是真正的编译
make -j4
这里的-j4参数是设置编译线程数,根据编译环境的硬件配置来确定。 如果你的笔记本有多个CPU、大量核心甚至超线程,那么可以增加数量,比如make -j32。 如果你的笔记本很普通,我见过线程数调整为4、2甚至1。如果在垃圾笔记本中开启过多的线程,结果很可能根本无法编译,就会直接蓝屏。
开始编译Android源码,慢慢等待
然后就静静等待编译完成即可。 一般来说,编译时间超过1小时是正常的。 如果配置太差,可能需要好几个小时。 哈哈还记得我在公司的时候,用一台Core E2140+2G的笔记本编译Android 4.0的源码,好像需要5个小时。 我配置的是E3 1231V3+16G显存。 虚拟机上安装了Ubuntu系统。 虚拟机分配了4个CPU线程和8GB视频内存。 编译时间为2小时10分钟。
Android源码编译完成,耗时2小时10分钟,速度还不错
编译完成后,整个AndroidSource目录占用了114G的空间,所以还是需要分配更多的硬盘!