Android.mk文件需要了解的一些小知识

发现男友在将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脚本修改编译文件

你可能感兴趣的:(Android.mk文件需要了解的一些小知识)