Android学习之Build环境介绍

来源:中国it实验室时间:2012-02-28 17:05:58

  这里略过对android在手机上的文件系统框架的阐述(Google或者baidu都能帮助你找到对应的信息),主要看google是如何把生成合适的rootfs的工作整合到它的build体系当中,同时,会顺带看一下CyanogenMod中对应各种机型的build机制。

  首先,来看一下Android的build系统中,使用到的编译选项和相关工具

  具体的目录在:mydroid/build/tools/下

  |-- acp

  这是一个稍微改良的cp命令,用来应付在windows/MAC/Linux下的cp命令的缺陷,其中的README很值得一看!

  |-- adbs

  这是一个用来查看crash问题的工具,详细请看《Android调试工具之adbs》

  |-- Android.mk

  |-- apicheck

  用来进行发布前的API检查(参见mydroid/build/core/tasks/apicheck.mk),是否新编译的系统中有破坏API兼容性或是非法的API

  这里的代码是用Java写的用来检查编译时生成的API相关信息的xml文件(mydroid/framework/base/api/中),可以参考里面对于xml文件解析的代码

  |-- apriori

  实现prelink的工具,简单介绍参见(mydroid/bionic/linker/README.TXT)

  |-- atree

  为android SDK服务的一个工具,用来按照指定xxx.atree文件中的内容进行一些文件操作

  |-- bin2asm

  不太明白具体的用处,应该是用来应付mac上编译android一些与gcc相关的问题

  |-- buildinfo.sh

  生成target中的各种xxx.prop文件,如system.prop, build.prop等

  |-- check_builds.sh

  包装了diff,用来看2个发布版本之间变化

  |-- check_prereq

  device上进行ota升级时的工具之一

  |-- compare_fileslist.py

  与check_builds.sh配合完成版本比较的脚本

  |-- droiddoc

  Android更具javadoc的一些移植

  |-- dump-package-stats

  简单的查看一个jar/apk文件内的dex和其它文件的大小信息

  |-- event_log_tags.py

  处理event-log-tags的内容,关于event-log-tags文件的意义参见《Android学习之event-log-tags是神马》

  |-- fileslist.py

  简化的列出指定目录下所有文件及大小的脚本 -- 可以放入自己的工具库了使用:)

  |-- findleaves.py

  在指定目录中(可多个)找指定文件的脚本 -- 可以放入自己的工具库了使用:)

  |-- fixlinebreaks.sh

  把windows中的换行改为linux下的 -- 可以放入自己的工具库了使用:)

  |-- fs_config

  列出指定文件夹及文件的权限

  |-- fs_get_stats

  得到指定文件夹下文件的简单stats信息

  |-- iself

  判断文件是否是ELF格式

  |-- isprelinked

  判断文件是否是prelink过的

  |-- java-event-log-tags.py

  处理event-log-tags的内容,关于event-log-tags文件的意义参见《Android学习之event-log-tags是神马》

  |-- kcm

  key character map的工具, 相关资料参照:

  |-- lsd

  !!!!!! ???

  |-- merge-event-log-tags.py

  处理event-log-tags的内容,关于event-log-tags文件的意义参见《Android学习之event-log-tags是神马》

  |-- mktarball.sh

  与fs_get_stats配合而执行的打包工具

  |-- print_module_licenses.sh

  显示当前目录下所有module信息

  |-- releasetools

  -- check_target_files_signatures

  |-- common.py

  |-- edify_generator.py

  |-- img_from_target_files

  |-- ota_from_target_files

  `-- sign_target_files_apks

  |-- rgb2565

  rgb转换工具

  |-- signapk

  命令行下对jar包签名的工具

  |-- soslim

  Android定制的编译工具之一,简单介绍参见(mydroid/bionic/linker/README.TXT)

  |-- warn.py

  解析Android系统编译log的工具

  `-- zipalign

  zipfile的对齐工具,参见该文件夹下的README.TXT

#p#副标题#e#

  在来看看Android编译系统中定义的一些通用XXX.mk文件

  mydroid/build/core/

  |-- armelflib.x

  |-- armelf.x

  |-- armelf.xsc

  |-- base_rules.mk

  |-- binary.mk

  |-- build_id.mk

  |-- build-system.html

  |-- checktree

  |-- cleanbuild.mk

  |-- cleanspec.mk

  |-- clear_vars.mk

  |-- combo

  |-- config.mk

  |-- copy_headers.mk

  |-- definitions.mk

  |-- device.mk

  |-- dex_preopt.mk

  |-- distdir.mk

  |-- droiddoc.mk

  |-- dumpvar.mk

  |-- dynamic_binary.mk

  |-- envsetup.mk

  |-- executable.mk

  |-- filter_symbols.sh

  |-- find-jdk-tools-jar.sh

  |-- help.mk

  |-- host_executable.mk

  |-- host_java_library.mk

  |-- host_native_test.mk

  |-- host_prebuilt.mk

  |-- host_shared_library.mk

  |-- host_static_library.mk

  |-- java_library.mk

  |-- java.mk

  |-- legacy_prebuilts.mk

  |-- main.mk

  |-- Makefile

  |-- multi_prebuilt.mk

  |-- native_test.mk

  |-- node_fns.mk

  |-- notice_files.mk

  |-- package.mk

  |-- pathmap.mk |-- phony_package.mk

  |-- prebuilt.mk

  |-- process_wrapper_gdb.cmds

  |-- process_wrapper_gdb.sh

  |-- process_wrapper.sh

  |-- product_config.mk

  |-- product.mk

  |-- proguard.flags

  |-- proguard_tests.flags

  |-- raw_executable.mk

  |-- raw_static_library.mk

  |-- root.mk

  |-- shared_library.mk

  |-- static_java_library.mk

  |-- static_library.mk

  |-- tasks

  |-- user_tags.mk

  `-- version_defaults.mk

#p#副标题#e#

  这里,目录在mydroid/build/core/tasks/有一些特别的task

  |-- apicheck.mk, 判断api是否符合AOSP的规范

  |-- cts.mk cts测试, 可以在代码根目录, make cts, 编译结束之后,进入out/host/linux-x86/bin/下,执行cts命令

  |-- ide.mk IDE开发环境

  |-- product-graph.mk

  `-- sdk-addon.mk

  NDK的build环境没有包含在标注难得AOSP的/build/目录下

  而是在mydroid/ndk/build下

  $ cd ndk/build/tools

  $ export ANDROID_NDK_ROOT=aosp-root/ndk

  $ ./make-release --help

  一些小技巧

  如何显示每次编译所包含的所有xxx.mk文件

  找到build/core/main.mk

  把include $(subdir_makefiles)替换为

  [plain] view plaincopy $(foreach subdir_makefile, $(subdir_makefiles),

  $(info Including $(subdir_makefile))

  $(eval include $(subdir_makefile))

  )

  subdir_makefile :=

  如果遇见API相关的PACKAGING/checkapi-current-TIMeStamp] Error 38

  需要执行:make update-api

如何在AOSP代码目录之外编译

  [plain] view plaincopy # Paths and settings

  TARGET_PRODUCT = generic

  ANDROID_ROOT = /home/karim/android/aosp-2.3.x

  BIONIC_LIBC = $(ANDROID_ROOT)/bionic/libc

  PRODUCT_OUT = $(ANDROID_ROOT)/out/target/product/$(TARGET_PRODUCT)

  CROSS_COMPILE =

  $(ANDROID_ROOT)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-

  # Tool names

  AS = $(CROSS_COMPILE)as

  AR = $(CROSS_COMPILE)ar

  CC = $(CROSS_COMPILE)gcc

  CPP = $(CC) -E

  LD = $(CROSS_COMPILE)ld

  NM = $(CROSS_COMPILE)nm

  OBJCOPY = $(CROSS_COMPILE)objcopy

  OBJDUMP = $(CROSS_COMPILE)objdump

  RANLIB = $(CROSS_COMPILE)ranlib

  READELF = $(CROSS_COMPILE)readelf

  SIZE = $(CROSS_COMPILE)size

  STRINGS = $(CROSS_COMPILE)strings

  STRIP = $(CROSS_COMPILE)strip

  export AS AR CC CPP LD NM OBJCOPY OBJDUMP RANLIB READELF

  SIZE STRINGS STRIP

  # Build settings

  CFLAGS = -O2 -Wall -fno-short-enums

  HEADER_OPS = -I$(BIONIC_LIBC)/arch-arm/include

  -I$(BIONIC_LIBC)/kernel/common

  -I$(BIONIC_LIBC)/kernel/arch-arm

  LDFLAGS = -nostdlib -Wl,-dynamic-linker,/system/bin/linker

  $(PRODUCT_OUT)/obj/lib/crtbegin_dynamic.o

  $(PRODUCT_OUT)/obj/lib/crtend_android.o

  -L$(PRODUCT_OUT)/obj/lib -lc -ldl

  # Installation variables

  EXEC_NAME = example-app

  INSTALL = install

  INSTALL_DIR = $(PRODUCT_OUT)/system/bin

  # Files needed for the build

  OBJS = example-app.o

  # Make rules

  all: example-app

  .c.o:

  $(CC) $(CFLAGS) $(HEADER_OPS) -c {1}lt;

  example-app: ${OBJS}

  $(CC) -o $(EXEC_NAME) ${OBJS} $(LDFLAGS)

  install: example-app

  test -d $(INSTALL_DIR) || $(INSTALL) -d -m 755 $(INSTALL_DIR)

  $(INSTALL) -m 755 $(EXEC_NAME) $(INSTALL_DIR)

  clean:

  rm -f *.o $(EXEC_NAME) core

  distclean:

  rm -f *~

  rm -f *.o $(EXEC_NAME) core

如何增加一个新的设备

  [plain] view plaincopy $ cd ~/android/aosp-2.3.x

  $ . build/envsetup.sh

  $ mkdir -p device/acme/coyotepad

  $ cd device/acme/coyotepad

  进入AndroidProducts.mk

  PRODUCT_MAKEFILES :=

  $(LOCAL_DIR)/full_coyotepad.mk

  对于full_coyotepad.mk

  $(call inherit-product, $(SRC_TARGET_DIR)/product/languages_full.mk)

  $(call inherit-product, $(SRC_TARGET_DIR)/product/full.mk)

  DEVICE_PACKAGE_OVERLAYS :=

  PRODUCT_PACKAGES +=

  PRODUCT_COPY_FILES +=

  PRODUCT_NAME := full_coyotepad

  PRODUCT_DEVICE := coyotepad

  PRODUCT_MODEL := Full Android on CoyotePad, meep-meep

  在BoardConfig.mk中

  TARGET_NO_KERNEL := true

  TARGET_NO_BOOTLOADER := true

  TARGET_cpu_ABI := armeabi

  BOARD_USES_GENERIC_AUDIO := true

  USE_CAMERA_STUB := true

  打开vendorsetup.sh

  add_lunch_combo full_coyotepad-eng

#p#副标题#e#

文章内容来源于网络,不代表本站立场,若侵犯到您的权益,可联系我们删除。(本站为非盈利性质网站) 联系邮箱:9145908@qq.com