Android.mk总结

Android源码编译不同的版本,略微有不同
4.4 采用圝的方式
9.0使用圝的方式

编写app之前,确认编译环境使用的sdk版本,在build.gradle中配置成一样的
删掉不需要用的东西,也许某个虚线下面在编译时就是一个炸弹

一个apk构依赖部分
系统属性/自己项目的module/第三方jar/第三方aar/so库

  • 系统预编译好的属性

如AndroidX系列,
implementation 'androidx.constraintlayout:constraintlayout:1.1.0
可在编译目录中通过查找对应 name属性
find prebuilts/sdk/ -name Android.bp|xargs grep "name.*constraintlayout"

mk如下:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_USE_AAPT2 := true

...
LOCAL_STATIC_ANDROID_LIBRARIES := \ androidx-constraintlayout_constraintlayout

include $(BUILD_PACKAGE)
  • 依赖自己项目中Module

1.只依赖java文件,即常用的jar包
module中配置Android.bp

java_library {
    name: "constantproxy",

    srcs: [
        "src/main/java/**/*.java",
    ],

    exclude_srcs: [
    ],

    libs: [
    ],

    static_libs: [
        "androidx.media_media", //依赖的系统属性
    ],

    required: [
    ],

    dxflags: [
    ],

}

app中Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_USE_AAPT2 := true

...
LOCAL_STATIC_JAVA_LIBRARIES := \
                               constantproxy\

2.既依赖java又依赖res
此种module不需要写mk
在app中引入即可

? 理论上是不是每个module都可以这么写

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_USE_AAPT2 := true

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_SRC_FILES += $(call all-java-files-under, yourmodule/src)
LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/src/main/res
LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/yourmodule/src/main/res
#注意yourmodule路径的准确性

LOCAL_AAPT_FLAGS := --auto-add-overlay \
                                      --extra-packages yourmodule包名 \
...

include $(BUILD_PACKAGE)
  • 第三方jar

在jar的同级目录下新建Androd.bp 如libs/Android.bp

java_import {
    name: "my_jar",
    jars: ["annotation-1.1.0.jar"],
}

如果依赖第三方jar的是库,则在库里面的Android.bp中

java_library {
    name: "my_lib_core",

    srcs: [
        "src/main/java/**/*.java",
    ],

    exclude_srcs: [
    ],

    libs: [
    ],

    static_libs: [
        "androidx.appcompat_appcompat","my_jar"
    ],

    required: [
    ],

    dxflags: [
    ],

}

如果是自己的项目,则在app中Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_USE_AAPT2 := true
LOCAL_STATIC_JAVA_LIBRARIES := \
                my_jar \
...

LOCAL_PRIVATE_PLATFORM_APIS := true
include $(BUILD_PACKAGE)
  • 依赖第三方aar

在aar同级目录Android.bp中

android_library_import {
    name: "navigation-fragment-nodeps",
    aars: ["libs/navigation-fragment-2.3.0-alpha01.aar"],
    sdk_version: "current",
    static_libs: [
        "androidx.fragment_fragment", //navigation-fragment依赖androidx.fragment_fragment
    ],
}

android_library {
    name: "androidx.navigation_navigation-fragment",
    sdk_version: "current",
    manifest: "androidx.navigation.fragment/AndroidManifest.xml",
    static_libs: [
        "navigation-fragment-nodeps",
        "androidx.fragment_fragment",
    ],
    java_version: "1.8",
}

在Android.mk中

LOCAL_STATIC_ANDROID_LIBRARIES := \
                    androidx.navigation_navigation-fragment
  • so库

此so库指的是NDK编译出来的so库,libs下直接可用
需要用到so库的mk里面

include $(BUILD_PACKAGE)

libs_dir := $(TARGET_OUT)/app/yourapkname/lib/armeabi
$(shell mkdir -p $(libs_dir))
src_files := $(shell ls $(LOCAL_PATH)/libs/armeabi/)
$(foreach file, $(src_files),\
                $(shell cp $(LOCAL_PATH)/libs/armeabi/$(file) $(libs_dir)/$(file)))


Android9.0源码中的mk例子

LOCAL_PATH:= $(call my-dir)
 
include $(CLEAR_VARS)
 
LOCAL_USE_AAPT2 := true
LOCAL_PACKAGE_NAME := APK名字
LOCAL_OVERRIDES_PACKAGES := 
LOCAL_MODULE_TAGS := optional
 
# can't use LOCAL_SDK_VERSION, otherwise the error will occur like this:
# "(java:sdk) should not link to"
#LOCAL_SDK_VERSION := current
LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_PRIVILEGED_MODULE := true
LOCAL_JAVACFLAGS := -Xlint:deprecation -Xlint:unchecked
 
#LOCAL_PROGUARD_FLAG_FILES := proguard.flags
#LOCAL_JARJAR_RULES := $(LOCAL_PATH)/jarjar-rules.txt
 
###################################################
# src, res, AndroidManifest.xml ...
###################################################
LOCAL_MANIFEST_FILE := src/main/AndroidManifest.xml
LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/src/main/res
LOCAL_ASSET_DIR := $(LOCAL_PATH)/src/main/assets
 
###################################################
# AS dependencies from androidx or android-support
###################################################
#implementation 'androidx.appcompat:appcompat:1.0.0'
#LOCAL_STATIC_ANDROID_LIBRARIES += androidx.appcompat_appcompat
 
#implementation 'androidx.constraintlayout:constraintlayout:1.1.0'
#LOCAL_STATIC_ANDROID_LIBRARIES += androidx-constraintlayout_constraintlayout
 
#implementation 'androidx.recyclerview:recyclerview:1.0.0'
#LOCAL_STATIC_ANDROID_LIBRARIES += androidx.recyclerview_recyclerview
 
#implementation 'com.google.android.material:material:1.0.0'
#LOCAL_STATIC_ANDROID_LIBRARIES += com.google.android.material_material
 
###################################################
# custom aar library
###################################################
#LOCAL_STATIC_JAVA_AAR_LIBRARIES += 第三方AAR的别名,如:Demo_xxx-1.0.0
#LOCAL_AAPT_FLAGS += --extra-packages 第三方AAR里面AndroidManifest.xml定义的包名
#LOCAL_RESOURCE_DIR += 如果第三方AAR里面有res编不过的时候可以将res解压出来在此引用,如:$(LOCAL_PATH)/libs/xxx/res
LOCAL_AAPT_FLAGS += --auto-add-overlay
 
###################################################
# custom jar library
###################################################
#LOCAL_STATIC_JAVA_LIBRARIES += 自定义Module或第三方JAR的别名
#LOCAL_JAVA_LIBRARIES +=
 
###################################################
# custom jni library
###################################################
LOCAL_JNI_SHARED_LIBRARIES := 
 
include $(BUILD_PACKAGE)
 
 
##############################################################
# Pre-built dependency jars,aars,...
##############################################################
include $(CLEAR_VARS)
 
#LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += AAR或JAR别名与文件路径对应关系,如:Demo_xxx-1.0.0:libs/xxx/xxx.aar
 
include $(BUILD_MULTI_PREBUILT)
 
 
##############################################################
# Pre-built dependency jars,aars,...
##############################################################
#prebuilts += xxx:libs/xxx/xxx.aar
#
#define define-prebuilt
#  $(eval tw := $(subst :, ,$(strip $(1)))) \
#  $(eval include $(CLEAR_VARS)) \
#  $(eval LOCAL_MODULE := $(word 1,$(tw))) \
#  $(eval LOCAL_MODULE_TAGS := optional) \
#  $(eval LOCAL_MODULE_CLASS := JAVA_LIBRARIES) \
#  $(eval LOCAL_SRC_FILES := $(word 2,$(tw))) \
#  $(eval LOCAL_UNINSTALLABLE_MODULE := true) \
#  $(eval LOCAL_SDK_VERSION := system_current) \
#  $(eval include $(BUILD_PREBUILT))
#endef
#
#$(foreach p,$(prebuilts),\
#  $(call define-prebuilt,$(p)))
#
#prebuilts :=
 
 
##############################################################
# find other Android.mk 
##############################################################
include $(call all-makefiles-under, $(LOCAL_PATH))

上面的方式都不行的话,直接打包apk编译
xx.apk同级目录Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := weixin
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_PATH := $(TARGET_OUT_APP)
LOCAL_CERTIFICATE := platform
include $(BUILD_PREBUILT)
include $(call all-makefiles-under,$(LOCAL_PATH))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,689评论 0 3
  • Android.mk文件是GNU Makefile的一小部分,它用来对Android程序进行编译。 因为所有的编译...
    forty_seven阅读 1,224评论 0 3
  • Android.mk简介: Android.mk文件用来告知NDK Build系统关于Source的信息。Andr...
    爱因私谈阅读 19,944评论 0 19
  • 下雪了 我撑一把没有油纸的伞 踏上小小墓前的石桥 走着满是雪泥的白堤 我是要去断桥看雪的 脚下的白沙耐不住岁月 被...
    大唐森林阅读 175评论 5 4
  • 伤逝——子君绝笔 涓生,再次坐回我这缀满回忆的房间,才知晓时间竟已过去一年左右了。 和你在一起的日子,原来也不...
    Little_okay阅读 546评论 0 0