文章目录
一、报错信息
二、解决方案 ( 指定 APK 打包动态库的 CPU 架构 )
一、报错信息
外部引用 so 动态库 , 如果只有一个 armeabi-v7a 的动态库 , 那么如果在 arm64 的手机上执行 , 就会报如下出错误 ;
2021-04-25 10:06:47.317 13637-13688/kim.hsl.webp E/libc: Access denied finding property "vendor.debug.egl.profiler" 2021-04-25 10:06:47.331 13637-13637/? E/AndroidRuntime: FATAL EXCEPTION: main Process: kim.hsl.webp, PID: 13637 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/kim.hsl.webp-BVtfbEbSAp4Nev90KIUIGg==/base.apk"],nativeLibraryDirectories=[/data/app/kim.hsl.webp-BVtfbEbSAp4Nev90KIUIGg==/lib/arm64, /system/lib64]]] couldn't find "libwebp.so" at java.lang.Runtime.loadLibrary0(Runtime.java:1012) at java.lang.System.loadLibrary(System.java:1669) at kim.hsl.webp.MainActivity.<clinit>(MainActivity.kt:17) at java.lang.Class.newInstance(Native Method) at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:69) at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45) at android.app.Instrumentation.newActivity(Instrumentation.java:1215) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2869) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6718) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
二、解决方案 ( 指定 APK 打包动态库的 CPU 架构 )
上述报错在低版本的 Gradle 插件 和 Gradle 中可以自动兼容 , 不需要进行额外设置 ;
在如下配置中 , 只有一个 armeabi-v7a 的动态库 , 系统会自动兼容配置 , 运行时如果在 arm64 的手机上会自动向下兼容使用 armeabi-v7a 的动态库 ;
如果在高版本的 Gradle 插件与 Gradle 中 , 如下配置 , 就会报上述错误 ;
这时就需要指定 APK 打包动态库的 CPU 架构 , 在 Module 下的 build.gradle 构建脚本中 , 进行如下设置 ;
android { defaultConfig { //配置 APK 打包 哪些动态库 // 示例 : 如在工程中集成了第三方库 , 其提供了 arm, x86, mips 等指令集的动态库 // 那么为了控制打包后的应用大小, 可以选择性打包一些库 , 此处就是进行该配置 ndk{ // 打包生成的 APK 文件指挥包含 ARM 指令集的动态库 abiFilters "armeabi-v7a" /*, "arm64-v8a", "x86", "x86_64"*/ } } }
完整配置文件 :
plugins { id 'com.android.application' id 'kotlin-android' } android { compileSdkVersion 30 buildToolsVersion "30.0.3" defaultConfig { applicationId "kim.hsl.webp" minSdkVersion 14 targetSdkVersion 30 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" //配置 APK 打包 哪些动态库 // 示例 : 如在工程中集成了第三方库 , 其提供了 arm, x86, mips 等指令集的动态库 // 那么为了控制打包后的应用大小, 可以选择性打包一些库 , 此处就是进行该配置 ndk{ // 打包生成的 APK 文件指挥包含 ARM 指令集的动态库 abiFilters "armeabi-v7a" /*, "arm64-v8a", "x86", "x86_64"*/ } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } } dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'com.google.android.material:material:1.3.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation files('libs\\libwebp.jar') testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' }