Android - 当 minifyEnabled true 导致 java.lang.ExceptionInInitializerError 时,带有混淆 AAR 库的应用程序崩溃
Android - App with obfuscated AAR library is crashing when minifyEnabled true causes java.lang.ExceptionInInitializerError
我有一个 android 应用程序使用 CSRMesh 库作为 AAR 模块。 AAR 本身是混淆的。当 minifyEnabled
在 build.gradle
中 minifyEnabled
为 false 时,我的应用程序运行良好,但当我将其设置为 true 时,应用程序崩溃了。
以下代码来自自定义 MeshLibraryManager
class,用于对库进行 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
class 的一个实例。
我在应用程序崩溃的行中添加了评论。如果我注释掉该行及其下方的行,应用程序不会崩溃,但我无法执行所需的蓝牙操作。
这是崩溃的完整堆栈跟踪:
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)
我已经尝试为所需的 classes 添加 proguard 规则,无论我能从代码和堆栈跟踪中找到什么,但没有任何效果。
请建议我如何解决这个问题。
您必须确保以下行将出现在您的混淆器规则中。这将告诉您的应用程序确保可以使用 SpongyCastle 加密库。
-keep class org.spongycastle.jcajce.provider.asymmetric.** { *; }
我有一个 android 应用程序使用 CSRMesh 库作为 AAR 模块。 AAR 本身是混淆的。当 minifyEnabled
在 build.gradle
中 minifyEnabled
为 false 时,我的应用程序运行良好,但当我将其设置为 true 时,应用程序崩溃了。
以下代码来自自定义 MeshLibraryManager
class,用于对库进行 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
class 的一个实例。
我在应用程序崩溃的行中添加了评论。如果我注释掉该行及其下方的行,应用程序不会崩溃,但我无法执行所需的蓝牙操作。
这是崩溃的完整堆栈跟踪:
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)
我已经尝试为所需的 classes 添加 proguard 规则,无论我能从代码和堆栈跟踪中找到什么,但没有任何效果。
请建议我如何解决这个问题。
您必须确保以下行将出现在您的混淆器规则中。这将告诉您的应用程序确保可以使用 SpongyCastle 加密库。
-keep class org.spongycastle.jcajce.provider.asymmetric.** { *; }