-
cc_defaults 是当前模块的父模块
-
cc_binary 代表可以生成二进制库文件,生成的文件在/system/bin
-
cc_library cc_library_shared 代表一个c++可编译库,生成的so库在/system/framework/lib
-
java_library 是一个java库,编译出jar包
-
shared_libs 依赖库
-
subdirs 子模块,包含Android.bp文件的模块
-
srcs 包含的源文件
-
static代表静态的一些jar和so库,具体还不清楚问题
-
未知的 static_libs include_dirs cc_library_static libs
Android 系统 Make file 语法
- 应该意识到make file中只有模块概念,引用三方的jar和so文件必须先编译成为makefile中的模块,而不能直接使用文件进行编译。
android make file 规则参考链接
对于java的jar文件
- LOCAL_JAVA_LIBRARIES 仅仅在编译时使用的java库
- LOCAL_STATIC_JAVA_LIBRARIES 引用三方jar包,会编译打包到apk中
- LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES 用于预编译一个现有的jar包文件,三方jar包在使用前必须预编译,原因如下:
编译是以模块(而不是文件)作为单位的,每个模块都有一个唯一的名称,一个模块的依赖对象只能是另外一个模块,而不能是其他类型的对象。对于已经编译好的二进制库,如果要用来被当作是依赖对象,那么应当将这些已经编译好的库作为单独的模块。对于这些已经编译好的库使用 BUILD_PREBUILT 或 BUILD_MULTI_PREBUILT。例如:当编译某个 Java 库需要依赖一些 Jar 包时,并不能直接指定 Jar 包的路径作为依赖,而必须首先将这些 Jar 包定义为一个模块,然后在编译 Java 库的时候通过模块的名称来依赖这些 Jar 包。
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES使用的格式如下:
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := 模块名字:jar路径
# 首先预编译要使用的jar包,目的是将三方jar转变为一个模块可以用于其他模块依赖
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := androidxJar:libs/androidx.jar
include $(BUILD_MULTI_PREBUILT) # 预编译三方jar包,因为三方jar无法直接引用到路径中
# 使用预编译的三方Jar包模块
include $(CLEAR_VARS)
LOCAL_JAVA_LIBRARIES := androidxJar # 只编译,不打包进apk
# 这一行用于编译apk
include $(BUILD_PACKAGE)
- BUILD_STATIC_JAVA_LIBRARY 编译静态jar包
对于c++ 的native文件
- LOCAL_SHARED_LIBRARIES 指定编译需要的共享库.so文件,会打包到软件包中
- LOCAL_STATIC_LIBRARIES 指定编译需要的静态库.a文件,不会打包到软件中
- BUILD_SHARED_LIBRARY 编译共享的.so文件,会打包到最终的软件包中
- BUILD_STATIC_LIBRARY 编译静态的.a文件,不会打包的最终的软件包中。可以用.a文件来编译生成.so文件
- PREBUILT_SHARED_LIBRARY 预编译一个共享库,这里他的源文件LOCAL_SRC_FILES的值指向一个三方.so文件
- PREBUILT_STATIC_LIBRARY 与 PREBUILT_SHARED_LIBRARY 相同,但用于预编译静态库
- LOCAL_C_INCLUDES 编译库是引用的头文件。编译一个so库时,必须要用这个关键字指明它用到的所有头文件库。
- LOCAL_EXPORT_C_INCLUDES。LOCAL_EXPORT_C_INCLUDES这个变量指明需要导出的头文件。在module(命名A)中指明这个关键字后,可以让别的module(命名B)引用module A的时候,自动的包含A的头文件,使得B正常编译。
- 使用预编译库
# PREBUILT_SHARED_LIBRARY 构建的模块都是使用预编译库,
# 请参考https://developer.android.com/ndk/guides/prebuilts.html。需要搞清楚Android.mk中模块的概念。
# LOCAL_SHARED_LIBRARIES 这个变量后面只能跟随模块名字,而不是so文件的名字
# LOCAL_EXPORT_C_INCLUDES 导出其他module编译需要的头文件
include $(CLEAR_VARS)
LOCAL_MODULE := libdemo
LOCAL_SRC_FILES := $(LOCAL_PATH)/libs/demo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/libs/include/
include $(PREBUILT_SHARED_LIBRARY)