【发布时间】:2023-03-21 19:33:01
【问题描述】:
我们包含此AndroidPdfViewer library 以支持在应用程序中查看 PDF 报告。它导致 APK 大小从 4.7Mb 大幅增加至 20.1Mb。
有没有办法减小这个尺寸。让我知道在哪里以及需要修补什么来帮助或解决这个问题。
我熟悉 proguard,并为我的应用配置了它并取得了相当大的成功。
【问题讨论】:
标签: android apk androidpdfviewer
我们包含此AndroidPdfViewer library 以支持在应用程序中查看 PDF 报告。它导致 APK 大小从 4.7Mb 大幅增加至 20.1Mb。
有没有办法减小这个尺寸。让我知道在哪里以及需要修补什么来帮助或解决这个问题。
我熟悉 proguard,并为我的应用配置了它并取得了相当大的成功。
【问题讨论】:
标签: android apk androidpdfviewer
为什么生成的 apk 这么大?
如documentation by barteksc/AndroidPdfViewer中所述
Android PdfViewer 依赖于 PdfiumAndroid,它是一组原生的 许多架构的库(几乎 16 MB)。 Apk 必须包含所有 这个库可以在市场上可用的每台设备上运行。 幸运的是,Google Play 允许我们上传多个 apk,例如一 每个架构。自动上有好文章 将您的应用程序拆分为多个 apk,可用 here。 最重要的部分是改进多个 APK 创建和 使用 APK Splits 处理 versionCode,但整篇文章都值得 读。您只需要在您的应用程序中执行此操作,无需 forking PdfiumAndroid 左右。
【讨论】:
我也遇到了同样的问题,但到目前为止,通过使用 android 应用程序包来减少 apk 大小非常容易。 首先在 build.gradle(Module: app) 中将这些行添加到 android { } 括号内。
bundle {
abi {
enableSplit = true
}
}
这将根据架构处理 apk 拆分。 现在,还记得在 proguard-rules.pro 中添加这一行
-keep class com.shockwave.**
如果您不在 proguard-rules.pro 中添加此行,那么您的应用将在发布版本中崩溃。 现在,在此之后转到 Build,然后选择 Generate Signed Bundle/apk。从这里,生成一个签名包。捆绑包的生成方式与生成 apk 的方式完全相同。 然后,将您的包(.aab 文件)上传到 Google Play 控制台,您会看到每台设备都会根据其架构获得不同的 apk。 这是减小应用程序大小的最简单方法。多 apk 概念比较复杂。
所以,我建议你使用这种方式。
【讨论】:
如果有人正在为您的应用寻找一个轻量级的 pdf 查看器,那么试试这个
由于 barteksc-androidpdfviewer 需要更多空间,它帮助我将应用程序大小从 27MB 减少到 10MB
【讨论】:
PdfRenderer,它专为使用 Android 的打印框架创建的 PDF 的打印预览而设计。 PdfRenderer 无法处理来自任意来源的任意 PDF。
您必须为不同的设备生成多个 APK,通过这样做,您可以将 apk 的大小减少到比以前少 10 MB。将以下代码添加到 build.gradle (Module:App)
android{
.....
splits {
abi {
enable true
reset()
include 'x86_64', 'x86', 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'mips'
universalApk false
}
}
.....
}
ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, mips: 4, 'x86': 5, 'x86_64': 6]
import com.android.build.OutputFile
// For each APK output variant, override versionCode with a combination of
// ABI APK value * 1000 + defaultConfig.versionCode
android.applicationVariants.all { variant ->
// assign different version code for each output
variant.outputs.each { output ->
output.versionCodeOverride =
project.ext.versionCodes.get(output.getFilter(OutputFile.ABI)) * 1000 + android.defaultConfig.versionCode
}
}
Whatch 视频在这里https://youtu.be/bP05Vpp49hs 详细解释如何做到这一点。
【讨论】:
ext.versionCodes 究竟应该放在 .gradle 文件中的什么位置?