分类: Android平台
2018-05-09 17:31:05
去年编译一次,折腾蛮久才弄好,今年准备深入研究一些Android虚拟机源码,发现全忘记了,又要花时间去折腾一次。 就记录备忘下来。方便下次在弄的时候,不用再去查询资料。
我的硬件是 nexus 5. 编译的版本是4.4.4,为什么用这个低版本呢,因为这个版本比较特殊。支持davik 和 art 两种虚拟机。
jdk 分openjdk 和oracle jdk,android 4.4.4 的编译 需要用 oracle jdk 1.6版本 (高版本又是必须用openjdk)。否则会在准备编译工作make clobber时出现错误。
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java6
使用apt-get install repo 安装的repo不行, 用这个覆盖掉吧。
curl > /usr/bin/repo
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install git-core gnupg flex bison gperf build-essential
sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib
sudo apt-get install libc6-dev-i386
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install lib32z-dev ccache
make 工具的版本要求必须是 3.81 和 3.82。 由于不想把make降级。网上看到一个偷懒办法,试验下来至少编译4.4.4 的源码没有问题。 就是修改 build/core/main.mk文件
ifeq (0,$(shell expr $$(echo $(MAKE_VERSION) | sed "s/[^0-9\.].*//") = 3.81))
ifeq (0,$(shell expr $$(echo $(MAKE_VERSION) | sed "s/[^0-9\.].*//") = 3.82))
ifeq (0,$(shell expr $$(echo $(MAKE_VERSION) | sed "s/[^0-9\.].*//") = 4.1)) #加上这一行
记得补上一个endif
因为google域名被墙,所以使用清华源,下载对应的版本分支,我这里选择4.4.4_r1 这个分支
export REPO_URL='/'
repo init -u --depth 1 -b android-4.4.4_r1
repo sync -c -j8
下载时间大概1小时左右,有时候会丢失一些文件,需要多执行几次 repo sync 同步几次。如果硬盘空间有限可以删除.repo 目录, 因为后续编译的中间文件也会占用50G。
aosp-4.4.4_r1
├── abi
├── art
├── bionic
├── bootable
├── build
├── cts
├── dalvik
├── developers
├── development
├── device
├── docs
├── external
├── extract-broadcom-hammerhead.sh
├── extract-lge-hammerhead.sh
├── extract-qcom-hammerhead.sh
├── frameworks
├── hardware
├── libcore
├── libnativehelper
├── Makefile
├── ndk
├── out
├── packages
├── pdk
├── prebuilts
├── sdk
├── system
├── tools
└── vendor
/source/building.html
make clobber
使用 envsetup.sh 脚本初始化环境。请注意,将 source 替换成 .(一个点)可以省去一些字符,这种简写形式在文档中更为常用。
$ source build/envsetup.sh
or
$ . build/envsetup.sh
使用 lunch 选择要编译的目标。确切的配置可作为参数进行传递。例如以下命令:
lunch
列出选择菜单
You're building on Linux
Lunch menu... pick a combo:
1. aosp_arm-eng
2. aosp_x86-eng
3. aosp_mips-eng
4. vbox_x86-eng
5. aosp_deb-userdebug
6. aosp_flo-userdebug
7. aosp_grouper-userdebug
8. aosp_tilapia-userdebug
9. mini_armv7a_neon-userdebug
10. mini_mips-userdebug
11. mini_x86-userdebug
12. aosp_hammerhead-userdebug
13. aosp_mako-userdebug
14. aosp_manta-userdebug
Which would you like? [aosp_arm-eng]
那我选择哪一个呢,我的设备是nexus 5 (这个可是神机). 从 可以找到他的代号是 Nexus 5 hammerhead
那我就选择 aosp_hammerhead-userdebug 这个啦
make -j16
编译过程比较长,需要3-4个小时,产生的out目录比较大,会占用40G(可怜我一共才250G磁盘空间)。可以用个软连接迁移到移动硬盘或其他分区。
我的编译过程比较顺利,没有碰到什么问题。看网上有人遇到不少编译问题。编译完后目录大小
hammerhead-ktu84p
├── bootloader-hammerhead-hhz11k.img
├── flash-all.bat
├── flash-all.sh
├── flash-base.sh
├── image-hammerhead-ktu84p.zip
└── radio-hammerhead-m8974a-2.0.50.1.16.img
再解压展开一下zip文件
hammerhead-ktu84p
├── bootloader-hammerhead-hhz11k.img
├── flash-all.bat
├── flash-all.sh
├── flash-base.sh
├──image-hammerhead-ktu84p
│ ├── android-info.txt
│ ├── boot.img
│ ├── cache.img
│ ├── recovery.img
│ ├── system.img
│ └── userdata.img
└── radio-hammerhead-m8974a-2.0.50.1.16.img
/data/code/aosp-4.4.4_r1/out/target/product/hammerhead/
hammerhead/
├── android-info.txt
├── boot.img
├── cache
├── cache.img
├── clean_steps.mk
├── data
├── fake_packages
├── installed-files.txt
├── kernel
├── obj
├── previous_build_config.mk
├── ramdisk.img
├── ramdisk-recovery.img
├── recovery
├── recovery.img
├── root
├── symbols
├── system
├── system.img
└── userdata.img
是不是 image-hammerhead-ktu84p.zip 里面的包,编译目录下都有。至于前面两个,我猜应该是和设备相关,需要又厂家提供,不在源码包内。
$ cd out/target/product/hammerhead
$ adb reboot bootloader
$ export ANDROID_PRODUCT_OUT=/data/code/aosp-4.4.4_r1/out/target/product/hammerhead
$ fastboot flashall -w
target reported max download size of 1073741824 bytes
wiping userdata...
mke2fs 1.43.3 (04-Sep-2016)
Creating filesystem with 3351034 4k blocks and 838832 inodes
Filesystem UUID: f0268e91-bcf1-4615-9f14-2cf67eb1edd5
Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208 Allocating group tables: done Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done wiping cache...
mke2fs 1.43.3 (04-Sep-2016)
Creating filesystem with 179200 4k blocks and 44832 inodes
Filesystem UUID: 74629560-fc3f-403c-a085-fb3e6522e80d
Superblock backups stored on blocks: 32768, 98304, 163840 Allocating group tables: done Writing inode tables: done Creating journal (4096 blocks): done Writing superblocks and filesystem accounting information: done --------------------------------------------
Bootloader Version...: HHZ12k
Baseband Version.....: M8974A-2.0.50.2.27 Serial Number........: 0aa83005029aa24e
--------------------------------------------
checking product...
OKAY [ 0.100s]
sending 'boot' (8700 KB)...
OKAY [ 0.490s]
writing 'boot'...
OKAY [ 0.741s]
sending 'recovery' (9284 KB)...
OKAY [ 0.549s]
writing 'recovery'...
OKAY [ 0.780s]
erasing 'system'...
OKAY [ 1.231s]
sending 'system' (291004 KB)...
OKAY [ 9.341s]
writing 'system'...
OKAY [ 21.185s]
erasing 'userdata'...
OKAY [ 10.514s]
sending 'userdata' (4288 KB)...
OKAY [ 0.350s]
writing 'userdata'...
OKAY [ 0.476s]
erasing 'cache'...
OKAY [ 0.664s]
sending 'cache' (428 KB)...
OKAY [ 0.230s]
writing 'cache'...
OKAY [ 0.216s]
rebooting...
finished. total time: 47.445s
刷机时候碰到一个问题
使用adb devices 可以发现设备,但是使用 fastboot devices 无法发现设备。后来切到root用户下就可以
详细可以参考官方文档