APK中引用第三方库文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了APK中引用第三方库文件相关的知识,希望对你有一定的参考价值。

注意以下操作是在源码中进行,即修改android.mk,并非借助IDE(AndroidStudio)的情形。

引用第三方JAR包

1,在源Android.mk里面加参数,使其编译为JAR包,然后mm编译

  1. ...
  2. LOCAL_MODULE_CLASS := JAVA_LIBRARIES
  3. include $(BUILD_JAVA_LIBRARY)
  4. ...

 

 
2,提取class.jar选用
把common下面的jar包文件(out\target\common\obj\JAVA_LIBRARIES\xxxx_intermediates\class.jar)放到APP的目录中
 
3,在APK中添加引用第三方JAR包
在APK的编译目录中,添加libs/xxx.jar文件。并修改其Android.mk
  1. ..
  2. LOCAL_STATIC_JAVA_LIBRARIES = xxx
  3. include $(BUILD_PACKAGE)
  4. include $(CLEAR_VARS)
  5. LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := xxx:libs/xxx.jar #实际目录
  6. include $(BUILD_MULTI_PREBUILT)
  7. ...
另外,如果JAR包已经编译进系统目录,比如system/framework/framework.jar,引用该文件只需要在Android.mk
  1. LOCAL_JAVA_LIBRARIES := framework
相当于动态链接使用。

引用第三方AAR文件

何为aar文件,aar包与jar包类似,区别就是aar文件包含Android的资源文件,如:布局、样式、图片等,如果按照源码中jar的引用方式会遇到编译不过的问题,提示找不到相关的资源文件。我们知道,就framework.jar是在frameworks/base/Android.mk定义编译的
  1. ...
  2. LOCAL_MODULE := framework
  3. include $(BUILD_JAVA_LIBRARY)
  4. ...
但framework里面引用很多资源文件,却编译成framework-res.apk,这是在frameworks/base/core/res/Android.mk定义的。
  1. ...
  2. LOCAL_PACKAGE_NAME := framework-res
  3. include $(BUILD_PACKAGE)
  4. ...
但有些情况,需要把jar文件和资源文件打包成一起,即为aar文件,Android.mk一般这样编写
1,编写源AAR文件,修改Android.mk如下
TODO
2,提取AAR文件
同样是在out/target/common目录下提取。
3,在APK的Android.mk添加第三方AAR
创建libs/xxx.arr文件,修改Android.mk如下
  1. ...
  2. LOCAL_AAPT_FLAGS += --auto-add-overlay \
  3. --extra-packages xxx
  4. LOCAL_STATIC_JAVA_AAR_LIBRARIES:= xxx
  5. ...
  6. include $(CLEAR_VARS)
  7. LOCAL_MODULE_TAGS := optional
  8. LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += xxx:libs/xxx.aar
  9. include $(BUILD_MULTI_PREBUILT)
 

引用第三方SO

第一种情况,符合JNI规范的SO
这种SO,是符合JNI规范,JAVA文件可直接调用。
这种情况,一般会提供一个libxxx_jni.so和一个NativeXxx.java的静态类。这个静态类会直接通过Syste.LoadLibrary(“xxx_jni”)来调用Native的文件,而自己的静态方法即为JAVA文件,可以直接调用。
 
 
第二种情况,不符合JNI规范的SO
这种SO即为普通C++或者C编译的so库文件,如果让JAVA文件直接调用,需要对其进行JNI封装。
这种情况一般提供一个libxxx.so和一个xxx.头文件
注:示例请参考前面文章Android JNI分析的分析。

以上是关于APK中引用第三方库文件的主要内容,如果未能解决你的问题,请参考以下文章

解决未能加载文件或程序集“Newtonsoft.Json ...."或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)(代码片段

利用 Android Gradle 瘦身 apk

Android APK打包流程

android逆向总结

为啥vscode中.js文件没有片段提示,但是.html文件有提示?

未解决的对“片段”部分中的符号“”的引用