有语句可以生成out/target/common/obj/JAVA_LIBRARIES/dom4j-1.6.1_intermediates/classes.jack'
这个target。
所以这里就需要修改makefile来解决这个问题。
修改如下:
- 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,成功了:
- 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脚本生成的模块都在:
- 1
- 2
- 3
这两个目录下。
生成的apk在
out/target/product/定制版本/system/app/app名称/
这个目录。
Build脚本的名字都是把宏的BUILD_前缀去掉,例如BUILD_EXECUTABLE
的教本文件名字就是EXECUTABLE.mk
,所有的脚本都在build/core
目录下。