Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1856985
  • 博文数量: 38
  • 博客积分: 690
  • 博客等级: 中士
  • 技术积分: 3715
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-27 14:06
文章分类

全部博文(38)

文章存档

2018年(8)

2016年(4)

2015年(2)

2014年(1)

2013年(3)

2012年(20)

分类: Android平台

2018-05-09 17:31:05


去年编译一次,折腾蛮久才弄好,今年准备深入研究一些Android虚拟机源码,发现全忘记了,又要花时间去折腾一次。 就记录备忘下来。方便下次在弄的时候,不用再去查询资料。

我的硬件是 nexus 5. 编译的版本是4.4.4,为什么用这个低版本呢,因为这个版本比较特殊。支持davik 和 art 两种虚拟机。

一、 相关工具安装

1、安装jdk

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 

2、repo工具

使用apt-get install repo 安装的repo不行, 用这个覆盖掉吧。

curl   > /usr/bin/repo 

3、安装依赖包

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 

4、其他工具

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

二、下载源代码

1、下载源码

因为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。

2、下载设备驱动

  1. 从谷歌网址  知道 Android 4.4.4 r1 源码编译成功后的镜像文件的编号为 KTU84P
  2. 在谷歌网址 https://developers.google.com/android/drivers 上,查询到编号 KTU84P 对应的Nexus 5设备刷机需要的驱动设备文件的下载地址https://developers.google.com/android/drivers#hammerheadktu84p 下载 3个 文件 broadcom-hammerhead-ktu84p-5a5bf60e.tgz,lge-hammerhead-ktu84p-49419c39.tgz,qcom-hammerhead-ktu84p-f159eadf.tgz。
  3. 使用tar xzvf 命令 解压三个 tgz文件。得到 3个sh文件extract-broadcom-hammerhead.sh extract-lge-hammerhead.sh extract-qcom-hammerhead.sh。用chmod 命令添加执行权限;
  4. 执行3个脚本;会输出一些代码文件分别到vendor/broadcom vendor/lge vendor/qcom.
    vendor
    ├── broadcom
    ├── lge
    └── qcom

3、代码目录

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

1、清理

make clobber 

2、设置环境

使用 envsetup.sh 脚本初始化环境。请注意,将 source 替换成 .(一个点)可以省去一些字符,这种简写形式在文档中更为常用。

$ source build/envsetup.sh
or
$ . build/envsetup.sh 

3、选择目标

使用 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 这个啦

4、编译代码

make -j16 

编译过程比较长,需要3-4个小时,产生的out目录比较大,会占用40G(可怜我一共才250G磁盘空间)。可以用个软连接迁移到移动硬盘或其他分区。
我的编译过程比较顺利,没有碰到什么问题。看网上有人遇到不少编译问题。编译完后目录大小

四、刷机

1、先看一下我从google网站下载google提供制作好的nexus 5 刷机包有那些内容。

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

2、再看一下我刚刚从源码编译玩的目录

/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 里面的包,编译目录下都有。至于前面两个,我猜应该是和设备相关,需要又厂家提供,不在源码包内。

3、开始刷机

$ 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用户下就可以

详细可以参考官方文档

阅读(3085) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~