概要

 

Android从2008年开始到本文写的2011年,短短三年的时间里成为手机行业首屈一指的操作系统,在平板电脑,GPS PND甚至工业控制等领域也迅速流行起来。

越来越多的CPU厂商提供完整的Android解决方案使得Android的编译方法千差万别。

本文从Google原生态的Android系统入手,试图跳过所有的CPU厂商从Android自带的ARM QEMU入手一步步的编译出定制的Android系统。

 

(本文原创:欢迎转载请注明出处和作者 Ricky.Wu rickleaf.wu@gmail.com)

资源

 

Android 2.1 r2
Android Goldfish kernel 2.6.29
ubuntu 10.04 LTS AMD64

 

下载源代码


安装工具包


安装必要的工具包

 

$sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev  lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev

 

安装64bit Linux编译32位系统需要的工具包

 

$ sudo apt-get install gcc-multilib g++-multilib libc6-i386 libc6-dev-i386

 

看需要安装下面工具包

 

$ sudo apt-get install make gcc g++ libc6-dev  patch texinfo
 Zlib1g-dev valgrind python

 

下载源代码

 

下载repo工具,更改为可执行权限,并确保安装路径包含在PATH中
$ curl http://android.git.kernel.org/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
建立Android工作目录
$cd ~
$mkdir android_platform
下载Android 2.1 r2源代码
$repo init -u git://android.git.kernel.org/platform/manifest.git /
-b android-2.1_r2
$repo sync

 

定制化Vendor


Android系统的vendor

 

记下Android系统的代码仓库网页
http://android.git.kernel.org/
网页浏览platform/vendor目录

 

 

vendor目录的作用

 

vendor的英文单词有“提供商”的意思,我们结合刚才看到的Android源码仓库中的vendor子目录就可以看出,在Google的Android原始代码里vendor目录包含了CPU硬件提供商的一些信息。
Android系统作为开放的手持设备操作系统,在发布之初必须要提供配置接口给CPU提供商,这样Android的系统才能在不同的CPU上运行。
实际上vendor目录就是Android系统预留给我们加入定制化信息的目录。在这个目录中可以完成对系统默认应用程序的添加移除、及其背光,GPS和OpenGL硬件适应层的vendor库文件或者代码。

 

加入自己的vendor目录

 

参考sample和htc dream建立rickleaf作为一个新的cpu厂商,在rickleaf建立一个heaven的目录作为厂商的一个特别设备

 

Android.mk

 

在android的platform代码中,如果你的代码需要编译或者一些二进制文件和库需要复制到目标板,就必须有个Android.mk文件来管理。
Vendor里面的Android.mk文件主要负责编译CPU厂商的特定代码和复制文件到目标半
Heaven中的Android.mk文件内容如下:

BoardConfig.mk

 

这个文件负责对Android系统的一些配置,包括如下等
ARM CPU的版本
Audio的架构类型
GPS的适应层名字
是否vendor有自己的init.rc文件
Android的image类型(inand需要yaffs2的image,mmc需要ext3或者ext4(android2.3)的image
如果在platform中加入了自己的模块,也可以加入配置机制,并且在这个文件中决定是否加入到系统中来

Heaven下面BoardConfig.mk的内容

AndroidProducts.mk

 

这个文件为PRODUCT_MAKEFILES指定一个mk文件
在指定的mk文件中完成对Android系统中APP层面的一些配置,下面简单列举:
添加默认的Android应用程序
采用哪种dpi
采用哪种图资
为android添加vendor的信息
加入默认铃声

 

PRODUCT_PROPERTY_OVERRIDES
修改一些默认的property设置,关于什么是property请大家去浏览google的文档,可以粗略的理解为类似注册表的东西驻留在内存中,可以供应用程序读写

 

PRODUCT_PACKAGES
PRODUCT_COPY_FILES
Android通过以上两个变量来对android packages和一些系统文件进行添加和移除

 

PRODUCT_LOCALES
这个变有两个作用一个是加入系统支持的语言类型;另一个是决定默认用哪一种图资,比如ldpi,mdpi还是hdpi

 

PRODUCT_BRAND
厂商名字
PRODUCT_NAME
产品名字
PRODUCT_DEVICE
设备名字

 

Linux kernel集成化


获得内核源代码

 

克隆kernel到android_platform根目录
$ git clone git://android.git.kernel.org/kernel/common.git kernel
切换kernel分支到2.6.29
$ cd kernel
$ git checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29

 

增加kernel编译到系统

 

修改platform下面的build

------------------------------- core/Makefile --------------------------------

index 2f316ca..7a92961 100644

@@ -288,6 +288,9 @@ endif

 

 INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img

 

+kernel: $(INSTALLED_BOOTIMAGE_TARGET)

+.PHONY:kernel

+

 ifeq ($(TARGET_BOOTIMAGE_USE_EXT2),true)

 tmp_dir_for_image := $(call intermediates-dir-for,EXECUTABLES,boot_img)/bootimg

 INTERNAL_BOOTIMAGE_ARGS += --tmpdir $(tmp_dir_for_image)

 

AndroidBoard.mk

 


kernel配置

 

make kernelconfig

 

 

make kernelgconfig

 

 

Android系统的编译命令集


Android编译命令

 

执行环境配置命令
$ . build/envsetup.sh (.后面有空格)
当前终端会多出一些命令:
- croot:   Changes directory to the top of the tree.
- m:       Makes from the top of the tree.
- mm:      Builds all of the modules in the current directory.
- mmm:     Builds all of the modules in the supplied directories.
- cgrep:   Greps on all local C/C++ files.
- jgrep:   Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir:   Go to the directory containing a file.

 

—help查看帮助

 

编译模块

 

使用mmm来编译指定目录的模块,如编译Launcher:
$ mmm packages/apps/Launcher/
编完之后生成两个文件:
out/target/product/heaven/data/app/LauncherTests.apk
out/target/product/heaven/system/app/Launcher.apk
可以使用
$ make snod
重新生成system.img,再运行模拟器

 

选择product编译

 

按照如下图的方式,可以选择heaven这个Product

 

用OpenJDK骗过Android的

既然我们在虚拟系统编译,就不用非要去安装官方推荐的java sdk 1.5了。

只要我们在out目录建立这个文件就可以了

 

编译整个系统

 

make -j2 (2表示我有的两个cpu)

 

 

 

 

模拟器加载Android系统


创建Heaven模拟环境

创建标准Android 2.1模拟器命名为heaven
更改~/.android/avd/heaven/config.ini文件
hw.lcd.density=240
sdcard.size=64M
skin.name=WVGA800-L
skin.path=platforms/android-2.1/skins/WVGA800-L
vm.heapSize=24
image.sysdir.1=platforms/android-2.1/heaven/
更改以后,我们只要我们把我们编译好的image放到SDK的
platforms/android-2.1/heaven/目录就可以用emualtor了

把out目录中编译好的zimage改名成qemu-kernel放到Heaven仿真目录中
重新冷启动emulator
emulator -avd heaven -wipe-data
这时候heaven的emualtor的所以image都是我们自己生成的了,当然也可以调试apk到这个emulator

 

加入kernel logo


手机的about信息

更多相关文章

  1. android中的资源,资源与xml文件
  2. android与linux内核对比--《Android系统源代码情景分析》试读
  3. android项目目录结构
  4. Android构建系统和Gradle知识整理
  5. Google:Android 2.3在所有Android系统设备中所占份额为55%
  6. Android P 图形显示系统(九) Android图形显示子系统概述
  7. Android File Transfer – 在 Mac 上也能读取 Android 设备文件
  8. android 系统结构

随机推荐

  1. Ubuntu编译Android使用的FFmpeg
  2. 在定制android设备时,刷机后不全屏显示或
  3. android调节音量——AudioManager的应用
  4. Android开发笔记(八十三)多语言支持
  5. boot.img的解包与打包
  6. Android(安卓)炫酷的多重水波纹 MultiWav
  7. 《疯狂Android讲义》
  8. Android有未接来电后处理(判断未接来电)
  9. 解决android sdk无法更新 更新慢的问题
  10. Android(安卓)ListView滑动过程中图片显