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的值即可。