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的工具, 相关资料参照:#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
在来看看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
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
800千伏柔性直流遭遇极端情况下的接地短路试验首次挑战成功
光耦合器,光耦合器工作原理是什么?
基于ADXL362的运动监测MEMS加速度计电路模块设计
用于低内存 IoT 设备的神经网络
美国商品期货交易委员会CFTC对加密货币采取了善待彼此的态度
android在手机上的文件系统框架的阐述
欧菲光成立二十周年 多次转换赛道成龙头
三元锂电池和磷酸铁锂电池不一定得你死我活
锅炉吹灰器是什么,有哪些作用
A游不错让你足不出户游天下
盖瑞特开发更高效的长途商用车电动涡轮增压技术
电烙铁的使用方法_烙铁使用教程_烙铁焊接技巧
mos管体二极管的作用是什么
承德科胜胶带封箱机|食品封箱机|河北打包机
腾讯专利:通过AI解决司机疲劳驾驶
ChatGPT对社交机器人技术发展的影响分析
GD32和STM32有何区别?GD32如何替换STM32呢?
低功耗MCU发威 智能手表电池寿命大增
开发嵌入式神经网络的现实
使用OpenWrt将Raspberry Pi树莓派变身为全能路由器