【问题标题】:Generated .apk includes unused resources and unused classes生成的 .apk 包括未使用的资源和未使用的类
【发布时间】:2018-08-28 08:30:58
【问题描述】:

我正在为 Android 开发一个非常简单的应用程序,实际上它所做的只是在屏幕上显示当前时间和日期。考虑到这一点,我原本预计应用程序的大小只有几千字节,但事实并非如此。

在生成应用程序的“发布”后,并在 Android Studio 中使用 Build > Analyze APK... 对其进行分析,我可以看到大量的 .png 和 .xml 资源文件被放入 .apk 文件中,我从未使用过或包含其中任何一个(我的项目仅包含 4 个资源文件)。这让我很困扰,因为这些自动包含的资源文件只会占用空间。

这些是自动包含的文件夹(蓝色),其中包含我正在谈论的文件:

如您所见,这大约是应用程序大小的 26%。

类似的情况发生在“classes.dex”文件中,该文件包含数百个(可能数千个)我从未在我的代码中引用的类。例如,在查看文件包含的内容后,我在其中发现了“HashMap”,因为我从未在我的代码中导入它,所以将其包含在内是没有意义的。

最后,我的问题是:是否有可能以某种方式避免将这些未使用的资源文件和类包含在 .apk 的发布中?

注意:我已经在使用了

buildTypes {
    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

在我的“build.gradle”文件中,它确实减少了 .apk 的大小,但是我上面描述的未使用的元素仍然包括在内。

【问题讨论】:

    标签: java android android-studio apk


    【解决方案1】:

    我从来没有使用过,也没有包含过任何一个

    如果你有dependencies,那么这些类和资源来自他们。

    是否有可能以某种方式避免将这些未使用的资源文件和类包含在 .apk 版本中?

    消除你的依赖。

    例如,当您创建项目时,您可能会看到预先选中的“向后兼容性 (AppCompat)”复选框。保持选中状态会添加对 appcompat-v7 的依赖项并设置您的项目以使用它(例如,您的活动扩展 AppCompatActivity 而不是 Activity)。使用appcompat-v7 有利有弊;缺点之一是它会为您的项目增加相当多的开销。

    【讨论】:

    • 太棒了!这解决了未使用的资源和未引用的类(.apk 中仍然包含一些未引用的类,但不像以前那样接近)。只是为了澄清,我通过在“build.gradle”文件的“依赖项”部分中删除一些不必要的“实现”来解决问题。谢谢!
    • @Sorin:请注意,APK 分析器会显示应用中的类和应用中的类引用的外部事物(例如框架)的类/方法。
    猜你喜欢
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    相关资源
    最近更新 更多