编译Debug版本运行正常,但Release版本运行APP会崩溃。AS报错java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad in ‘/data/app/../lib/arm64/libxxx.so’
1 问题描述
本项目调用了IjkPlayer播放器,在Debug版本下APP运行正常,但如果编译运行Release版本,APP会崩溃。
2 问题分析
通过在 app/build.gradle
中的 BuildType
中开启Release版本的可调试功能(debuggable true
),即可在IDE中输出APP运行日志。
Release版本奔溃日志如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
--------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.XXX, PID: 17014
java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad in "/data/app/~~hEyGW0x_Vx3HKKttuxHR5A==/com.XXX.XXX-e46c-xY2XbY3yTct_hN6EA==/base.apk!/lib/arm64-v8a/libijksdl.so"
at java.lang.Runtime.loadLibrary0(Runtime.java:1087)
at java.lang.Runtime.loadLibrary0(Runtime.java:1008)
at java.lang.System.loadLibrary(System.java:1664)
at tv.danmaku.ijk.media.player.IjkMediaPlayer$1.loadLibrary(IjkMediaPlayer.java:179)
at tv.danmaku.ijk.media.player.IjkMediaPlayer.loadLibrariesOnce(IjkMediaPlayer.java:191)
at tv.danmaku.ijk.media.player.IjkMediaPlayer.initPlayer(IjkMediaPlayer.java:231)
at tv.danmaku.ijk.media.player.IjkMediaPlayer.<init>(IjkMediaPlayer.java:227)
at tv.danmaku.ijk.media.player.IjkMediaPlayer.<init>(IjkMediaPlayer.java:218)
at xyz.doikki.videoplayer.ijk.IjkPlayer.initPlayer(IjkPlayer.java:36)
at xyz.doikki.videoplayer.player.BaseVideoView.initPlayer(BaseVideoView.java:245)
at xyz.doikki.videoplayer.player.BaseVideoView.startPlay(BaseVideoView.java:208)
at xyz.doikki.videoplayer.player.BaseVideoView.start(BaseVideoView.java:183)
at com.example.XXX.my.Monitoring.onCreate(Monitoring.java:63)
at android.app.Activity.performCreate(Activity.java:8006)
at android.app.Activity.performCreate(Activity.java:7990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3595)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3786)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2257)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:233)
at android.app.ActivityThread.main(ActivityThread.java:8030)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:631)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:978)
|
本项目通过Implementation方式引入了IjkPlayer播放器,而IjkPlayer播放器的so库在编译完成后是放在 base.apk/lib/arm64-v8a
目录下的。
经过排查,该目录下存在libijksdl.so文件,但App运行时仍无法进行定位。
通过观察报错信息发现,APP资源路径是经过混淆了的,但是该ijkplayer库并未排除在混淆范围之外,故在加载so库时会无法识别混淆后的so库路径。
3 解决方法
此时修改proguard-rules.pro文件,将 tv.danmaku.ijk.media.player
包及其子包均排除混淆范围:
1
|
-keep class tv.danmaku.ijk.media.player.**{*;}
|