Android 4.4源码编译过程(包括SDK)

Android源码下载完后的目录如下:


整个代码的大小为:25.559GB。


一、构建系统

如下用于构建Android源码树的指令应用于所有的代码分支,包括master分支。


1.选择分支

构建系统的一些要求是由将要选择编译的源代码的版本决定的。通过网址http://source.android.com/source/build-numbers.html来查看当前Android所有的分支列表。可以选择下载和构建最新的源代码(称为“master”),在这种情况下,当初始化库时,可直接省去了指定分支参数。


一旦选择好了分支,按照如下的命令来建立构建系统。基本的构建命令序列如下:


2.初始化

使用envsetup.sh脚本来初始化环境,注意可以用“.”字符来代替source。如下:

$source build/envsetup.sh

$ . build/envsetup.sh

且后一种简短格式在文件中使用的更加频繁。


3.选择目标

使用lunch命令来选择哪一种目标来构建。确切的配置可以作为参数传递给命令,如下:

$lunch aosp_arm-eng
以上的例子指定了构建一个完成的模拟器,其所有的debugging使能,输入该命令后,



若lunch后面没有参数,那么会通过一个目录来让提示让你选择。如下:


所有的构建目标是使用BUILD-BUILDTYPE形式,其中BUILD是代码名表示特定的特征结合,如下是部分列表:


而BUILDTYPE如下:


更好的关于构建和运行在实际硬件上的信息,参考:http://source.android.com/source/building-devices.html


4. 构建代码

使用make构建一切,GNU make可以通过使用-jN参数来处理并行任务。此处的N,根据所用的计算机的硬件的核数来指定,一般N指定为CPU核心的1到2倍。例如在一个dual-5520机器上(2个CPU,每个CPU4个核,每个核2个线程),那么最快的构建是使用make -j16或make -j32。

$make -j4

5.运行

可以在模拟器上运行构建的Android系统,可以flash到设备上,请注意已经使用lunch命令构建的目标。最好不要把构建的目标运行另一个不同的目标上。

1)模拟一个android设备

编译完成后,先设置环境变量,在ete/profile中加入如下变量:


然后,敲入如下命令来运行模拟器:

$emulator

2)Flash到设备上

为了Flash到设备上,需要使用fastboot,成功构建后,该命令包含在你的路径中。在引导时,要么通过适当的组合键手动放置设备到fastboot模式。或者从shell中输入如下命令进入fastboot模式

$adb reboot bootloader

一旦设备处于fastboot模式,运行:

$fastboot flashall -w
-w选项用于擦去设备上的/data部分,对于第一次flash一个特定设备这是有用的,否则不是必需的。

更多的关于在实际硬件上构建和运行的信息,见:http://source.android.com/source/building-devices.html


二、使用ccache

ccache是一个编译器ccache用于C和C++。可以让构建更加快速。在源代码的根目录处,做如下操作:

$export USE_CCACHE=1
$export CCACHE_DIR=/<path_of_your_choice>/.ccache
$prebuilts/misc/linux-x86/ccache/ccache -M 50G
建议的cache大小为50-100G


SDK生成

使用如下命令即可

repo init -u https://android.googlesource.com/platform/manifest -b master -g all,-notdefault,tools
repo sync
source build/envsetup.sh
lunch sdk-eng
make sdk
可参考android源代码目录sdk/docs下howto_build_SDK.txt中说明


可以使用如下操作来查看使用的ccache大小

$watch -n1 -d prebuilts/misc/linux-x86/ccache/ccache -s

若使用Ice Cream Sandwich(4.0.x)或更老的版本,需要用prebuilts来代替prebuilts/misc


运行过程中存在的问题:

问题:qemu: could not load initrd 'ramdisk.img'

解决方法:

进入ramdisk.img所在的目录(~/my_android/out/target/product/generic/),运行如下命令

chmod 777 -R *


且在运行emulator时,加入全路径名,即可,如下:

emulator -kernel /my_android/prebuilts/qemu-kernel/arm/kernel-qemu-armv7 -sysdir /my_android/out/target/product/generic/ -system system.img -data userdata.img -ramdisk /my_android/out/target/product/generic/ramdisk.img -skindir skins/ -skin HVGA -partition-size 768
其中skins是从SDK目录中复制过来的。


编译中可能会出现的问题

[Error]collect2: ld terminated with signal 9 [Killed]

[Solution]

free -m查到内存快被耗光但是虚拟内存为0。通过增加虚拟内存解决该问题。

增加虚拟内存的方法如下:

查看内存空间大小:free -m // m表示显示的字节单位是m(megabytes)

下面我们就来增加系统的 Swap 大小。

1.首先用命令free查看系统内 Swap 分区大小。
free -m

total used free shared buffers cached
Mem: 1002 964 38 0 21 410
-/+ buffers/cache: 532 470
Swap: 951 32 929

可以看到 Swap 只有951M,不符合 Oracle-xe-client 的安装要求。

2.创建一个 Swap 文件。
mkdir swap
cd swap
sudo dd if=/dev/zero of=swapfile bs=1024 count=100000

出现下列提示,上面命令中的 count 即代表swap文件大小。

记录了 100000+0 的读入
记录了 100000+0 的写出
102400000 字节 (102 MB) 已复制,0.74704 秒,137 MB/秒

把生成的文件转换成 Swap 文件
sudo mkswap swapfile

Setting up swapspace version 1, size = 102395 kB
no label, UUID=09fde987-5567-498a-a60b-477e302a988b

3.激活 Swap 文件。
sudo swapon swapfile

再次查看 free -m 的结果。

total used free shared buffers cached
Mem: 1002 967 34 0 22 410
-/+ buffers/cache: 534 467
Swap: 1053 32 1021

添加成功。

扩展:
如果需要卸载这个 swap 文件,可以进入建立的 swap 文件目录。执行下列命令。
sudo swapoff swapfile

http://it.china-b.com/linux/xtgl/20090525/21754_1.html

如果需要一直保持这个 swap ,可以sudo -s换到root
然后把它写入 /etc/fstab 文件。

swapfilepath swap swap defaults 0 0

引用“http://wangkerui.com/%E8%BD%ACubuntu%E4%BF%AE%E6%94%B9%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%

fantasy@Master:~/swap$ free -m
             total       used       free     shared    buffers     cached
Mem:          2002        449       1552          0         59        243
-/+ buffers/cache:        147       1855
Swap:         1119          0       1119


fantasy@Master:~/swap$ sudo swapoff swapfile 
fantasy@Master:~/swap$ sudo dd if=/dev/zero of=swapfile bs=1024 count=1000000
1000000+0 records in
1000000+0 records out
1024000000 bytes (1.0 GB) copied, 14.848 s, 69.0 MB/s
fantasy@Master:~/swap$ sudo mkswap swapfile
Setting up swapspace version 1, size = 999996 KiB
no label, UUID=044868c4-5c7f-4964-af62-4d6632ad8e5f
fantasy@Master:~/swap$ sudo swapon swapfile
fantasy@Master:~/swap$ free -m
             total       used       free     shared    buffers     cached
Mem:          2002       1353        649          0         59       1122
-/+ buffers/cache:        171       1830
Swap:         1998          0       1998

[Error]

fantasy@Master:~/my_android/out/target/product/generic$ emulator
emulator: ERROR: You did not specify a virtual device name, and the system
directory could not be found.


If you are an Android SDK user, please use '@<name>' or '-avd <name>'
to start a given virtual device (see -help-avd for details).

Otherwise, follow the instructions in -help-disk-images to start the emulator

[Solution]

fantasy@Master:~/my_android$ source build/envsetup.sh

fantasy@Master:~/my_android$ lunch sdk-eng

fantasy@Master:~/my_android$ emulator

emulator: WARNING: system partition size adjusted to match image file (550 MB > 200 MB)


NAND: could not open file /home/fantasy/my_android/out/target/product/generic/cache.img, Permission denied


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值