• ANDROID Porting系列一、ANDROID编译系统


    译自:http://source.android.com/porting/build_system.html

    Android使用一个自定义生成系统生成工具,二进制文件和文档。本文档提供了一个建立Android的编译系统的概述。

    Android的编译系统需要最新版本的GNU make, (请注意,Android使用GNU的先进功能,可能使用还没有出现在网站的GNU Make)。在继续之前,请通过运行%make –v。查询您的make版本。如果您不具有版本3.80或更高版本,您需要升级您的make版本。

    了解Makefile

    Makefile定义了如何建立一个特定的应用程序。 Makefile文件通常包括下列全部内容:

    Name:给你建立一个名称(LOCAL_MODULE:= <build_name>)。

    Local Variables:用CLEAR_VARS清除局部变量(include $(CLEAR_VARS)).。

    Files:确定哪些文件取决于您的应用程序(LOCAL_SRC_FILES:= main.c)。

    Tags:定义标记,如必要(LOCAL_MODULE_TAGS:=eng development)。

    Libraries:定义您的应用程序是否与其他libraries链接(LOCAL_SHARED_LIBRARIES:= cutils)。

    Template file:包含一个模板文件来定义,强调为特定目标(工具包括$(BUILD_EXECUTABLE))。

    下面的代码段演示了一个典型的Makefile。

    LOCAL_PATH := $(my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := <buil_name>
    LOCAL_SRC_FILES := main.c
    LOCAL_MODULE_TAGS := eng development
    LOCAL_SHARED_LIBRARIES := cutils
    include $(BUILD_EXECUTABLE)
    (HOST_)EXECUTABLE, (HOST_)JAVA_LIBRARY, (HOST_)PREBUILT, (HOST_)SHARED_LIBRARY,
      (HOST_)STATIC_LIBRARY, PACKAGE, JAVADOC, RAW_EXECUTABLE, RAW_STATIC_LIBRARY,
      COPY_HEADERS, KEY_CHAR_MAP

    上述片段包括artificial line breaks,以保持一个print-friendly打印文件。

    构建层次结构包括抽象如下表所述层。

    每一层关系到它上面的一个一对多的关系之一。例如,arch可以有多个board,每board可以有一个以上的device。你可以定义一个作为一个在同层元素专业化给定的层元素,从而消除复制和简化维护。

    Layer

    Example

    Description

    Product

    myProduct, myProduct_eu, myProduct_eu_fr, j2, sdk

    该产品层定义了一船产品规格齐全,界定哪些模块,来构建,以及如何配置它们。你可能会在几个不同的版本提供的设备的基础上的区域设置,例如,或在功能,如照相机。

    Device

    myDevice, myDevice_eu, myDevice_eu_lite

    该device层代表设备上的塑料的物理层。例如,北美的设备可能包括销售设备,而在法国的QWERTY键盘可能包括AZERTY键盘。外设通常连接到device层。

    Board

    sardine, trout, goldfish

    board层代表一个产品的原理图。您可能仍然连接外设的board层.

    Arch

    arm (arm5te) (arm6), x86, 68k

    arch层描述了处理器运行在您的board上。

    在Android平台的建设

    本节介绍了如何建立在Android的默认版本。一旦你建立了一个通用的舒适,那么你可以开始修改自己的目标设备的机器人。

        设备代码

        为了做一个机器人通用建设,源建设/ envsetup.sh,其中包含必要的变量和函数的定义,分述如下。

    % cd $TOP
     
    % . build/envsetup.sh
     
    # pick a configuration using choosecombo
    % choosecombo
     
    % make -j4 PRODUCT-generic-user

    您也可以替换为用户调试project:

    % make -j4 PRODUCT-generic-eng

    这些建立在不同的变体和包安装调试选项条件。

    清理

    执行% m clean,清理你刚刚创建的二进制文件。您也可以执行% m clobber获得的所有连击的二进制文件清除。 % m clobber等同于删除/ /输出/目录下生成的所有文件的存储位置。

        加快重新build

    每个组合的二进制文件存储为不同的子/ /输出/,从而能够迅速连击之间切换,而不必每次都重新编译所有的源目录。

    但是,执行干净重建是必要的,如果不生成系统捕捉到的环境变量或生成文件的变化。如果发生这种情况时候,你应该定义如下所示USE_CCACHE环境变量:

    % export USE_CCACHE=1

    这样做将迫使编译系统的编译器使用ccache的缓存工具,从而降低重新编译所有来源。

    ccache的二进制文件中提供/ /预置/ ...也不需要让您的系统上安装。

    疑难解答

    下面的错误可能是由运行的Java过时的版本引起的。

    device Dex: core  UNEXPECTED TOP-LEVEL ERROR:
    java.lang.NoSuchMethodError: method java.util.Arrays.hashCode with
    signature ([Ljava.lang.Object;)I was not found.
      at com.google.util.FixedSizeList.hashCode(FixedSizeList.java:66)
      at com.google.rop.code.Rop.hashCode(Rop.java:245)
      at java.util.HashMap.hash(libgcj.so.7)
    [...]

    dx是一个Java程序,使用设施,首先在现有的Java版本1.5。在shell执行% java -version检查您使用的Java版本。您应该看到类似:

    java version "1.5.0_07"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_07-164)
    Java HotSpot(TM) Client VM (build 1.5.0_07-87, mixed mode, sharing)

    如果你有Java 1.5或更高版本和您收到此错误,请确认您已正确地更新你的PATH变量。

    建设Android内核

    本节介绍如何构建Android的默认内核。一旦你建立了一个generic build,那么你可以开始修改自己的Android target设备的驱动程序。

    要构建内核的基础上,切换到设备目录(/home/joe/android/device),以建立变量和运行:

    % . build/envsetup.sh
    % partner_setup generic

    然后切换到内核目录/home/joe/android/kernel.。

    Checking Out a Branch

    The default branch is always android. To check out a different branch, execute the following:

    % git checkout --track -b android-mydevice origin/android-mydevice

      //Branch android-mydevice set up to track remote branch

    % refs/remotes/origin/android-mydevice.

      //Switched to a new branch "android-mydevice"

    为了简化代码管理,让您的本地branch与远程branch跟踪(如在上述片段所示)相同的名称。通过执行% git checkout <branchname>.在分支之间切换 

    Verifying Location

    找出存在的branch(包括本地和远程)哪个branch active通过执行以下(有星号标记):

    % git branch -a

      android

    * android-mydevice

      origin/HEAD

      origin/android

      origin/android-mydevice

      origin/android-mychipset

    只看local branch,省略- a标志.

    Building the Kernel

    要构建内核,执行:

    % make -j4

     

    build变量

    当某一产品的build,经常是有用的,什么是最终的最终发布版本略有不同。这是目前定义的build变量:

    eng

    这是默认的flavor。%make与%make eng一样。

    •安装模块标记: eng, debug, user, 或development.。

    •安装non-APK模块,没有标记指定。

    •安装APKs根据产品定义文件,除了标记的APKs。

    •ro.secure = 0

    •ro.debuggable = 1

    •ro.kernel.android.checkjni = 1

    •adb是默认启用的。

    user

    make user

    这是意在最终版本位的lavor。

    •安装模块用的用户。

    •安装non-APK模块,没有标记中指定。

    •安装APKs根据产品定义文件,标签被忽略的APK模块。

    ro.secure=1

    ·                                 ro.debuggable=0

    ·                                 adb is disabled by default.

    userdebug

    make userdebug

    与 user一样, 除:

    ·                                 还安装与debug标记模块 .

    ·                                 ro.debuggable=1

    ·                                 adb is enabled by default.

    如果你建立一个flavor,然后想建一个,你应该运行make installclean,两个make间要保证让你不接受了以前installclean flavor。Make clean也足够了,但它需要的时间更长。

  • 相关阅读:
    梦断代码阅读笔记03
    学习进度条十五
    梦断代码阅读笔记02
    构建执法阅读笔记06(总结)
    学习进度条十四
    冲刺Noip2017模拟赛7 解题报告——五十岚芒果酱
    冲刺Noip2017模拟赛6 解题报告——五十岚芒果酱
    HDU 3555:Bomb
    NOIp2012:借教室
    HNOI 2012/codevs 1994:排队
  • 原文地址:https://www.cnblogs.com/biglucky/p/4226240.html
Copyright © 2020-2023  润新知