三星手机无法安装APK,国内的小米,华为却可以安装

(上图是三星手机提示无法安装安卓Apk的截图)

一. 场景

同一个APK包,在三星手机,手动浏览器或者应用宝下载.apk文件,点击安装,三星手机提示无法安装,但是使用adb install 是可以在三星手机上安装成功的; 可是同样的情况,在国内的小米,华为等手机却可以通过浏览器,应用宝直接下载并安装.

在三星手机上查看Log信息如下:

复制代码
D AndroidRuntime: Shutting down VM
672 19460 19460 E AndroidRuntime: FATAL EXCEPTION: main
672 19460 19460 E AndroidRuntime: Process: com.google.android.packageinstaller, PID: 19460
672 19460 19460 E AndroidRuntime: java.lang.RuntimeException: Canvas: trying to draw too large(305690256bytes) bitmap.
672 19460 19460 E AndroidRuntime: 	at android.graphics.RecordingCanvas.throwIfCannotDraw(RecordingCanvas.java:266)
672 19460 19460 E AndroidRuntime: 	at android.graphics.BaseRecordingCanvas.drawBitmap(BaseRecordingCanvas.java:98)
672 19460 19460 E AndroidRuntime: 	at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:560)
672 19460 19460 E AndroidRuntime: 	at android.widget.ImageView.onDraw(ImageView.java:1446)
672 19460 19460 E AndroidRuntime: 	at android.view.View.draw(View.java:24406)
672 19460 19460 E AndroidRuntime: 	at android.view.View.updateDisplayListIfDirty(View.java:23267)
672 19460 19460 E AndroidRuntime: 	at android.view.View.draw(View.java:24136)
672 19460 19460 E AndroidRuntime: 	at android.view.ViewGroup.drawChild(ViewGroup.java:4748)
672 19460 19460 E AndroidRuntime: 	at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4505)
672 19460 19460 E AndroidRuntime: 	at android.view.View.updateDisplayListIfDirty(View.java:23253)
672 19460 19460 E AndroidRuntime: 	at android.view.View.draw(View.java:24136)

二. 问题原因分析

  1. Canvas 尝试绘制一个过大的 Bitmap
  • 305,690,256 bytes ≈ 292 MB → 非常大

  • Android 系统(尤其三星 / OneUI 的安装器)在安装 APK 时,会 展示 APK 图标 / 安装界面

  • 如果 APK 里包含 超大资源图片(Launcher 图标 / splash / drawable),系统尝试渲染时就会崩溃

  • 导致安装器(com.google.android.packageinstaller)直接崩溃 → 安装失败

  1. 安装器崩溃 ≠ APK 损坏
  • 你的 APK 本身是合法的(adb install 成功)

  • 安装器渲染图形资源时 OOM / Canvas 超大 → 崩溃

  • 所以手动点击安装失败,但 adb install 仍然能正常安装(adb 不渲染安装界面)

三. 可能触发的原因

  1. Launcher 图标过大 / Drawable 文件过大
  • Android 允许 mipmap 图标最大 512x512 (或 1024x1024,Android 12+),但是资源可能太大(超过 100 MB 的图片?)

  • splash 图、应用启动图、或者 drawable-web 图可能是高分辨率图片

  1. 9-Patch / PNG / WebP 文件
  • 大图未压缩

  • 系统在安装器渲染界面时会把 Bitmap 解码到内存 → 内存过大 → Canvas 报错

  1. 混淆 / shrinkResources 不会解决
  • 因为资源大小本身没变

  • 系统安装器渲染图像时还是会崩溃

四.解决方案

回想起这次版本与上次版本的区别,就是换了样式,如果是因为功能添加导致失败,那应该是进入应用才出现,不会卡在安装上,所以尝试换Logo,发现使用旧的Logo后可以正常安装了.或者通过命令行

找出 APK 中超大图片:

复制代码
unzip -l app-release.apk | sort -k 4 -n
  • 按大小排序,找到 >10MB 的资源
  1. 压缩 / resize / WebP 转换

  2. 重新打包测试手动安装

  3. 注意 Launcher / Splash 图不要超过 1024x1024 px

五. 反思

  • Launcher / Splash 图建议:
屏幕密度 建议大小
mdpi 48x48 px
hdpi 72x72 px
xhdpi 96x96 px
xxhdpi 144x144 px
xxxhdpi 192x192 px
web / splash 控制在 1024x1024 以内,WebP 或 PNG 压缩
  • 对大图用 WebP / PNG 压缩resize

  • 避免超过 5~10 MB 的单张图片

相关推荐
lqj_本人8 小时前
鸿蒙electron跨端框架PC今日打卡实战:频率、连续天数和今日进度怎么放进桌面工具
华为·harmonyos
wanhengidc8 小时前
私有云的作用都有哪些?
运维·服务器·网络·游戏·智能手机
GitCode官方13 小时前
直播预约|开源鸿蒙PC命令行工具迁移实战:从环境搭建到真机验证全流程拆解
人工智能·华为·开源·harmonyos·atomgit
lqj_本人13 小时前
鸿蒙electron跨端框架PC工志簿实战:项目、工时、阻塞和下一步都要有位置
数据库·华为·harmonyos
钓了猫的鱼儿15 小时前
基于深度学习+AI的水下目标目标检测与预警系统(Python源码+数据集+UI可视化
人工智能·深度学习·智能手机
胡琦博客18 小时前
Tauri 如何跑到鸿蒙上?从 tauri-demo 看 OpenHarmony 适配链路
华为·harmonyos
钓了猫的鱼儿18 小时前
基于深度学习+AI的玩手机行为目标检测与预警系统(Python源码+数据集+UI可视化界面+YOLOv11训练结果)
人工智能·深度学习·智能手机
nashane19 小时前
HarmonyOS 6学习:文件打开方式应用重复的根治方案与最佳实践
学习·华为·harmonyos
ZHW_AI课题组19 小时前
调用华为云API实现图像标签识别
图像处理·华为·华为云
枫叶丹419 小时前
【HarmonyOS 6.0】Enterprise Space Kit:空间管理服务深入解析
开发语言·华为·harmonyos