(上图是三星手机提示无法安装安卓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)
二. 问题原因分析
- Canvas 尝试绘制一个过大的 Bitmap
-
305,690,256 bytes ≈ 292 MB → 非常大
-
Android 系统(尤其三星 / OneUI 的安装器)在安装 APK 时,会 展示 APK 图标 / 安装界面
-
如果 APK 里包含 超大资源图片(Launcher 图标 / splash / drawable),系统尝试渲染时就会崩溃
-
导致安装器(
com.google.android.packageinstaller)直接崩溃 → 安装失败
- 安装器崩溃 ≠ APK 损坏
-
你的 APK 本身是合法的(adb install 成功)
-
安装器渲染图形资源时 OOM / Canvas 超大 → 崩溃
-
所以手动点击安装失败,但 adb install 仍然能正常安装(adb 不渲染安装界面)
三. 可能触发的原因
- Launcher 图标过大 / Drawable 文件过大
-
Android 允许 mipmap 图标最大 512x512 (或 1024x1024,Android 12+),但是资源可能太大(超过 100 MB 的图片?)
-
splash 图、应用启动图、或者 drawable-web 图可能是高分辨率图片
- 9-Patch / PNG / WebP 文件
-
大图未压缩
-
系统在安装器渲染界面时会把 Bitmap 解码到内存 → 内存过大 → Canvas 报错
- 混淆 / shrinkResources 不会解决
-
因为资源大小本身没变
-
系统安装器渲染图像时还是会崩溃
四.解决方案
回想起这次版本与上次版本的区别,就是换了样式,如果是因为功能添加导致失败,那应该是进入应用才出现,不会卡在安装上,所以尝试换Logo,发现使用旧的Logo后可以正常安装了.或者通过命令行
找出 APK 中超大图片:
unzip -l app-release.apk | sort -k 4 -n
- 按大小排序,找到 >10MB 的资源
-
压缩 / resize / WebP 转换
-
重新打包测试手动安装
-
注意 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 的单张图片
