欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

note_40:加载aar中的so失败

程序员文章站 2022-03-11 21:52:35
加载aar中的so失败参考:FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressedAndroid7.0加载.so文件报UnsatisfiedLinkError异常解决优化ApK大小之ABI Filters 和 APK splitAndroid Studio gardle 配置 ndk 指定 ABI: abiFilters 详解文章目录加载aar中的...

加载aar中的so失败


参考:



1. 导入aar的apk

(1) 先clean再build;invalidate cache and restart;build两次

(2) 导入的aar的名字或版本号写错

(3) 在proguard-rule.pro加上aar里面调用System.loadLibrary()的类

一个可能的情况是,aar里面调用System.loadLibrary的那个类被混淆了。

(4) 资源被压缩

如果报FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed,那么aar的res目录下有一个raw的文件夹或者有assets目录,里面放着资源,这些资源在被打包的时候可能会被压缩。仅仅在aar的build.gradle的aaptOptions设置noCompress还不够,还要引入这个aar的app的build.gradle里面写。参照FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed


2. aar

假设Android.mk.aidlCMakeListsnative-cppjni目录下的代码……这些文件都没问题。

(1) 资源被压缩

如果报FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed,那么aar的res目录下有一个raw的文件夹或者有assets目录,里面放着资源,这些资源在被打包的时候可能会被压缩。参照FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed,在aar的build.gradle的aaptOptions设置noCompress

(2) so文件放的地方

so文件默认放的地方是和src.main.java同级的jniLibs。如果放到了别的地方,例如libs的话,就需要在build.gradle里面写清楚。

以libs为例

android {
	sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
}

dependencies {
	api fileTree(dir: 'libs', include: ['*.so'])
}

(3) defaultConfig配置ndk框架

aar里面是要引用so文件的,如果不配置ndk框架,就有可能报Android7.0加载.so文件报UnsatisfiedLinkError异常解决。so文件分了多少种类型,那么abiFilters里面就要写多少种。如果很确定有一些类型不会用到的话,那么可以把这些目录下的so文件删掉,abiFilters里面也不用写。

例如,


defaultConfig {
	ndk {
	// moduleName就是loadLibrary里面填写的so的名称
	// 正常情况下需要去掉开头的lib
	// 不过因为Android.mk里面是有配置moduleName的
	// 所以这里写不写或者写错了也不会有影响
		moduleName "jni_myso"
		abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "mips", "mips64", "x86", "x86_64"
	}
}

如果这个so库是在当前这个aar里面对jni进行打包而弄出来的话,这个时候务必重新ndk-build,否则abiFilters里面的更改会无效。如果是自己在别的地方打包的话,那么需要重新改那个地方的build.gradle以及重新ndk-build

关于abiFilters可以参考优化ApK大小之ABI Filters 和 APK splitAndroid Studio gardle 配置 ndk 指定 ABI: abiFilters 详解

(4) 在proguard-rule.pro加上aar里面调用System.loadLibrary()的类

一个可能的情况是,调用System.loadLibrary的那个类被混淆了。


More than one file was found with OS independent path

极有可能是引用的模块或者各种包有冲突或者重复。

More than one file was found with OS independent path ‘lib/arm64-v8a/libsqlite.so’

android 依赖冲突解决

More than one file was found with OS independent path ‘protobuf.meta’

More than one file was found with OS independent path 'lib/armeabi-v7a/libcardioDecider.so #186

本文地址:https://blog.csdn.net/S_u_mm_er/article/details/108807867