Android.mk入门

有语句可以生成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目录下。

猜你喜欢

转载自blog.csdn.net/hszfor/article/details/78555792