微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android - 当 minifyEnabled true 导致 java.lang.ExceptionInInitializerError 时,带有混淆 AAR 库的应用程序崩溃

如何解决Android - 当 minifyEnabled true 导致 java.lang.ExceptionInInitializerError 时,带有混淆 AAR 库的应用程序崩溃

我有一个使用 CSRMesh 库作为 AAR 模块的 android 应用程序。 AAR 本身被混淆了。当 minifyEnabledbuild.gradle 中为 false 时,我的应用运行良好,但当我将其设置为 true 时,应用崩溃了。

以下代码来自自定义 MeshLibraryManager 类,用于对库进行 API 调用

private void enableBluetooth() {
    try {
        mCurrentChannel = MeshChannel.BLUetoOTH;
        isChannelReady = false;
        mBtBearer = new BluetoothBearer(this,mContext.get());
        if (mService != null) {
            mService.setBearer(mBtBearer);  // crash occurs in this line
            mService.setBluetoothBearerEnabled(mBtBearer);
        }
        EventBus.getDefault().post(new MeshSystemEvent(MeshSystemEvent.SystemEvent.CHANNEL_NOT_READY));
    } catch (Exception e) {
        e.printstacktrace();
    }
}

在此代码块中,mService 是库中 MeshService 类的实例。 我在应用程序崩溃的行中添加评论。如果我注释掉该行及其下方的行,应用程序不会崩溃,但我将无法执行所需的蓝牙操作。

这是崩溃的完整堆栈跟踪:

2021-05-14 16:21:48.994 27372-27372/com.example.myApp E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.myApp,PID: 27372
    java.lang.ExceptionInInitializerError
        at com.csr.internal.mesh_le.g0.a(SourceFile:70)
        at com.csr.internal.mesh_le.f.l(SourceFile:269)
        at com.csr.csrmesh2.MeshService.y(SourceFile:309)
        at com.example.scanner.api.MeshLibraryManager.v(SourceFile:336)
        at com.example.scanner.api.MeshLibraryManager.o(SourceFile:59)
        at com.example.scanner.api.MeshLibraryManager$b.onServiceConnected(SourceFile:595)
        at android.app.LoadedApk$Servicedispatcher.doConnected(LoadedApk.java:1738)
        at android.app.LoadedApk$Servicedispatcher$runconnection.run(LoadedApk.java:1770)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:201)
        at android.app.ActivityThread.main(ActivityThread.java:6820)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:922)
    

我已经尝试为所需的类添加 proguard 规则,只要我能从代码和堆栈跟踪中找出,但没有任何效果

请建议我如何解决这个问题。

解决方法

您必须确保以下行将出现在您的 proguard 规则中。这将告诉您的应用程序确保可以使用 SpongyCastle 加密库。

-keep class org.spongycastle.jcajce.provider.asymmetric.** { *; }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。