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))

你可能感兴趣的:(Android)