文章目录

  • BUILD_STATIC_JAVA_LIBRARY
  • BUILD_JAVA_LIBRARY
  • LOCAL_STATIC_JAVA_LIBRARIES
  • LOCAL_JAVA_LIBRARIES

在Android的makefile编译系统中,编译结果是多种多样的,这个可以从build/make/core/config.mk中看出,部分代码如下所示:

BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mkBUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mkBUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mkBUILD_HEADER_LIBRARY:= $(BUILD_SYSTEM)/header_library.mkBUILD_AUX_STATIC_LIBRARY:= $(BUILD_SYSTEM)/aux_static_library.mkBUILD_AUX_EXECUTABLE:= $(BUILD_SYSTEM)/aux_executable.mkBUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mkBUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mkBUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mkBUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mkBUILD_PHONY_PACKAGE:= $(BUILD_SYSTEM)/phony_package.mkBUILD_RRO_PACKAGE:= $(BUILD_SYSTEM)/build_rro_package.mkBUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mkBUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mkBUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mkBUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mkBUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mkBUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mkBUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mkBUILD_NATIVE_TEST := $(BUILD_SYSTEM)/native_test.mkBUILD_NATIVE_BENCHMARK := $(BUILD_SYSTEM)/native_benchmark.mkBUILD_HOST_NATIVE_TEST := $(BUILD_SYSTEM)/host_native_test.mkBUILD_FUZZ_TEST := $(BUILD_SYSTEM)/fuzz_test.mkBUILD_HOST_FUZZ_TEST := $(BUILD_SYSTEM)/host_fuzz_test.mkBUILD_SHARED_TEST_LIBRARY := $(BUILD_SYSTEM)/shared_test_lib.mkBUILD_HOST_SHARED_TEST_LIBRARY := $(BUILD_SYSTEM)/host_shared_test_lib.mkBUILD_STATIC_TEST_LIBRARY := $(BUILD_SYSTEM)/static_test_lib.mkBUILD_HOST_STATIC_TEST_LIBRARY := $(BUILD_SYSTEM)/host_static_test_lib.mkBUILD_NOTICE_FILE := $(BUILD_SYSTEM)/notice_files.mkBUILD_HOST_DALVIK_JAVA_LIBRARY := $(BUILD_SYSTEM)/host_dalvik_java_library.mkBUILD_HOST_DALVIK_STATIC_JAVA_LIBRARY := $(BUILD_SYSTEM)/host_dalvik_static_java_library.mkBUILD_HOST_TEST_CONFIG := $(BUILD_SYSTEM)/host_test_config.mkBUILD_TARGET_TEST_CONFIG := $(BUILD_SYSTEM)/target_test_config.mk

在Android.mk中的用法如下所示:

include $(BUILD_XXX)

下面介绍Java相关的BUILD_JAVA_LIBRARYBUILD_STATIC_JAVA_LIBRARY

BUILD_STATIC_JAVA_LIBRARY

BUILD_STATIC_JAVA_LIBRARY表示编译结果为Java静态库,更准确地说就是一个与Android无关的纯Java包。
以模块名即LOCAL_MODULEabc为例,使用aapt进行编译。Android默认使用jack进行编译,使用aapt进行编译的方法是LOCAL_JACK_ENABLED := disabled
编译完成后,编译结果如下所示:

out/target/product/product_name/obj/JAVA_LIBRARIES/abc_intermediates└── javalib.jarout/target/common/obj/JAVA_LIBRARIES/abc_intermediates├── anno 空目录,应该是annotation相关的。├── classes 里面是所有的class文件。├── classes-full-debug.jar├── classes.jar└── link_type 内容为java:platform

product目录下只有一个javalib.jar,这个是从common目录下直接拷贝过来的,只是改了个名字而已。
javalib.jar是一个Java包,可以用解压缩工具打开,也可以从命令行用jar命令解压缩或直接查看里面的文件。解压缩命令jar -xvf javalib.jar,直接查看命令jar -tvf javalib.jar。其中有两类文件,一类是纯文本文件manifest,另一类是class为后缀的编译过的Java类数据文件。class文件中的部分内容可以从命令行用Java反编译工具javap进行查看,javap xxx.class
common目录下的两个jar包是一样的,同product目录下的javalib.jar

BUILD_JAVA_LIBRARY

BUILD_JAVA_LIBRARY表示编译结果为Java动态库,更准确地说是应用于Android的Java包。
编译完成后,编译结果如下所示:

out/target/product/product_name/obj/JAVA_LIBRARIES/abc_intermediates└── javalib.jarout/target/product/product_name/system/framework/abc.jarout/target/common/obj/JAVA_LIBRARIES/abc_intermediates├── anno 空目录,应该是annotation相关的。├── classes 里面是所有的class文件。├── classes-desugar.jar desugar即脱糖,为了兼容性,如将Java8的lambda表达式转换为普通表达式。├── classes.dex├── classes-full-debug.jar 非脱糖的原始class。├── classes.jar 同desugar。├── desugar_dumped_classes 空目录,desugar相关。├── javalib.jar├── link_type 内容为java:platform└── with-local 空目录,local相关。

product目录下的javalib.jar和abc.jar是相同的,里面有两个文件,manifest和classes.dex。可以看出,Java动态库中的class文件变成了静态库中的dex文件,dex文件是Android Dalvik特有的文件格式。

上面介绍了Java库的两个不同的编译结果,下面介绍使用方式。
Java库有两种使用方式,LOCAL_JAVA_LIBRARIESLOCAL_STATIC_JAVA_LIBRARIES

LOCAL_STATIC_JAVA_LIBRARIES

LOCAL_STATIC_JAVA_LIBRARIES表示把引用的外部Java库(可以是上面提到的两种形式的Java库)直接编译打包到本模块中,在runtime时可以直接从本模块中找到相关的东西。

LOCAL_JAVA_LIBRARIES

LOCAL_JAVA_LIBRARIES表示引用的外部Java库(可以是上面提到的两种形式的Java库)在编译时可以找到相关的东西,但并不打包到本模块,在runtime时需要从别的地方查找,这个别的地方就是在编译时将引用的外部Java库的模块名添加到PRODUCT_BOOT_JARS,例如Android原生的framework.jar就添了,PRODUCT_BOOT_JARS+=framework,否则在runtime时ClassLoader找不到需要的class。

综上,Android中所谓的Java动态库、静态库不同于C、C++的动态库、静态库,编译为静态库时表示编译为原生的Java class压缩包,编译为动态库时表示编译为用于Android Dalvik的dex压缩包,静态引用时把外部库直接打包过来,动态引用时需要将外部库加到PRODUCT_BOOT_JARS

更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. android 编译单个模块
  4. android触摸屏坐标手工校准/调整成功
  5. android中The connection to adb is down .. You must restart a
  6. Android(安卓)kernel 下载编译笔记
  7. 在linux下编译Android
  8. 最简单的自定义控件实现
  9. android源码编译出现No private recovery resources for TARGET_

随机推荐

  1. flea-frame-db使用之JPA封装介绍
  2. Transformer稀疏模型:​将文本、图像、声
  3. 隐马尔科夫模型-前向算法
  4. 登顶GitHub大热项目 | 非监督GAN算法U-GA
  5. 轻松集成HMS CGKit体积云实现云海仙境
  6. 函数节流你应该知道的那点事
  7. 开源项目,动作识别的开源框架Sense + 多对
  8. deepin下配置protobuf
  9. 本周AI开源项目精选 | 时间序列预测模型
  10. 官宣!数据名媛小麦C位出道!