note_40:加载aar中的so失败

24 篇文章 0 订阅

加载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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值