有语句可以生成out/target/common/obj/JAVA_LIBRARIES/dom4j-1.6.1_intermediates/classes.jack'
这个target。
所以这里就需要修改makefile来解决这个问题。
修改如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES :=$(call all-subdir-java-files)
LOCAL_JAVA_LIBRARIES := framework
LOCAL_STATIC_JAVA_LIBRARIES := dom4j-1.6
LOCAL_PACKAGE_NAME := MakefileDemo
LOCAL_MODULE_TAGS := optional
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := dom4j-1.6.1:libs/dom4j-1.6.1.jar
include $(BUILD_MULTI_PREBUILT)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES
变量指定了需要进行预编译的库,指定的语法是静态库别名:静态库所在文件夹
例如dom4j-1.6.1:libs/dom4j-1.6.1.jar
再次build一次看下log,成功了:
Install: out/target/product/XXX/system/app/MakefileDemo/MakefileDemo.apk
target Prebuilt: dom4j-1.6.1 (out/target/common/obj/JAVA_LIBRARIES/dom4j-1.6.1_intermediates/classes.jar)
target Prebuilt: dom4j-1.6.1 (out/target/common/obj/JAVA_LIBRARIES/dom4j-1.6.1_intermediates/javalib.jar)
target Prebuilt: dom4j-1.6.1 (out/target/product/XXXX/obj/JAVA_LIBRARIES/dom4j-1.6.1_intermediates/javalib.jar)
make: Leaving directory `/home/yuanjize/android'
#### make completed successfully (6 seconds) ####
- 1
- 2
- 3
- 4
- 5
- 6
打开上面生成的jar
包可以发现都是dom4j-1.6.1
的代码,BUILD_MULTI_PREBUILT
只是改了个名字,至于classes.jack
文件是Android 6.0最新的编译工具,感兴趣可以搜索一下。
到了这里已经可以完美的编译这个apk了。
总结一下这个mk文件的结构。
Start设置LOCAL_PATH清除除了LOCAL_PATH以外的所有LOCAL_PATH变量指定MODULE_TAGS指定要编译的源码目录指定模块或者apk名称是否编译成apk?指定签名指定build脚本是否引入外部静态库?使用BUILD_MULTI_PREBUILT脚本来处理静态库?Endyesnoyesno
最后介绍几个BUILD_XXXX脚本
我们这里使用的BUILD脚本是BUILD_PACKAGE
作用是把这个模块编译成一个apk
,下面的表格介绍了一些build脚本和对应的功能。
脚本 | 公能 |
---|---|
BUILD_PACKAGE | 编译成apk |
BUILD_JAVA_LIBRARY | 编译成动态JAVA库 |
BUILD_STATIC_JAVA_LIBRARY | 编译成静态JAVA库 |
BUILD_MULTI_PREBUILT | 定义了如何处理一个或多个已编译文件(拷贝操作) |
BUILD_PREBUILT | 定义了如何处理一个已编译文件(拷贝操作,只能copy一个) |
BUILD_STATIC_LIBRARY | 编译c/c++静态库 |
BUILD_SHARED_LIBRARY | 编译c/c++共享库(.so文件) |
BUILD_EXECUTABLE | 编译成可执行程序 |
使用Build脚本生成的模块都在:
out/target/common/obj/
out/target/product/定制版本/obj/
- 1
- 2
- 3
这两个目录下。
生成的apk在 out/target/product/定制版本/system/app/app名称/
这个目录。
Build脚本的名字都是把宏的BUILD_前缀去掉,例如BUILD_EXECUTABLE
的教本文件名字就是EXECUTABLE.mk
,所有的脚本都在build/core
目录下。