库依赖会增加 APK 的大小吗?

Posted

技术标签:

【中文标题】库依赖会增加 APK 的大小吗?【英文标题】:Do library dependency increase size of APK? 【发布时间】:2016-03-23 10:47:48 【问题描述】:

我的项目中有多个库,例如

dependencies 
    compile files('libs/universalloaderlibrary.jar')
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.1'
    compile 'com.android.support:design:22.2.1'
    compile 'com.android.support:recyclerview-v7:22.2.1'
    compile 'com.android.support:cardview-v7:22.2.1'
    compile 'de.hdodenhof:circleimageview:1.3.0'
    compile 'com.jakewharton:butterknife:7.0.1'
    //noinspection GradleCompatible
    compile 'com.google.android.gms:play-services-gcm:7.3.0'
    compile 'com.github.castorflex.smoothprogressbar:library:1.1.0'
    compile 'com.google.code.gson:gson:2.2.4'
    compile 'com.loopj.android:android-async-http:1.4.8'
    compile 'com.android.support:multidex:1.0.1'

和其他库。 他们是否过多地增加了应用程序的大小。我的项目中有超过 25 个库。现在 APK 大小为 11 MB,我必须在其中添加更多功能。 可能是什么原因?

我对此有一些疑问。

什么会占用更多内存?

    在项目中添加了模块。 文件添加为 JAR 文件。 我们添加的 Gradle 依赖项就像 compile 'com.android.support:appcompat-v7:22.2.1'

我通过启用 Proguard 了解到,设置 minifyEnabled true 可以减小应用程序大小。

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

它们在图片背后是如何工作的?

我们应该避免在项目中使用多个库吗?

我想到了很多关于减小 APK 大小的问题。 任何形式的建议和帮助都将是可观的。 提前致谢。

【问题讨论】:

【参考方案1】:

所有这三种方法都会增加 APK 的大小。它们之间的区别在于源代码所在的位置:

模块依赖是本地计算机上的源代码。在您构建应用程序时,它会被编译成字节码。 JAR 文件是预编译的字节码。它也在您的本地机器上,但它不是真正的源代码。字节码只是在您构建时添加到您自己的。 Gradle 依赖项与使用 JAR 文件基本相同,只是 Gradle 将下载预编译的工件,而不是将其作为文件添加到本地计算机上。

无论上述情况如何,依赖项都会将其类贡献给构建,并且它们将出现在最终输出(APK)中。

Proguard 做了一些可以减小 APK 大小的事情。它可以静态分析所有字节码并删除从未使用过的类和方法。它还可以将类、字段和方法重命名为更小的标识符,例如“abc”,这可能会在一定程度上缩小字节码的大小。

【讨论】:

感谢您的解释。请提出一些减小尺寸的方法。 @AnujSharma 您已经在使用 proguard。 11MB 不算多,先专注于构建您的应用和功能,然后再考虑 APK 大小(如果有的话)。【参考方案2】:

是的,依赖项加上项目自身源代码编译的输出,被发送到dex进行字节码转换并包含在最终的APK中。

使用proguard,可以系统地删除未使用的类

【讨论】:

以上是关于库依赖会增加 APK 的大小吗?的主要内容,如果未能解决你的问题,请参考以下文章

通过Gradle为APK瘦身

Android 插件化VirtualApp 安装并启动资源中自带的 APK 插件 ( 添加依赖库 | 准备插件 APK | 启动插件引擎 | 拷贝 APK 插件 | 安装插件 | 启动插件 )(代码片

Android 插件化VirtualApp 安装并启动资源中自带的 APK 插件 ( 添加依赖库 | 准备插件 APK | 启动插件引擎 | 拷贝 APK 插件 | 安装插件 | 启动插件 )(代码片

Gradle 依赖&解决依赖冲突

我应该增加依赖更新的主要版本吗

生成库文件,会链接依赖的库文件吗?