You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止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,提问作者Андрей Глуздов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 00:06:24