发现男友在将AndroidStudio的编写的代码导入ROM中进行编译的时候,因为根目录是Java开头,不是直接是src和res,然后在编写Android.mk的时候闹出误会。
所以总结以下内容的 供初学ROM者了解Android.mk的作用和项目中的一些使用方法或者提醒一些ROM开发者可能忽略的东西。
一 APK重要文件Android.mk中编译指定方式
1 AndroidManifest.xml
1)默认不用配置,调用根目录下的。
2)LOCAL_MANIFEST_FILE := user/AndroidManifest.xml 指定AndroidManifest.xml
项目中的使用方式:
# Choose the appropriate AndroidManifest.xml
ifeq ($(strip $(MTK_EXCHANGE_SUPPORT)),yes)
LOCAL_MANIFEST_FILE := AndroidManifest.xml
else
LOCAL_MANIFEST_FILE := easMnfst/AndroidManifest.xml
endif
以上方式用于一般我们需要给不同的项目配置不同的启动activity。
3)多个AndroidManifest.xml合成所需要的AndroidManifest.xml
# Dialer manifest files to merge.
# find . -type f -name "AndroidManifest.xml" | uniq | sort
DIALER_MANIFEST_FILES += \
SpeedDial/AndroidManifest.xml \
$(BASE_DIR)/contacts/common/AndroidManifest.xml \
$(BASE_DIR)/dialer/about/AndroidManifest.xml \
$(BASE_DIR)/dialer/app/AndroidManifest.xml \
$(BASE_DIR)/dialer/app/manifests/activities/AndroidManifest.xml \
$(BASE_DIR)/dialer/app/voicemail/error/AndroidManifest.xml \
$(BASE_DIR)/dialer/backup/AndroidManifest.xml \
...........
LOCAL_FULL_LIBS_MANIFEST_FILES := \
$(addprefix $(LOCAL_PATH)/, $(DIALER_MANIFEST_FILES))
(可以看源码vendor\mediatek\proprietary\packages\apps\Dialer\Android.mk)
以上解析的源码在build\core\android_manifest.mk
2 src Java代码编译
1)LOCAL_SRC_FILES := $(call all-java-files-under, $(src_dirs))
src_dirs定义
phone_common_dir := ../../../../../../packages/apps/PhoneCommon
src_dirs := src src-bind $(phone_common_dir)/src ext
调用多个目录下面的Java代码
2)LOCAL_SRC_FILES := $(call all-subdir-java-files)
这个在项目中会经常使用的方式有:
在src同级目录定义单独的文件夹bird,将独立关联的代码的放置单独文件夹的src内,
调用当前目录下面的Java代码
LOCAL_SRC_FILES += $(call all-java-files-under, bird/src)
好处方便平台升级移植,或者独立功能分开(例如systemUI下面将扩展接口Ext独立胡来SystemUI\ext-keyguard)
3 res 代码编译
1)默认不用配置,调用根目录下的res下面的资源
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
2)同src可以调用指定目录下面的自选
res_dir := $(email_sign_dir) bird/res res $(unified_email_dir)/res $(chips_dir) $(photo_dir) $(emailcommon_dir)/res
LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, $(res_dir))
在项目中使用同的方式
1)同res,将新增的独立自选方式单独的文件夹bird下的res,如上2)指定编译
2)项目客制化中,如果不同项目仅是要求显示的string或者drawble不同,在Java代码中区分调用导致代码结构比较紊乱,也不便于项目人员自行操作,
可以通过res资源overlay解决这个问题。
定义方式如下
email_sign_dir := bird/email_sign_config/$(strip $(BIRD_EMAIL_SIGNATURE_CONFIG))/res
TEST_HAS_SIGN_CONFIG := $(shell test -d $(LOCAL_PATH)/$(email_sign_dir) && echo yes)
ifneq ($(TEST_HAS_SIGN_CONFIG),yes)
email_sign_dir :=
endif
根据BIRD_EMAIL_SIGNATURE_CONFIG=xxxx在bird/email_sign_config/下面建文件夹xxxx,放置重复资源。
早期平台如果在自定义资源文件夹下面添加的资源在根目录下面的res下面没有对应的名称,编译的时候会报资源找不到吗,需要添加:
(LOCAL_AAPT_FLAGS := --auto-add-overlay
这个的作用是当你定义的bird/email_sign_config/xxxx/res下面定义的资源与res下面同名的时候,优先使用排在前面的资源$(email_sign_dir) bird/res res。(验证和实际存有疑问……待确认))
(如果没有红色这个判断,我们定义了BIRD_EMAIL_SIGNATURE_CONFIG=xxxx但是没有在bird/email_sign_config/目录下面创建对应的指定目录xxxx
编译的时候会报错误)
APK重要组成的代码、资源、声明文件大概需要掌握的就如上,其他需要实战才能发现问题或者明白使用原理。
附一些Android.mk的使用技巧
1 如何确认Android.mk的变量是否是我们需要的
$(warning LOCAL_RESOURCE_DIR=$(LOCAL_RESOURCE_DIR))
编译器终端会打出
bird/keyboard_app/apps/SimpleHome/Android.mk:47: warning: LOCAL_RESOURCE_DIR=bird/keyboard_app/apps/SimpleHome/248B/res bird/keyboard_app/apps/SimpleHome/dq/res bird/keyboard_app/apps/SimpleHome/res
2 如何确认Android.mk里面的宏控制是否正确
直接在使用宏的前面进行变量赋值
MTK_EXCHANGE_SUPPORT:=yes
3 在Android.mk 中可以借助shell命令进行我们预期判断譬如
TEST_HAS_SIGN_CONFIG := $(shell test -d $(LOCAL_PATH)/$(email_sign_dir) && echo yes) 判断文件夹是否存在
PY_RES := $(shell python $(LOCAL_PATH)/build/blueangel.py) 执行Python脚本修改编译文件