如何阻止R8混淆OneSignal库中的Lambda表达式?
解决R8混淆OneSignal库中Lambda表达式被重命名的问题
当前R8已将OneSignal库中的Lambda表达式重命名,具体示例如下:
com.onesignal.-$$Lambda$OSInAppMessagePushPrompt$mIb8tlhn4VMS1tXne5sef5zwUzc -> f.g.a:
com.onesignal.OneSignal$OSPromptActionCompletionCallback f$0 -> a
1:3:void com.onesignal.OSInAppMessagePushPrompt.lambda$handlePrompt$0(com.onesignal.OneSignal$OSPromptActionCompletionCallback,boolean):13:15 -> response
1:3:void response(boolean):0 -> response
你之前使用的-keep class com.onesignal.** { *; }规则无效,是因为Lambda编译后生成的类采用-$$Lambda$开头的命名格式,常规的包路径匹配规则无法覆盖这类特殊命名的类。可以通过以下配置解决:
单独保留OneSignal相关的Lambda生成类
添加这条规则,直接覆盖Lambda编译后的类:-keep class com.onesignal.-$$Lambda$** { *; }补充保留关联的回调接口和方法
为了确保Lambda关联的回调和方法不被混淆,避免调用逻辑出错,添加以下规则:-keep interface com.onesignal.OneSignal$OSPromptActionCompletionCallback { *; } -keepclassmembers class com.onesignal.OSInAppMessagePushPrompt { void lambda$handlePrompt$0(com.onesignal.OneSignal$OSPromptActionCompletionCallback, boolean); }完整的混淆规则示例
把上述规则结合,替换之前的单一规则:# 保留OneSignal核心类及成员 -keep class com.onesignal.** { *; } # 保留Lambda编译生成的内部类 -keep class com.onesignal.-$$Lambda$** { *; } # 确保回调接口和关联方法不被混淆 -keep interface com.onesignal.OneSignal$OSPromptActionCompletionCallback { *; } -keepclassmembers class com.onesignal.OSInAppMessagePushPrompt { void lambda$handlePrompt$0(com.onesignal.OneSignal$OSPromptActionCompletionCallback, boolean); }
内容的提问来源于stack exchange,提问作者Андрей Глуздов
相关产品推荐
相关产品推荐

