美文网首页Android开发经验谈Android开发Android技术知识
减少Android应用程序的八种方法APK大小

减少Android应用程序的八种方法APK大小

作者: Android征途 | 来源:发表于2019-01-24 21:15 被阅读23次

    自2012年3月推出Android Marketplace以来,普通Android应用的规模已经增长了五倍。

    其中一些增加是有意义的:典型Android设备可用的内存增加了,那么为什么不使用这个额外的内存来提供更好的用户体验呢?

    但是,有一个点,所有的高清显卡,创新功能和丰富的多媒体内容,对用户体验,没有人有负面影响希望这样永远需要下载的应用程序,然后采取一大块出来的他们的设备的记忆!甚至有证据表明您的APK大小与下载应用程序的人数之间存在负相关关系。根据最近的一项研究,对于APK大小每增加6MB,您可以预期在访问Google Play页面后安装应用的人数会下降1%。

    您可以做的一切都是为了减少APK的大小,这鼓励更多用户下载您的应用,因此在本文中,我将向您展示如何创建一个微调,更轻薄的APK,并确保您的应用尽可能多的设备。

    一 Android应用程序包:支持更多设备,同时减少APK大小

    每当您开发Android应用程序时,您都需要通过提供针对不同屏幕密度,CPU架构,语言和许多其他因素进行优化的代码和资源,确保应用程序与尽可能多的不同设备兼容。不幸的是,这也意味着每个下载应用程序的人都会收到一堆他们永远不会使用的代码和资源。

    在不显着增加APK大小的情况下支持尽可能多的设备一直是Android开发人员面临的一个问题。但是,Android团队的目标是改变所有这一切,采用新的发布格式,旨在帮助您支持所有Android设备,同时减少 APK的大小。根据官方Android开发者博客,通过以这种新的Android应用程序包.aab)格式发布您的应用程序,您应该能够将APK的大小平均减少35%。

    将您的应用上传为.aab文件后,Google Play将使用此单个文件生成:

    • 基本APK包含提供应用基本功能所需的所有代码和资源。下载您应用的所有人都将获得相同的基本APK。
    • 多个配置APK,适用于不同的设备配置。每当有人下载​​您的应用时,他们都会收到针对其特定设备定制的配置APK,并且仅包含他们实际需要的代码和资源。

    要将您的应用程序构建为已签名的Android App Bundle,请首先从Android Studio工具栏中选择Build > Generate Signed Bundle / APK。然后选择Android App Bundle复选框,然后单击Next。现在,打开模块下拉列表,选择app作为基本模块。

    按照屏幕上的说明完成构建过程。Android Studio现在将生成.aab文件并将其存储在计算机的AndroidAppBundle / app / release目录中。

    当您准备好将.aab文件上传到Google Play时,只需转到Google Play控制台并选择创建应用程序即可

    系统会要求您输入有关您的应用的一些基本信息,然后单击“ 创建”,然后单击“ 保存”。在控制台的左侧菜单中,选择应用程序版本。确定要将此应用程序上载到哪个轨道,然后选择其随附的“ 管理”按钮,然后单击“ 创建版本”

    出现提示时,请注册Google Play的App Signing,这是使用App Bundle格式所必需的。选择“ 浏览文件”,然后选择要上载的.aab文件。

    最后,单击“ 保存”以保存配置。

    将应用程序上传到控制台后,您可以看到使用App Bundle格式节省了多少空间。为此,请从左侧菜单中选择应用程序版本。找到您上传Bundle的轨道,然后选择Edit release,然后单击以展开Android App Bundle部分。

    选择Explore App Bundle,您将看到对已保存空间的粗略估计,以百分比表示。

    二 使用动态功能模块按需提供功能

    项目具有一个或多个不必提供该应用程序核心功能的功能并不罕见。您通常可以通过将这些功能分成可选的动态功能APK来减小APK的大小,然后用户可以根据需要随时下载这些功能。

    要创建动态要素模块,请从Android Studio工具栏中选择文件 > 新建 > 新建模块.... 选择Dynamic Feature Module,然后选择Next

    从这里,您可以打开Base应用程序模块下拉列表,然后选择您的基本模块。为模块命名,然后单击“ 下一步”。选中“ 按需启用”复选框。如果您的项目支持Android 4.4或更早版本,那么您还需要启用Fusing,因为这将使您的动态功能模块可用作多APK的这些设备。

    最后给你的模块一个公共名称,最终用户可以看到它。单击完成

    1. 启用对动态功能模块的访问

    创建动态要素模块后,您需要为用户提供在运行时请求它的方法。打开您的模块级build.gradle文件,并将Google Play核心库添加为项目依赖项:

    依赖{
    
    //添加以下//
    
    实现'com.google.android.play:core:1.3.6'
    

    打开Activity或Fragment要加载的动态功能模块,然后添加以下内容:

    private void loadDyanmicFeatureOne(){
    
    //创建SplitInstallManager的实例//
    
            SplitInstallManager splitInstallManager =
                    SplitInstallManagerFactory.create(本);
    
    //创建请求//
    
            SplitInstallRequest请求=
                    SplitInstallRequest
                            .newBuilder()
    
    //指定要下载的模块//
    
                            .addModule(“动态模块”)
                            。建立();
    
            SplitInstallStateUpdatedListener listener = new SplitInstallStateUpdatedListener(){
                @覆盖
                public void onStateUpdate(SplitInstallSessionState splitInstallSessionState){
                    if(splitInstallSessionState.sessionId()== mySessionId){
                        switch(splitInstallSessionState.status()){
                            case SplitInstallSessionStatus.INSTALLED:
                                Toast.makeText(MainActivity.this,“动态模块已下载”,Toast.LENGTH_SHORT).show();
                                打破;
                        }
                    }
                }
            };
    
            splitInstallManager.registerListener(收听);
    
    //通过异步startInstall //提交请求
    
            splitInstallManager.startInstall(请求)
                    .addOnFailureListener(new OnFailureListener(){
                        @覆盖
    
    //如果下载失败,则例外... .//
    
                        public void onFailure(例外e){
    
    //...然后做某事//
    
                        }
                    })
                    .addOnSuccessListener(new OnSuccessListener(){
                        @覆盖
    
    //如果模块已成功下载... //
    
                        public void onSuccess(Integer sessionId){
    
    //...然后做某事//
    
                            mySessionId = sessionId;
                        }
                    });
        }
    }
    

    您现在可以向动态功能模块添加代码和资源,用户可以在运行时请求模块。

    三 购买前先试用:提供即时应用APK

    它可能不是传统的,可安装的APK,但您可以将应用程序的一部分作为轻量级,独立的Instant Apps APK提供,然后用户可以按需加载。对于那些在极其有限的存储或限制性数据计划中苦苦挣扎的人来说,Instant Apps可能是他们体验您的应用程序的唯一可行方式。

    在我们的三部分Instant Apps系列中,我们创建了一个映射到唯一URL 的多功能Instant Apps APK。URL映射使您的Instant App可以从Web上支持超链接的任何位置访问,包括论坛,推文,Facebook帖子和博客。但是,URL映射也是一个多步骤过程,需要您拥有一个可以托管项目assetlinks.json文件的Web域。

    在最新版本的Android Studio中,创建Instant Apps APK变得更加容易,因为现在可以创建一个未映射到任何 URL 的即时应用程序,从而消除了与URL映射相关的所有复杂性。

    在您发布无网址即时应用后,用户可以通过应用的Google Play商家信息上的“ 立即尝试”按钮访问该应用。

    要创建这种“无URL”即时应用程序,您需要:

    • Android Studio 3.2或更高版本。
    • Instant Apps Development SDK 1.3.0或更高版本。
    • 最新版本的Android SDK Build和Platform工具。

    支持Instant Apps的项目具有独特的结构。如果您将模块化作为标准应用程序开发过程的一部分进行练习,那么您可能只需要对项目进行一些调整,但如果您的项目没有模块化,那么请准备花一些时间重组它。

    要支持Instant Apps,您需要创建以下模块:

    • 应用模块。这是“标准”可安装应用程序模块。
    • 基础模块。这包含将在您的所有项目模块中使用的代码和资源,例如您的应用程序的启动器图标。
    • 功能模块。其中包含提供独立功能所需的代码和资源。
    • Instantapp模块。这是一个容器,它最终会占用您项目的每个功能模块,并将它们转换为Instant App APK。

    有关此独特项目结构的更详细信息,请查看:什么是Android即时应用程序?

    如果您正在开始一个新项目,那么您很幸运:您可以创建一个已经具有Instant Apps结构的空白项目。只需正常创建一个新项目,但在提示时选择此项目将支持即时应用程序

    然后,您可以正常地为每个模块添加代码和资源。

    要测试您的无URL即时应用程序,您需要一个兼容设备,根据官方Android文档,它是运行Android 5.1或更高版本的“最”物理设备。如果您正在使用模拟器,那么您将需要使用Android 8.1或更高版本,x86架构并包含Google API的AVD(Android虚拟设备)。您还需要在测试设备或AVD上登录有效的Google帐户。

    要将Instant App置于测试中,请从Android Studio工具栏中选择Run > Run ...,然后选择Edit Configurations ...

    在左侧菜单中,选择instantapp。由于我们正在测试无URL的即时应用程序,请找到URL字段并删除其中的所有文本。现在选择Run。如果设备提示您选择加入Instant App程序,请点击是,我在

    您的即时应用程序现在应该出现在屏幕上,无需安装,也无需URL!

    在发布应用程序时,您可以完成两次签名过程,以创建单独的可安装和即时应用程序APK - 或者您可以将项目构建为应用程序包。

    四 发布即时应用程序启用的应用程序包

    在Android Studio 3.3 beta 1及更高版本中,您可以将Instant Apps与App Bundle结合使用,以创建一个包含可安装和即时应用程序的.aab文件。

    要将应用程序设置为发布包含Instant App 的.aab文件,请打开项目的instantapp模块。

    在此模块的AndroidManifest.xml文件中,添加以下内容:

    `<``manifest`
    
    `xmlns:android``=``"[http://schemas.android.com/apk/res/android](http://schemas.android.com/apk/res/android)"`
    
    `xmlns:dist``=``"[http://schemas.android.com/apk/distribution](http://schemas.android.com/apk/distribution)"`
    
    `//Set the targetSandboxVersion to 2//`
    
    `android:targetSandboxVersion``=``"2"``>`
    
    `//Add the following//`
    
    `<``dist:module` `dist:instant``=``"true"` `/>`
    
    `</``manifest``>`
    

    打开app模块的build.gradle文件,确保您的即时变体versionCode的可安装版本小于其可安装版本:

    android {
        ...
        
        flavorDimensions“flavorDimension”
        productFlavors {
            即时{
                versionCode 1
            }
            安装{
                versionCode 2
            }
        }
    }
    

    从Android Studio菜单栏中选择Build > Generate Signed Bundle / APK,然后照常构建App Bundle,确保使用释放密钥对其进行签名。

    五 删除所有未使用的方法,类,字段,属性和资源

    未使用的代码和资源很容易找到进入项目的方式,特别是当您使用库时。由于它们为您的应用添加了零值,因此您应该始终追踪并删除不必要的资产,并且有几种工具可以帮助您:

    1.喜欢冒险吗?试试New R8 Code Shrinker

    代码缩小可以通过删除未使用的代码和资源来帮助您减小APK的大小。

    Android Studio 3.3 beta 1预览了即将推出的R8代码缩小工具,该工具还可以执行desugaring和dexing,据Google称,它比ProGuard更快地缩小代码。

    要自己尝试R8,请确保您运行的是Android Studio 3.3 beta 1或更高版本,然后将以下内容添加到gradle.properties文件中:

    android.enableR8 =真
    

    2.使用ProGuard收缩代码

    在撰写本文时,R8仍然处于预览状态,因此在它稳定之前,您可能更愿意使用ProGuard从代码中删除未使用的类,方法,字段和属性。

    要启用ProGuard,请将以下内容添加到模块级build.gradle文件中:

    buildTypes {
           发布 {
           minifyEnabled是的
               proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'
           }
       }
    }
    

    请注意,ProGuard可能会删除您的应用程序实际需要的代码,因此您应该在发布之前始终使用ProGuard测试您的项目。

    3.启用资源收缩

    一旦启用了代码收缩,就可以使用资源收缩来识别和删除不必要的资源:

    buildTypes {
           发布 {
    
    //添加以下//
    
            shrinkResources为true
               minifyEnabled是的
               proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'
           }
       }
    }
    

    4.使用Android Lint改进您的代码

    Lint是一种静态扫描工具,可以识别代码中未引用的资源。但是,Lint实际上并未删除这些资源,因此您需要检查其报告并手动删除已识别的资源。

    要运行Lint,请从Android Studio工具栏中选择Analyze > Inspect Code .... 如果Lint检测到任何未引用的资源,那么它将在“ 检查结果”窗口中列出它们。

    六 将PNG,JPEG和BMP转换为WebP

    如果您的项目包含许多drawable,那么压缩它们可以显着减小APK的大小。

    如果您的项目minSdkVersion是18或更高,那么您可以通过将它们转换为WebP格式来压缩您的PNG,JPEG和BMP。

    首先,按住Control键并单击要转换的drawable,然后选择Convert to WebP ...选择有损或无损编码。选择当编码结果大于原始图像时跳过图像,然后单击确定以转换图像。

    七 使用Android Studio的APK分析器检查您的APK

    有时,您可能无法完全确定导致APK失控的原因。

    您可以使用Android Studio的新APK分析器识别出与APK大小相关的最大贡献者。此工具可让您探索不同类别文件的绝对大小和相对大小,甚至是单个文件的大小,这样您就可以确切地知道应该集中精力的位置。

    要分析APK,只需从Android Studio的菜单栏中选择Build > Analyze APK即可

    在随后的窗口中,选择有问题的APK。APK分析器将在新面板中打开。

    对于每个文件和文件夹,APK分析器显示:

    • 原始文件大小。这是磁盘上此项目的解压缩大小。
    • 下载大小。这是项目的估计压缩大小,因为它将由Google Play提供。
    • 总下载大小的百分比。此项目代表的APK总下载大小的百分比。

    这不是APK分析器提供的唯一功能。

    想象一下,你已经成功削减了APK的大小,并发布了一个轻量级的应用程序,在Google Play上积累了5星级的评论 - 这并不意味着你可以不再担心APK的大小!在某些时候,您将要发布更新,这意味着APK大小将再次成为主要关注点。

    虽然监控你的APK从一个版本发展到下一个版本总是一个好主意,但如果APK大小有所增加,那么你肯定想仔细看看发生了什么。

    您可以使用APK分析器突出显示当前APK与之前的APK之间的所有差异,这可以帮助您了解可以优化的区域和资产,甚至可以完全删除。

    要比较APK,首先从Android Studio的菜单栏中选择Build > Analyze APK

    然后选择最新版本的APK。在APK分析器的右上角,选择与之前的APK比较...接下来,选择以前版本的APK。应该会出现一个弹出窗口,突出显示当前APK与之前APK之间的所有差异。

    八 不要忘记Android Go!

    新兴市场代表了全球增长最快的智能手机受众,而Vivo和Oppo等品牌的崛起已经证明,预算设备有可能主导这个快速扩张的市场。

    为了帮助Android吸引这些全新且不断增长的受众,谷歌发布了Android Go,这是一款具有性能和存储改进功能的Android版本,旨在为预算友好型设备提供更好的体验,包括内存小于1GB的设备。

    Android Go用户可以访问整个Google Play商店,但Google会突出显示针对Android Go优化的应用,包括用户设备上占用少于40MB的应用。

    按照本文中的建议,您应该能够为使用它的每个人显着减小APK的大小。但是,如果您想专门针对Android Go用户进行一些额外缩减,那么您可以使用Android的多APK功能发布针对Android Go平台优化的APK。

    要创建专用的Android Go应用,您需要创建一个与“常规”应用具有相同包名和签名证书的APK,但具有唯一的版本代码。

    在创建Android Go APK时,您还需要将以下内容添加到您的Manifest中:

    <uses-feature android:name="android.hardware.ram.low" android:required="true">
    

    想学习更多Android知识,或者获取相关资料请加入Android技术开发交流2群:935654177。本群可免费获取Gradle,RxJava,小程序,Hybrid,移动架构,NDK,React Native,性能优化等技术教程!

    FMNX`NW45P@2{~8XII3B4VF.png

    相关文章

      网友评论

        本文标题:减少Android应用程序的八种方法APK大小

        本文链接:https://www.haomeiwen.com/subject/ibtujqtx.html