1***@qq.com
1***@qq.com
  • 发布:2026-01-29 18:02
  • 更新:2026-01-29 22:03
  • 阅读:43

uniappx安卓SDK打包aar混淆问题

分类:uni-app x

打包aar给客户后,客户debug没有问题。release白屏。

里面为什么用那么多反射,一混淆各种问题。

特别是和flutter结合。

2026-01-29 18:02 负责人:无 分享
已邀请:
Ask小助手

Ask小助手

该问题请在专业群( uni-app x技术交流群 ) 咨询,群中有相关专业的管理员和群友。

问题根源

uni-app x 的 Android SDK 在 release 构建时默认打开了 R8 混淆,而框架内部大量使用了「字符串类名 + 反射」去查找并注册 UTS 插件、Flutter Engine、业务组件(io.dcloud.uniapp.*uts.sdk.modules.* 等)。一旦混淆把类名缩短或移除,运行时就会找不到对应类,直接 catch 住异常后表现为「白屏」。
debug 包默认 minifyEnabled false,所以不会触发这个问题。

快速验证

把 aar 集成到客户的 app 后,在 app/proguard-rules.pro 里加上:

# 保留 uni-app x 所有运行时需要的类  
-keep class io.dcloud.** { *; }  
-keep class uts.sdk.** { *; }  
-keep class **.*Register { *; }   # 各模块注册入口  
-dontwarn io.dcloud.**  
-dontwarn uts.sdk.**

重新打包 release,白屏即可消失。

为什么这么多反射

  1. uni-app x 的插件体系是「编译期生成注册类 → 运行期反射加载」,这样插件可以热插拔,不需要改动主工程代码。
  2. 与 Flutter 混合时,Flutter Engine 的初始化、plugin registry 同样靠反射(官方也是这么做的)。
  3. 为了兼容不同宿主工程(有的用 Kotlin、有的用 Java),反射是最省事的解耦手段。

后续建议

  • 把上面的 keep 规则做成 consumer-proguard-rules.pro 打进您的 aar,这样客户无需手动配置。
  • 如果仍想瘦身,可以按需保留:
    -keep class * extends io.dcloud.uniapp.framework.uts.UTSNativeModule { *; }  
    -keep class * implements io.dcloud.uniapp.framework.uts.UTSRegister { *; }  
  • 与 Flutter 并存时,Flutter 模块本身也要关闭混淆或添加官方推荐的 keep 规则,否则同样会找不到 io.flutter.plugins.* 等类。

一句话总结

release 白屏就是混淆把反射需要的类名干掉了,给 uni-app x 及 Flutter 相关包名加上 keep 即可解决。

内容为 AI 生成,仅供参考
DCloud_Android_zl

DCloud_Android_zl

可以参考下面的混淆配置。

然后将应用资源也添加到混淆配置中。包名参考index.kt中package字段对应的包名。

如:-keep class uni.UNIxxxxxxx.** { *; }
# 1. 保护 SDK 核心代码不被混淆  
-keep class io.dcloud.** { *; }  

# 2. 保护用户扩展/实现的类不被混淆  
# 如果用户自定义了组件或实现了 SDK 的接口,需要保留这些类  
-keep class * extends io.dcloud.uniapp.AsyncApiResult { *; }  
-keep class * extends io.dcloud.uniapp.runtime.UniEvent { *; }  
-keep class * extends io.dcloud.uniapp.runtime.UniElement { *; }  
-keep class * extends io.dcloud.uts.UTSError { *; }  

-keep interface * extends io.dcloud.uniapp.runtime.UniNativePage { *; }  
-keep interface * extends io.dcloud.uniapp.runtime.UniNativeApp { *; }  

-keep class * implements io.dcloud.uniapp.ui.component.IComponent { *; }  
-keep class * implements io.dcloud.uniapp.ui.component.IContainerComponent { *; }  
-keep class * extends io.dcloud.uniapp.appframe.AppConfig {*;}  

# 3. 保护 JNI 本地方法  
-keepclasseswithmembernames class * {  
    native <methods>;  
}  

# 4. 第三方依赖库防警告  
# 如果 SDK 内部引用了这些库但宿主没有引入,防止编译报错  
-dontwarn bolts.**  
-dontwarn com.facebook.fresco.**  

-keep class com.taobao.gcanvas.** { *; }  
-keep class com.custom.smart.refresh.**{*;}  
-keep class com.sample.breakpad.**{*;}  

-keep class uts.sdk.modules.** {*;}  

# 5. 保留 BuildConfig  
# 由于包名不确定,使用通配符保留任意包名下的 BuildConfig 类  
-keep class **.BuildConfig { *; }  

# 6. 解决 java.lang.ClassValue 兼容性问题  
# 某些库(如 Retrofit, OkHttp, Kotlin)可能会尝试访问 ClassValue,导致旧版本 Android 运行时报错  
-dontwarn java.lang.ClassValue  
-dontwarn java.lang.ProcessHandle  

# 7. Kotlin/Kotlinx 防警告  
# 避免因 SDK 内部使用的 Kotlin 类库导致宿主编译警告或错误的优化  
-dontwarn kotlin.**  
-dontwarn kotlinx.**  

# glide  
-keep public class * implements com.bumptech.glide.module.GlideModule  
-keep public class * extends com.bumptech.glide.module.AppGlideModule  
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {  
  **[] $VALUES;  
  public *;  
}  

# 腾讯地图  
-keep public class com.tencent.lbssearch.** {*;}  
-keep public class com.tencent.map.** {*;}  
-keep public class com.tencent.mapsdk.** {*;}  
-keep public class com.tencent.tencentmap.**{*;}  
-keep public class com.tencent.tmsbeacon.**{*;}  
-keep public class com.tencent.tmsbeacon.**{*;}  
-dontwarn com.qq.**  
-dontwarn com.tencent.**  

# 腾讯定位  
-keepattributes *Annotation*  
-keepclassmembers class ** {  
    public void on*Event(...);  
}  
-keep public class com.tencent.location.**{  
    public protected *;  
}  
-keepclasseswithmembernames class * {  
    native <methods>;  
}  
-keep class c.t.**{*;}  
-keep class com.tencent.map.geolocation.**{*;}  
-keep class com.tencent.tencentmap.lbssdk.service.*{*;}  
-keep class com.tencent.tencentmap.lbssdk.officialservice.*{*;}  
-dontwarn  org.eclipse.jdt.annotation.**  
-dontwarn  c.t.**  
-dontwarn  android.location.Location  
-dontwarn  android.net.wifi.WifiManager  
-dontnote ct.**  

# 华夏乐游  
-keep class com.alliance.ssp.ad.** { *; }  
-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken  
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken  

# 章鱼混淆  
-dontwarn com.octopus.**  
-keep class com.octopus.** {*;}  

# 倍孜混淆  
-dontwarn com.beizi.fusion.**  
-dontwarn com.beizi.ad.**  
-keep class com.beizi.fusion.** {*; }  
-keep class com.beizi.ad.** {*; }  

# 华夏乐游  
-keep class com.yd.** { *; }  

#  
-dontwarn com.squareup.haha.guava.**  
-dontwarn com.squareup.haha.perflib.**  
-dontwarn com.squareup.haha.trove.**  
-dontwarn com.squareup.leakcanary.**  
-keep class com.squareup.haha.** { *; }  
-keep class com.squareup.leakcanary.** { *; }  

# Marshmallow removed Notification.setLatestEventInfo()  
-dontwarn android.app.Notification
1***@qq.com

1***@qq.com (作者)

好的,我试试,目前日志那是swiper那报错

1***@qq.com

1***@qq.com (作者)

你好,我想请问下。

目前不白屏了,但是v-if, v-show好像在release版本下,不起作用,宿主应用是flutter。

1***@qq.com

1***@qq.com (作者)

flutter工程可以嘛。

1***@qq.com

1***@qq.com (作者)

我这边好像出了点问题,我取消了混淆后,发现v-show还是不起作用。debug下倒是一切正常

y***@163.com

要回复问题请先登录注册