集成IronSource的APP打包AAB后崩溃,需适配ProGuard混淆规则
IronSource集成应用AAB发布后崩溃的ProGuard配置解决方案
问题描述
我开发的应用集成了IronSource SDK,打包APK发布版本后使用完全正常,但打包AAB上传Google Play后,安装到设备就出现崩溃。添加-dontobfuscate全局关闭混淆能解决问题,但我需要对核心core模块保留混淆,请问该添加哪些ProGuard规则?
崩溃堆栈
FATAL EXCEPTION: main java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:614) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:604) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067) Caused by: org.json.JSONException: End of input at character 0 of at org.json.JSONTokener.syntaxError(JSONTokener.java:460) at org.json.JSONTokener.nextValue(JSONTokener.java:101) at org.json.JSONObject.<init>(JSONObject.java:168) at org.json.JSONObject.<init>(JSONObject.java:185) at com.ironsource.mediationsdk.utils.IronSourceUtils.b(Unknown Source:7) at com.ironsource.mediationsdk.utils.IronSourceUtils.getCachedValueByKeyOfCachedInitResponse(Unknown Source:1) at com.ironsource.mediationsdk.utils.IronSourceUtils.isInitResponseCached(Unknown Source:3) at com.ironsource.mediationsdk.y.q(Unknown Source:1) at com.ironsource.mediationsdk.y.a(Unknown Source:10) at com.ironsource.mediationsdk.IronSource.init(Unknown Source:4) at n2.d$a.run(PluginAds.java:88) at android.os.Handler.handleCallback(Handler.java:942) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:226) at android.os.Looper.loop(Looper.java:313) at android.app.ActivityThread.main(ActivityThread.java:8757) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:604) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)
解决方案
从堆栈可以看出,崩溃是IronSource SDK的工具类在解析JSON时出错,本质是混淆(尤其是Google Play AAB的R8优化)破坏了SDK内部的类结构或方法签名。只需保留IronSource相关类不被混淆、优化,同时继续混淆你的core模块即可,具体规则如下:
1. 添加IronSource SDK专属ProGuard规则
将以下规则加入你的ProGuard配置文件(通常是proguard-rules.pro):
# 保留IronSource所有类和方法不被混淆、移除 -keep class com.ironsource.** { *; } # 忽略IronSource相关的警告 -dontwarn com.ironsource.** # 保留必要的属性,确保SDK反射和注解正常工作 -keepattributes *Annotation*,InnerClasses,Signature -keepattributes JavascriptInterface -keepattributes EnclosingMethod # 保留JSON相关类,避免解析逻辑被破坏 -keep class org.json.** { *; }
2. 仅对core模块启用混淆
确保你的ProGuard配置只针对core模块进行混淆,替换your.package.name.core为你实际的core包路径:
# 排除core包外的所有类,仅混淆core模块 -keep class !your.package.name.core.** { *; } # 可选:自定义混淆字典,增强混淆强度(需提前创建对应txt文件) -obfuscationdictionary proguard-dictionary.txt -classobfuscationdictionary proguard-dictionary.txt -packageobfuscationdictionary proguard-dictionary.txt
说明
AAB格式在Google Play发布时会触发更严格的R8代码优化,比本地APK的混淆规则更激进,所以必须确保第三方SDK的完整类结构不被改动。上述规则既保留了IronSource SDK的正常运行,又能让你的core模块保持混淆状态。
内容的提问来源于stack exchange,提问作者ilya_kas
相关产品推荐
相关产品推荐

