原文网址:http://blog.csdn.net/rickleaf/article/details/6369065

概要

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信息

转载于:https://www.cnblogs.com/wi100sh/p/4553062.html

【转】Android虚拟平台的编译和整合相关推荐

  1. 高通Android智能平台环境搭建_编译流程分析

    高通Android智能平台环境搭建_编译流程分析 高通平台环境搭建,编译,系统引导流程分析 TOC \o \h \z \u 1. 高通平台android开发总结. 7 1.1 搭建高通平台环境开发环境 ...

  2. android全平台编译libjpeg-turbo并基于ANativeWindow加载JPEG图片

    图形图像实践 android全平台编译libjpeg-turbo并基于ANativeWindow加载JPEG图片 android全平台编译libpng并基于ANativeWindow加载PNG图片 概 ...

  3. Windows 和 android 平台Boost编译方法

    1.Windows 平台编译 环境 Windows 10 Visual Studio 2015  boost 1.64 步骤 直接执行 bootstrap.bat 之后直接运行 bjam.exe,或者 ...

  4. ogre3d for android,ogre3D在Mac平台的编译

    本文主要介绍如何在Mac平台下编译一份可以在iOS上运行的ogre3d引擎的sdk,OGRE简单来说就是一个图形引擎,并且也只是一个图形引擎,不像cocos2dx之类的游戏引擎,包括网络,声音和物理碰 ...

  5. Pro Android 4 第一章 Android 开发平台介绍

    当今这个时代,计算比以往任何一个时代都距离人们更近.各种手持设备已经变身为计算平台.无论是平板和是手机,移动设备凭借其强大的通用计算能力,已经成为真正意义上的个人电脑(PC).所有的传统计算机厂商已经 ...

  6. 高通Android智能平台开发总结

    高通Android智能平台开发总结 1. 高通平台android开发总结. 7 1.1 搭建高通平台环境开发环境. 7 1.2 搭建高通平台环境开发环境. 7 1.2.1 高通android智能平台概 ...

  7. Qlcomm Android 开发环境,编译

    1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通开发板上烧录文件系统 建立高通平台开发环境 高通平台,android和 modem 编译流程分析 高通平台 7620 启动流 ...

  8. android学习和广告平台赚钱(android广告平台哪个好)

    原文写于2012年4月份. 前言: 2011年11月份我开始学习android软件开发(本人有良好的java基础.web开发基础.c++基础),2011年12月份开始开发第一款手机软件(软件名字就不透 ...

  9. 虚拟地址空间以及编译模式

    原文链接 虚拟地址空间以及编译模式 < 上一页虚拟内存到底是什么?为什么我们在C语言中看到的地址是假的? C语言内存对齐,提高寻址效率下一页 > 所谓虚拟地址空间,就是程序可以使用的虚拟地 ...

最新文章

  1. Windows API实现窗口居中
  2. Deep learning前的图像预处理
  3. 解决 DevExpress GridControl 数据编辑后无法保存
  4. Linux运行结果是nan,linux命令学习
  5. Flutter 混合开发实战问题记录(三)打包并上传flutter aar(包含三方plugin) 到maven...
  6. php mysql生成excel文件,PHP导出MySQL数据到Excel文件简单示例
  7. 盘点填报功能的9大应用场景,解决填报难题(附模板)
  8. Ionic简介和环境安装
  9. 花书+吴恩达深度学习(十五)序列模型之循环神经网络 RNN
  10. JS获取地址栏参数的方法
  11. AndroidTestCase常用的两段配置
  12. 如何在 Linux 上检查可用磁盘空间 [终端和 GUI]
  13. 2015年 不可不知的五大热点话题
  14. 开源免费录屏软件整理
  15. 打印机计算机故障或繁忙,联想打印机繁忙是怎么回事?
  16. Vant(有赞)UI框架爬坑记——图片轮播+预览
  17. 可行性分析与需求分析
  18. 【转】MMORPG开发入门【强力推荐,写的很好】
  19. “下班不关电脑,外套不穿出办公室”,这届年轻人为了假装加班,拼了
  20. 洋钱罐借款「顶风作案」

热门文章

  1. docker 网络设置
  2. hdfs java api读写
  3. 程序员面试需要出示身份证和毕业证原件吗?
  4. freecplus框架简介
  5. 一般绘CAD图用计算机配置,cad图形界限一般是多少
  6. 《Docker进阶与实战》——3.3节Docker image的组织结构
  7. Maven学习总结(34)——Maven settings.xml配置解读
  8. java编写程序_对输入的年月日_给出该天是该年的第多少天?_编写Java程序。当以年月日的格式输入一个日期时,输出该年是否是闰年,该月有几天,该日是星期几...
  9. python提取文本中的手机号_Python从vcf文件中读取手机号并进行去重操作
  10. 中关村在线 测试软件,主观测试软件:ZOL Monitor LCD 简介