通过make可以编译成app或者共享库,全编之后,可以使用mm/mmm/mma命令来单编app,下面以源码中具体的例子来说明mk文件写法
mk文件写法
cat Android.mk
LOCAL_PATH:= $(call my-dir) // 指定源文件位于当前目录
include $(CLEAR_VARS) // 清除 LOCAL\_ 开头的变量(LOCAL_PATH除外)的makefile文件
LOCAL_USE_AAPT2 := true // 使用aapt2编译
LOCAL_MODULE_TAGS := optional // 该模块在所有版本下都编译
LOCAL_PACKAGE_NAME := XXXXX // 应用名
LOCAL_PRIVATE_PLATFORM_APIS := true // sdk的hide的api來编译
LOCAL_MULTILIB=32 // 编译32位app
LOCAL_STATIC_ANDROID_LIBRARIES := // 引用Android系统库
android-support-v4
android-support-v7-appcompat
android-support-v7-cardview
android-support-v7-recyclerview
android-support-v13
android-support-design \\
LOCAL_STATIC_JAVA_LIBRARIES := // 引用三方库,下面需要把这些库预编译
eventbus-3.1.1
eventbus-3.1.1-sources
fastjson-1.2.35
okhttp-3.2.0
greendao-3.2.2
LOCAL_STATIC_JAVA_AAR_LIBRARIES := // 引用三方库,下面需要把这些库预编译
aara
aarb
LOCAL_AAPT_FLAGS := --auto-add-overlay // 将下面这些包一起打包到应用
\--extra-packages xxxxx
\--extra-packages xxxxx
\--extra-packages xxxxx
\--extra-packages xxxxx
\--extra-packages xxxxx
\--extra-packages xxxx
LOCAL_JNI_SHARED_LIBRARIES := libjni // 指定jni库
LOCAL_SRC_FILES := $(call all-java-files-under, app/src/main) // 指定java源代码文件
LOCAL_MANIFEST_FILE := app/src/main/AndroidManifest.xml // 指定AndroidManifest
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/app/src/main/res // 指定res
LOCAL_ASSET_DIR := $(LOCAL_PATH)/app/src/main/assets // 指定assets
LOCAL_RESOURCE_DIR += prebuilts/sdk/current/support/v7/appcompat/res // 增加系统res
LOCAL_CERTIFICATE := platform // 使用平台签名
LOCAL_OVERRIDES_PACKAGES := XXXXX // 覆盖掉XXXXX
LOCAL_PREBUILT_JNI_LIBS := // 指定so文件
app/src/main/jniLibs/armeabi-v7a/libc++\_shared.so
app/src/main/jniLibs/armeabi-v7a/xxx.so
app/src/main/jniLibs/armeabi-v7a/xxx.so
app/src/main/jniLibs/armeabi-v7a/xxx.so
app/src/main/jniLibs/armeabi-v7a/xxx.so
app/src/main/jniLibs/armeabi-v7a/xxx.so
app/src/main/jniLibs/armeabi-v7a/xxx.so
LOCAL_DEX_PREOPT := false // 不进行odex优化
LOCAL_PROGUARD_ENABLED := disabled // 不进行混淆
include $(BUILD_PACKAGE) // 编译生成apk
// 下面是指定预编译的三方库
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES +=eventbus-3.1.1:app/libs/eventbus-3.1.1.jar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES +=eventbus-3.1.1-sources:app/libs/eventbus-3.1.1-sources.jar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES +=aliyun-log-android-sdk-2.0.0:app/libs/aliyun-log-android-sdk-2.0.0.aar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES +=core-0.0.5:app/libs/core-0.0.5.aar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES +=facedetection-0.0.5:app/libs/facedetection-0.0.5.aar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES +=fastjson-1.2.35:app/libs/fastjson-1.2.35.jar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES +=handgesturedetection-0.0.6:app/libs/handgesturedetection-0.0.6.aar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES +=aara:app/libs/aara.aar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES +=aarb:app/libs/aarb.aar
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_DEX_PREOPT := false
include $(BUILD_MULTI_PREBUILT)
include $(LOCAL_PATH)/app/src/main/jni/Android.mk // 引入另外一个mk文件。此处引入生成so的mk,即上面配置的LOCAL_JNI_SHARED_LIBRARIES := libjni
bp文件写法
~/source/packages/apps/Gallery2$ cat Android.bp
package { // 增加一些申明信息,可选
default_applicable_licenses: ["Android-Apache-2.0"],
}
android_app { // 编译成apk
name: "Gallery2", // 应用名
static_libs: [ // 引用Android系统静态库
"androidx.fragment_fragment",
"androidx.documentfile_documentfile",
"androidx.legacy_legacy-support-core-ui",
"androidx.core_core",
"androidx.legacy_legacy-support-v13",
"com.android.gallery3d.common2",
"xmp_toolkit",
"mp4parser",
],
srcs: [ // 指定java源代码文件
"src/**/*.java",
"src_pd/**/*.java",
],
resource_dirs: ["res"], // 指定res
product_specific: true, // 编译出来放在/product目录下(默认是放在/system目录下)
overrides: [ // 覆盖掉一些应用
"Gallery",
"Gallery3D",
"GalleryNew3D",
],
sdk_version: "current", // 类似mk中LOCAL_SDK_VERSION,指定后不能使用系统hideapi
target_sdk_version: "28", // 指定Android sdk版本
jni_libs: [ // 指定项目中jni库
"libjni_eglfence",
"libjni_filtershow_filters",
"libjni_jpegstream",
],
optimize: { // 优化混淆配置
proguard_flags_files: ["proguard.flags"],
},
libs: ["org.apache.http.legacy"], // 引用动态库
optional_uses_libs: ["com.google.android.media.effects"], // 指定一个可选使用的库。如果该库可用,则将其链接到应用程序中。
jarjar_rules: "jarjar-rules.txt", // 使用jarjar工具修改jar的包名
}
将app添加方案配置
一般需要将app的PACKAGE_NAME(mk中配置的LOCAL_PACKAGE_NAME)添加到方案配置文件中,然后进行全编,固件中就包含该apk。具体做法要看公司