App工程是用Android Studio来开发,使用gradle编译,需求是App工程要放在Android源码中编译集成进系统。为了保留App的工程结构不变,需要在Android.mk中配置才能正常编译。以下各行配置,均在App工程根目录下的Android.mk文件中。
Android.mk
设置当前路径1LOCAL_PATH := $(call my-dir)
清理变量定义1include $(CLEAR_VARS)
编译标志
指该模块在什么编译版本下编译,有以下几种取值
5#eng:在eng版本
#test:在test版本
#user:在user版本
#optional:所有版本都编译
LOCAL_MODULE_TAGS := optional
指定当前源码文件
调用all-java-files-under方法,意思是当前目录下的所有java文件
1LOCAL_SRC_FILES := $(call all-java-files-under)
指定当前资源文件1
3#在Android Studio的默认工程结构中,资源文件夹位于app/src/main/res中,
#所以要在这里指定资源目录,如果不指定,资源文件默认位于当前目录
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/app/src/main/res
指定AndroidManifest.xml的位置1
4#默认位置是与Android.mk文件同一目录下,但在Android Studio的默认工程结构中,
#AndroidManifest.xml位于app/src/main下,
#所以要在这里指定AndroidManifest.xml位置
LOCAL_MANIFEST_FILE := app/src/main/AndroidManifest.xml
如果项目需要引用jar包(步骤1)1
2#冒号后面的名字是自己定义的,定义在这里:引用jar包(步骤2)
LOCAL_STATIC_JAVA_LIBRARIES := MultiScreenSupportV4
如果项目需要support-v7包引用1
7#v7包由系统编译提供,冒号后的名字,是v7包下Android.mk中定义的模块名
LOCAL_JAVA_LIBRARIES := android-support-v7-appcompat
#还需要在v7源码中,指定资源文件夹
LOCAL_RESOURCE_DIR += platform/android/frameworks/support/v7/appcompat/res
LOCAL_AAPT_FLAGS += \
--auto-add-overlay \
--extra-packages android.support.constraint:android.support.v7.appcompat
设置包名
最后会生成以此为名的apk文件
1LOCAL_PACKAGE_NAME := MultiScreenDemo
签名1LOCAL_CERTIFICATE := platform
混淆1LOCAL_PROGUARD_ENABLED := disabled
如果项目需要引用so文件(步骤1)1
2LOCAL_REQUIRED_MODULES := libimagepipeline
LOCAL_JNI_SHARED_LIBRARIES := libimagepipeline
编译生成apk保存地址1LOCAL_MODULE_PATH := $(ANDROID_PRODUCT_OUT)/system/app
编译成apk1include $(BUILD_PACKAGE)
引用jar包(步骤2)1
3include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := MultiScreenSupportV4:/app/libmm/android-support-v4.jar
include $(BUILD_MULTI_PREBUILT)
引用so文件(步骤2)1
9include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE := libimagepipeline
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_SRC_FILES_arm := app/libmm/armeabi/libimagepipeline.so
LOCAL_MODULE_TARGET_ARCHS:= arm
LOCAL_MULTILIB := both
include $(BUILD_PREBUILT)
会有啥问题?
gradle项目依赖
在Android Studio中创建的工程,由于使用了gradle来管理依赖,尤其是项目依赖了各种第三方库,当使用Android.mk来编译此项目时,需要手动在mk文件中引用这些第三方库,实际上就是依赖这些第三方库的jar包、源码、so文件等等。
系统编译后,在指定目录下没有生成apk
如果需要新增加一个apk,编译到系统镜像中,在apk目录下mm命令可以正常编译并输出apk,但系统make时,却没有输出apk,首先要确认LOCAL_MODULE_TAGS字段的值是否是当前系统编译的类型。
还有一个原因是在系统有个包配置文件build/target/product/generic_no_telephony.mk配置了编译系统时包括的所有模块,在这里加上自己的App的mk文件的LOCAL_PACKAGE_NAME的值即可。