Android 12 Theming Icons功能触发动态壁纸崩溃问题求助
问题根因定位
从抛出的堆栈可以确认问题出在三星自研的LegibilityColor.convertColors方法中:系统开启Theming Icons功能后,会尝试从动态壁纸的Drawable对象中提取Bitmap生成调色板,而动态壁纸的Drawable并非BitmapDrawable类型,调用getBitmap()时触发空指针,该逻辑是三星One UI在Android12上的独有实现,原生AOSP无此问题。
可快速上线的修复方案
重写壁纸颜色计算方法,主动返回调色板
重写WallpaperService.Engine的onComputeColors()方法,针对Android12及以上的三星机型,手动构造WallpaperColors对象返回,避免系统自行提取壁纸颜色触发空指针,参考代码:@Override public WallpaperColors onComputeColors() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && "samsung".equalsIgnoreCase(Build.BRAND)) { // 可替换为你的动态壁纸的主色调/次色调/暗色调,也可以直接使用通用中性色 return new WallpaperColors( Color.valueOf(0xFFFFFFFF), Color.valueOf(0xFF888888), Color.valueOf(0xFF000000) ); } return super.onComputeColors(); }增加异常捕获兜底
针对壁纸服务的系统回调逻辑增加全局try-catch捕获,避免系统侧抛出的异常导致应用进程崩溃,可在你自定义的WallpaperService.Engine的onCreate方法中为主线程Handler设置异常回调,拦截未捕获的RemoteException相关崩溃。临时规避适配
若暂时不需要支持Theming Icons功能,可在应用Manifest的application节点下添加属性<meta-data android:name="android.theme.customization.icon_pack.enabled" android:value="false"/>,告知系统当前应用不参与主题图标配色,跳过颜色提取逻辑。
提交三星Bug的备选方案
你可以在应用内弹窗邀请已升级Android12的三星S21系列用户参与测试,为参与测试的用户提供小额度奖励,即可快速获取正式版系统下的复现日志与录屏素材,不需要等待远程测试实验室更新系统镜像。
内容的提问来源于stack exchange,提问作者Ardi
相关产品推荐
相关产品推荐

