Android学习之Build环境介绍

[复制链接]
查看159 | 回复0 | 2019-12-20 15:31 | 显示全部楼层 |阅读模式

                                核心提示:在这里让我们一起来学习一下Android的Build环境!                            .                                                                        
  这里略过对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的工具, 相关资料参照: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
                        123.                                                                                 

                                核心提示:在这里让我们一起来学习一下Android的Build环境!                            .                                                                        
  在来看看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
                        123.                                                                                 

                                核心提示:在这里让我们一起来学习一下Android的Build环境!                            .                                                                        
  这里,目录在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

                        123.                                                                                 





上一篇:itunes怎样取消自动同步
下一篇:诺基亚9多少钱_诺基亚9价格配置介绍[多图]
【玉璞集 YUPUG.COM】