Android 预编译模块

在实际的开发过程,并不会像Android一样将所有的源码一起编译,有很多的APK、Jar包等都是预先编译好的,编译系统时需要将这些二进制文件复制到生成的image文件中.
常用的方法是通过PRODUCT_COPY_FILES变量将这些文件直接复制生成的image文件中,但是有些APK文件和jar包,需要使用系统的的签名文件才能正常运行,这样复制的方式就不痛了,另外,一些动态库文件可能源码中的某些模块所依赖,用复制的方法无法建立依赖关系,可以用预编译模块的方法解决。
定义一个预编译模块和一个普通的编译模块格式相似,不同的是LOCAL_SRC_FILES变量指定的不是源文件,而是二进制文件的路径,同时还要通过LOCAL_MODULE_CLASS来指定模块的类型,最后include是BUILD_PREBUILT变量定义的编译文件。
下面是常见模块的写法

1.apk文件目标

include $(CLEAR_VARS)
LOCAL_MODULE :=ThemeManager.apk
LOCAL_SRC_FILES :=app/$(LOCAL_MODULE)
LOCAL_MODULE_TAGS :=optional
LOCAL_MODULE_CLASS:=APPS   #这里是APPS
LOCAL_CERTIFICATE :=platform
include $(BUILD_PREBUILT)

2.定义静态jar包目标

include $(CLEAR_VARS)
LOCAL_MODULE :=ThemeManager.jar
LOCAL_SRC_FILES :=app/$(LOCAL_MODULE)
LOCAL_MODULE_TAGS :=optional
LOCAL_MODULE_CLASS:=JAVA_LIBRARIES   #这里是JAVA_LIBRARIES
LOCAL_CERTIFICATE :=platform
include $(BUILD_PREBUILT)

3.定义动态库文件目标

include $(CLEAR_VARS)
LOCAL_MODULE :=ThemeManager_jni.so
LOCAL_MODULE_OWER :=
LOCAL_SRC_FILES :=lib/$(LOCAL_MODULE)
LOCAL_MODULE_TAGS :=optional
LOCAL_MODULE_CLASS:=SHARED_LIBRARIES   #这里是SHARED_LIBRARIES
include $(BUILD_PREBUILT)

4.定义可执行文件目标

include $(CLEAR_VARS)
LOCAL_MODULE :=bootanimation
LOCAL_MODULE_OWER :=
LOCAL_SRC_FILES :=bin/bootanimation
LOCAL_MODULE_TAGS :=optional
LOCAL_MODULE_CLASS :=EXECUTABLES   #这里是EXECUTABLES
LOCAL_MODULE_PATH :=$(TARGET_OUT)/bin  #这里可以指定复制到的目标目录
include $(BUILD_PREBUILT)

5.定义xml文件目标

include $(CLEAR_VARS)
LOCAL_MODULE :=ThemeManager.xml
LOCAL_MODULE_OWER :=
LOCAL_SRC_FILES :=etc/$(LOCAL_MODULE)
LOCAL_MODULE_TAGS :=optional
LOCAL_MODULE_CLASS:=ETC   #ETC表示文件将复制到/system/etc下
include $(BUILD_PREBUILT)

6.定义host平台下的jar包
将系统编译时用到的sigapk.jar预编译,然后复制到out目录下,这样Build系统将能够使用这个文件来给其他文件签名:

include $(CLEAR_VARS)
LOCAL_MODULE :=signapk
LOCAL_PREBUILT_JAVA_LIBRARIES :=lib/$(LOCAL_MODULE).jar
include $(BUILD_HOST_PREBUILT)

你可能感兴趣的:(android,编译,预编译,Android)