Android APK外部安装启动失败报UnsatisfiedLinkError问题求助
问题:外部安装APK启动失败,报UnsatisfiedLinkError错误
通过Android Studio直接安装的应用可正常运行,但手动安装外部APK包时无法启动,Logcat输出错误如下:
FATAL EXCEPTION: main Process: com.acme.someprogram, PID: 3806 java.lang.UnsatisfiedLinkError: Can't obtain peer field ID for class com.sun.jna.Pointer at com.sun.jna.Native.initIDs(Native Method) at com.sun.jna.Native.<clinit>(SourceFile:726) at com.sun.jna.Native.r(SourceFile:1) at org.vosk.LibVosk.<clinit>(SourceFile) at org.vosk.LibVosk.vosk_set_log_level(Native Method) at net.acme.someprogram.MainActivity.onCreate(SourceFile:272) at android.app.Activity.performCreate(Activity.java:6720) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2622) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2730) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1481) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6145) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
项目的Gradle应用脚本如下:
plugins { id 'com.android.application' } android { compileSdk 31 defaultConfig { applicationId "com.acme.someprogram" minSdk 24 targetSdk 31 versionCode 19 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } buildFeatures { viewBinding true } } dependencies { implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'com.google.android.material:material:1.5.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.3' testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' implementation 'net.java.dev.jna:jna:5.8.0@aar' implementation group: 'com.alphacephei', name: 'vosk-android', version: '0.3.32+' implementation project(':models') }
解决方案
添加混淆规则:打开项目中的
proguard-rules.pro文件,加入以下规则,防止JNA和Vosk的类/成员被混淆:-keep class com.sun.jna.** { *; } -keepclassmembers class com.sun.jna.** { *; } -keep class org.vosk.** { *; } -keepclassmembers class org.vosk.** { *; }原因:JNA和Vosk依赖反射与Native层交互,混淆会破坏类名、字段名的映射,导致Native层无法找到对应的Java类字段。
验证混淆是否为问题根源:临时修改
build.gradle中release构建类型的minifyEnabled为false,重新生成APK并安装。如果应用能正常启动,即可确认是混淆规则缺失导致的问题。重新构建签名APK:完成混淆规则添加后,通过
Build -> Generate Signed Bundle/APK生成新的签名安装包,再测试外部安装启动情况。
内容的提问来源于stack exchange,提问作者portsample
相关产品推荐
相关产品推荐

