三星手机无法安装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 的单张图片

相关推荐
鸣弦artha2 小时前
Flutter框架跨平台鸿蒙开发——EventChannel事件通道
flutter·华为·harmonyos
信创天地2 小时前
国产化消息中间件双雄:东方通TongLINK/Q与华为RabbitMQ的运维核心技术全解析
运维·华为·rabbitmq
线束线缆组件品替网2 小时前
Panduit 数据中心布线设计实战解析
数码相机·测试工具·智能手机·电脑·pcb工艺·智能手表·智能电视
南村群童欺我老无力.2 小时前
Flutter 框架跨平台鸿蒙开发 - 打字练习应用开发教程
flutter·华为·harmonyos
猛扇赵四那边好嘴.2 小时前
Flutter 框架跨平台鸿蒙开发 - 录音工具应用开发教程
flutter·华为·harmonyos
世人万千丶2 小时前
鸿蒙跨端框架 Flutter 学习 iverpod 实战:超越 Provider 的响应式状态管理
学习·flutter·华为·交互·harmonyos·鸿蒙
猛扇赵四那边好嘴.2 小时前
Flutter 框架跨平台鸿蒙开发 - 学习打卡助手应用开发教程
学习·flutter·华为·harmonyos
熊猫钓鱼>_>3 小时前
【开源鸿蒙跨平台开发先锋训练营】[Day 3] React Native for OpenHarmony 实战:网络请求集成与高健壮性列表构建
大数据·人工智能·react native·华为·开源·harmonyos·智能体