zoukankan      html  css  js  c++  java
  • 【转】Android虚拟平台的编译和整合

    原文网址: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信息

  • 相关阅读:
    InnoDB 事务隔离级探索
    套接字 缓冲区 6次拷贝 内核协议栈
    Python Data Structure and Algorithms Tutorial
    任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行
    Linux网络状态工具ss命令使用详解
    不占用额外内存空间能否做到 将图像旋转90度 N × N矩阵表示的图像,其中每个像素的大小为4字节
    尾递归 栈溢出
    t
    t
    __del__ PyPy和CPython的不同点 动态编译(注意不是解释) 析构函数被调用的次数
  • 原文地址:https://www.cnblogs.com/wi100sh/p/4553062.html
Copyright © 2011-2022 走看看