【问题标题】:barteksc/AndroidPdfViewer massive APK Sizebarteksc/AndroidPdfViewer 海量 APK 大小
【发布时间】:2023-03-21 19:33:01
【问题描述】:

我们包含此AndroidPdfViewer library 以支持在应用程序中查看 PDF 报告。它导致 APK 大小从 4.7Mb 大幅增加至 20.1Mb。

有没有办法减小这个尺寸。让我知道在哪里以及需要修补什么来帮助或解决这个问题。

我熟悉 proguard,并为我的应用配置了它并取得了相当大的成功。

【问题讨论】:

    标签: android apk androidpdfviewer


    【解决方案1】:

    为什么生成的 apk 这么大

    documentation by barteksc/AndroidPdfViewer中所述

    Android PdfViewer 依赖于 PdfiumAndroid,它是一组原生的 许多架构的库(几乎 16 MB)。 Apk 必须包含所有 这个库可以在市场上可用的每台设备上运行。 幸运的是,Google Play 允许我们上传多个 apk,例如一 每个架构。自动上有好文章 将您的应用程序拆分为多个 apk,可用 here。 最重要的部分是改进多个 APK 创建和 使用 APK Splits 处理 versionCode,但整篇文章都值得 读。您只需要在您的应用程序中执行此操作,无需 forking PdfiumAndroid 左右。

    API:https://github.com/barteksc/AndroidPdfViewer

    【讨论】:

    • 请提供解决方案。为什么要提供原因。如果您没有答案,请不要评论
    【解决方案2】:

    我也遇到了同样的问题,但到目前为止,通过使用 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 概念比较复杂。

    所以,我建议你使用这种方式。

    【讨论】:

    • 捆绑包大小减小了吗?
    • @AkshayRaut 捆绑包的大小不会减少。但是,当您将捆绑包上传到 Google Play 控制台时,每个用户都会收到较小的 apk 大小。如果您对 Android App Bundle 不太了解,请参阅这篇博文。 medium.com/swlh/android-app-bundle-complete-guide-69984d02f744
    【解决方案3】:

    如果有人正在为您的应用寻找一个轻量级的 pdf 查看器,那么试试这个

    Use this library

    由于 barteksc-androidpdfviewer 需要更多空间,它帮助我将应用程序大小从 27MB 减少到 10MB

    【讨论】:

    • 它将无法呈现许多 PDF。它使用的是PdfRenderer,它专为使用 Android 的打印框架创建的 PDF 的打印预览而设计。 PdfRenderer 无法处理来自任意来源的任意 PDF。
    【解决方案4】:

    您必须为不同的设备生成多个 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 文件中的什么位置?
    猜你喜欢
    • 2019-01-24
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    相关资源
    最近更新 更多