【问题标题】:Library makes my Android APK too big库使我的 Android APK 太大
【发布时间】:2015-12-06 03:50:42
【问题描述】:

我有自己的自定义库,用于维护我想在多个项目中使用的方法和类。它没有编译成 .jar 文件 - 它设置为 com.android.library 并位于其自己的文件夹中。

我的一个应用程序非常小 - 不到 500k。当我添加这个库时,它激增到 1350k。尽管它仍然很小,但这对于这个特定的应用程序来说是一个问题,我已承诺尽可能小。

应用程序本身的 src 文件夹为 77k。库项目的 src 文件夹为 112k。生成的 apk 的 .dex 文件正好是 1mb。 这怎么可能?

图书馆项目确实引用了 play-services-vision。但是这个应用程序中没有引用它,我相信 Proguard 应该把它去掉。

在“构建变体”窗口中,应用和库都设置为“发布”。

我的应用的 build.gradle 文件:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
       //**CONFIG STUFF**//
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled false
            applicationIdSuffix '.debug'
            versionNameSuffix '.debug'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.1'
    compile project(':farmsoftlibs')
}

注意:appcompat 引用也在我的应用程序的旧版本中,即 500k,所以我知道这不是罪魁祸首。

我的图书馆的 build.gradle:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.google.android.gms:play-services-vision:7.8.0'
}

所以我认为可能解决这个难题的问题是:

  1. 我的 apk 比应用程序和库的完整 java 和 res 文件夹的总和大多少,尤其是在我使用 Proguard 的情况下?
  2. gradle 是否从我的库项目中提取了一些东西,这使得我的 apk 变大了?
  3. 如何确保仅将我的应用实际使用的库方法和类加载到 apk 中?

如果另一个文件与回答此问题相关,请告诉我。谢谢!

【问题讨论】:

  • 您正在使用一些支持库。很正常,反正1M也不算大!

标签: android android-studio gradle proguard android-library


【解决方案1】:
  1. java文件在打包前编译成class文件,通常比java源文件大。我不确定您是如何检查库大小的,但请参阅问题 2 的答案
  2. compile 'com.google.android.gms:play-services-vision:7.8.0',像这样的依赖,可以包含超过 1 个 jar,因为传递依赖,即您使用的库依赖于 1 个或多个库,它们还可以进一步依赖于其他库
  3. 如果您有minifyEnabled=true,并且您没有将proguard-rules.pro 更改为-keep 不必要的类或方法,它应该可以完成这项工作。

关于问题 2 的更多信息,通过我的测试,compile 'com.google.android.gms:play-services-vision:7.8.0',至少添加了 4 个依赖项play-services-visionplay-services-basesupport-annotationssupport-v4

此外,请注意,使用您的配置,proguard 只会在您的 Release 构建中缩小(删除不必要的类),而不是 Debug 构建。

个人意见:实际上 1.3MB 应该已经很小了

【讨论】:

  • 有趣的是,我的电脑上根本找不到 proguard-rules.pro。那会削弱Proguard吗?假设 Vision 及其 4 个依赖项包含在我的应用程序的 dex 文件中,假设它们会被 proguard 剥离是否合理,还是我误解了它的工作原理?
  • 如果您使用 Android Studio 创建了项目,则应该将其放在您的 app 文件夹下
  • 其实它只包含新项目的cmets,所以如果真的丢失了,你可以创建一个空白文件放在那里。
  • aha - 它只有默认的#cmets。不过,我试图理解您的回答的含义-您是说 proguard 应该剥离愿景及其 4 个依赖项,还是我期望过高?我怎么知道?我知道 1.3mb 仍然很小。该应用程序非常简单和紧凑,部分承诺是其中没有隐藏的膨胀或间谍软件。
  • 很抱歉问这个问题,但只是为了确认一下,您是在检查您的发行版还是调试 apk?
猜你喜欢
  • 2014-01-16
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多