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

相关推荐
王码码20355 天前
Flutter for OpenHarmony:socket_io_client 实时通信的事实标准(Node.js 后端的最佳拍档) 深度解析与鸿蒙适配指南
android·flutter·ui·华为·node.js·harmonyos
Swift社区5 天前
如何利用 ArkUI 框架优化鸿蒙应用的渲染性能
华为·harmonyos
特立独行的猫a5 天前
uni-app x跨平台开发实战:开发鸿蒙HarmonyOS影视票房榜组件完整实现过程
华为·uni-app·harmonyos·轮播图·uniapp-x
甲枫叶5 天前
【claude热点资讯】Claude Code 更新:手机遥控电脑开发,Remote Control 功能上线
java·人工智能·智能手机·产品经理·ai编程
wanhengidc5 天前
云手机 打造云端算力
运维·服务器·网络·游戏·智能手机
苡~5 天前
【claude热点资讯】炸裂!炸裂!Claude Code 更新:手机遥控电脑开发,Remote Control 功能上线
java·人工智能·智能手机·ai编程·claude api
特立独行的猫a5 天前
uni-app x跨平台开发实战:开发鸿蒙HarmonyOS滚动卡片组件,scroll-view无法滚动踩坑全记录
华为·uni-app·harmonyos·uniapp-x
不爱吃糖的程序媛5 天前
Flutter Orientation 插件在鸿蒙平台的使用指南
flutter·华为·harmonyos
不爱吃糖的程序媛5 天前
鸿蒙Flutter实战:Windows环境搭建踩坑指南
flutter·华为·harmonyos
不爱吃糖的程序媛5 天前
Flutter 插件适配 HarmonyOS 实战:以屏幕方向控制为例
flutter·华为·harmonyos