这篇文章简单阐述一下Android的发布工具,即如何把各种编译好的库,可执行文件,打包整理成能够烧录进手机中的rootfs。


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


  1. 首先,来看一下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的工具, 相关资料参照:http://www.kandroid.org/online-pdk/guide/keymaps_keyboard_input.html#androidKeymapKeyCharMap
    |-- 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


  2. 在来看看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

    这里,目录在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


  3. NDK的build环境没有包含在标注难得AOSP的/build/目录下
    而是在mydroid/ndk/build下
    $ cd ndk/build/tools
    $ export ANDROID_NDK_ROOT=aosp-root/ndk
    $ ./make-release --help

  4. 一些小技巧
    如何显示每次编译所包含的所有xxx.mk文件
    找到build/core/main.mk
    把include $(subdir_makefiles)替换为
    $(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代码目录之外编译
    # Paths and settingsTARGET_PRODUCT = genericANDROID_ROOT = /home/karim/android/aosp-2.3.xBIONIC_LIBC = $(ANDROID_ROOT)/bionic/libcPRODUCT_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 namesAS = $(CROSS_COMPILE)asAR = $(CROSS_COMPILE)arCC = $(CROSS_COMPILE)gccCPP = $(CC) -ELD = $(CROSS_COMPILE)ldNM = $(CROSS_COMPILE)nmOBJCOPY = $(CROSS_COMPILE)objcopyOBJDUMP = $(CROSS_COMPILE)objdumpRANLIB = $(CROSS_COMPILE)ranlibREADELF = $(CROSS_COMPILE)readelfSIZE = $(CROSS_COMPILE)sizeSTRINGS = $(CROSS_COMPILE)stringsSTRIP = $(CROSS_COMPILE)stripexport AS AR CC CPP LD NM OBJCOPY OBJDUMP RANLIB READELF \SIZE STRINGS STRIP# Build settingsCFLAGS = -O2 -Wall -fno-short-enumsHEADER_OPS = -I$(BIONIC_LIBC)/arch-arm/include \-I$(BIONIC_LIBC)/kernel/common \-I$(BIONIC_LIBC)/kernel/arch-armLDFLAGS = -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 variablesEXEC_NAME = example-appINSTALL = installINSTALL_DIR = $(PRODUCT_OUT)/system/bin# Files needed for the buildOBJS = example-app.o# Make rulesall: example-app.c.o:$(CC) $(CFLAGS) $(HEADER_OPS) -c {1}lt;example-app: ${OBJS}$(CC) -o $(EXEC_NAME) ${OBJS} $(LDFLAGS)install: example-apptest -d $(INSTALL_DIR) || $(INSTALL) -d -m 755 $(INSTALL_DIR)$(INSTALL) -m 755 $(EXEC_NAME) $(INSTALL_DIR)clean:rm -f *.o $(EXEC_NAME) coredistclean:rm -f *~rm -f *.o $(EXEC_NAME) core

    如何增加一个新的设备
    $ cd ~/android/aosp-2.3.x$ . build/envsetup.sh$ mkdir -p device/acme/coyotepad$ cd device/acme/coyotepad进入AndroidProducts.mkPRODUCT_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_coyotepadPRODUCT_DEVICE := coyotepadPRODUCT_MODEL := Full Android on CoyotePad, meep-meep在BoardConfig.mk中TARGET_NO_KERNEL := trueTARGET_NO_BOOTLOADER := trueTARGET_CPU_ABI := armeabiBOARD_USES_GENERIC_AUDIO := trueUSE_CAMERA_STUB := true打开vendorsetup.shadd_lunch_combo full_coyotepad-eng


推荐参考资料:
<Embedded Android Porting Extending and Customizing> 第四章
http://marakana.com/s/video_tutorial_android_internals_building_a_custom_rom_pt_1_of_2,269/index.html -- 关于如何定制ROM的教程



更多相关文章

  1. Android新技术------Android(安卓)App Bundle之bundletool的使用
  2. 如何把React Native嵌入到原生android应用中
  3. Android(安卓)添加按电源键结束通话
  4. Android(安卓)程序反编译
  5. Android项目总结之社会化分享
  6. MacOS 10.15 下 Android(安卓)Q 源码 下载 编译 详解
  7. 关于android真机访问本地电脑服务器以及访问数据库的那点事
  8. Android中使用javah生成jni头文件的正确方法
  9. Android高效率编码-细节,控件,架包,功能,工具,开源汇总,你想要的这里

随机推荐

  1. 生成安卓证书keystor命令文件
  2. 进度条ProgressBar
  3. MetaHandler.js:移动端适配各种屏幕
  4. android dialog加载中动画效果
  5. android + javascript 相互通信实例分析
  6. android去掉titlebar
  7. 定义风格
  8. Android使用插件SimpleCropView
  9. android 尺寸单位介绍(dp,sp,px)
  10. rk3288 Android 7.1 rt5640 调试