Bootstrap

【Android】Android Studio打包APK、精简APK大小与规范处理详解

 

目录

引言

一、应用打包

1.1 导出APK安装包

1.2 制作App图标 

1.3 给APK瘦身  

1.3.1 去除冗余功能 

1.3.2 精简无用资源 

1.3.3 压缩图片大小 

二、规范处理 

2.1 版本设置

2.2 发布模式 

结语


引言

Android Studio中运行程序默认都是debug版本,而想要在别人手机上安装应用,就需要把App打包成APK文件(release版本) 。


一、应用打包


1.1 导出APK安装包

依次选择菜单Build→Generate Signed App Bundle / APK... 

 

 

弹出对话框:如下图所示

 

默认选项即为APK,直接单击Next按钮,进入APK签名对话框:如下图 

 

①Create new...

单击蓝色对话框右边文件夹📂图标 ,选择密钥保存路径,然后在下方File name对话框中填写您想要名称,再点击OK回到密钥创建对话框。

 

在此对话框中填写密码(Password)、确认密码(Confirm)、别名(Alias)、别名密码(Password)、别名的确认密码(Confirm)、修改密钥文件的有效期限(Validity)。对话框下半部分只有姓名(First and Last Name)是必填的。填完如下图所示

单击OK按钮回到APK签名框,此时Android Studio会自动把密码和别名填上。如果一开始选择的是已存在的密钥文件,则需手动输入密码和别名 。最后结果如下图所示:

单击Next进入下一个对话框,如下图所示。

对话框上方可选择APK文件的保存路径,对话框中部可选择编译变量(Build Variants),如果是调试用,则编译变量选择 debug 版本;如果是发布用,则选择 release 版本(想要别的手机安装app则选择release版本)。最后点击Create按钮等待即可

 

成功构建结果: 

 

至此,APK安装包(release版本)已经生成成功 ,您可以在下图中找到对应安装包。

 

注意: 如果APK文件安装失败,则可能是以下原因导致的:

  1. App只能升级不能降级,假如安装包的版本号小于已安装App的版本号,就无法正常安装。版本号在build.gradle.kts中versionCode节点设置
  2. 倘若新旧App签名不一致,也会导致安装失败。如之前手机安装了debug类型的App,现在又要安装release版本,就会签名冲突。

1.2 制作App图标 

新建的App工程,默认的应用图标都是机器人,如果要发布正规的App,肯定需要自定义一个好看美观的图标去替代机器人的。可是要手动去设置好几种分辨率mipmap-***目录,肯定是累得够呛,此时就需要用的Android Studio自带的插件---Image Asset 

点击项目结构图模块名称,右键菜单选择New→Image Asset,弹出如下对话框

此时在左侧Path对话框中,点击文件夹📂图标选择您想要更改的图标,右侧就会自动裁剪显示各规格图标的效果,如下图所示

再点击Next按钮,进入下一页窗口,在点击Finish按钮完成即可。


1.3 给APK瘦身  

APK安装包的文件大小是很重要的参考因素。


1.3.1 去除冗余功能 

新创建的Android项目,打开模块下的AndroidManifest.xml文件,其默认application节点是这样:

其中有两个属性allowBackup和supportRtl。

这两个属性中的allowBackup,被设置为true,则代表允许用户备份Apk安装包和应用数据。这样可能会导致用户的隐私被泄露出去,因此建议将此属性值改为false

第二个属性值 supportRtl ,被设置为true,则支持从右到左的文字系统,像阿拉伯语等就是从右到左书写,但是常用的中文、英文都是从左到右的,因此无特殊情况也建议将此属性值设为false


1.3.2 精简无用资源 

打开新项目中模块级别的build.gradle.kts,发现buildTypes节点是下方这样的:

其中的isMinifyEnabled 属性值默认是 false,其意思是是否启用最小化,如果将其设置为true,则Android Studio在打包APK文件会进行如下处理:

  • 压缩代码,移除各种无用实体,包括类、接口、方法、属性、临时变量等。
  • 混淆代码,把类名、属性名、方法名、变量名替换成简短且无意义的名称,例如People类名称替换成a,方法getID替换成b等。

1.3.3 压缩图片大小 

可根据画图或PhotoShop自行修改图片大小与图像质量,本文就不做详细介绍了。


二、规范处理 


2.1 版本设置

每个App都有3个基础信息:第一个是App的图标,图标文件为res/mipmap-***目录下的ic_launcher.png;

第二个是App的名称,名称文字保存在res/values/strings.xml的appname当中;

第三个是App的版本号,版本信息包括build.gradle.kts的versionCode与versionName两个参数,其中versionCode为纯数字的版本编号,versionName为带点号的字符串,格式形如“数字.数字.数字”。

    其中versionCode的数值越大,表示该安装包的版本越高;versionCode的数值越小,表示该安装包的版本越低。依据当前App的版本号与待安装APK的版本号,系统方能比较得知是否允许升级App。

     至于版本名称versionName,则用来标识每次App升级的改动程度,按照通常的版本名称格式“数字.数字,数字”,第一个数字为大版本号,每当有页面改版或代码重构等重大升级时,大版本号要加1,后面两个数字清零;第二个数字为中版本号,每当要更新局部页面或添加新功能时,中版本号加1,第三个数字清零;第三个数字为小版本号,每当有界面微调或问题修复时,小版本号加1。

像应用包名、应用版本等信息,可从编译配置工具BuildConfig获取,该类提供的几个配置属性说明如下:

  • APPLICATION ID:应用包名。
  • BUILD TYPE:编译类型。为debug表示这是调试包,为release表示这是发布包。
  • VERSION CODE:应用的版本编号。
  • VERSION NAME:应用的版本名称。 

代码示例: 

ImageView iv_icon = findViewById(R.id.iv_icon);
iv_icon.setImageResource(R.mipmap.ic_launcher);
TextView tv_desc = findViewById(R.id.tv_desc);
// 应用名称取自app_name,应用包名、版本号、版本名称均来自BuildConfig
@SuppressLint("DefaultLocale") 
String desc = String.format("App名称为%s\nApp包名为%s\nApp版本号为:%d\nApp版本名称为:%s",
                getString(R.string.app_name), BuildConfig.APPLICATION_ID,             
                BuildConfig.VERSION_CODE, BuildConfig.VERSION_NAME);
tv_desc.setText(desc);

注意: 

从Android Gradle 插件 7.0.0 开始,出于性能优化的考虑,默认情况下不再自动生成 BuildConfig 类。这是为了加快构建速度,特别是在大型项目中。所以如果我们需要主动生成BuildConfig 类,以下方法可以重新启用它。

在模块级 build.gradle.kts 文件中的 android {} 中添加以下配置:

buildFeatures {
    buildConfig = true
}

此后将代码示例中用到BuildConfig的地方注释,运行程序成功之后,再将用到BuildConfig解注释就不会报错了。


2.2 发布模式 

代码的调试信息对于程序员往往是十分重要的一部分,但是发布版本的App,用户并不 关心这些信息,因此我们需要一个开关去控制是否显示调试信息。

App代码可通过BuildConfig.DEBUG去判断当前是发布模式还是调试模式,值为false表示是发布模式true调试模式

代码示例:

Log工具用于打印调试日志。但是用户不关心App日志,因此除非右特殊情况,发布上线的的App应屏蔽所有日志信息。

package com.you.package.name.util;

import android.util.Log;

import com.you.package.name.BuildConfig;

public class LogUtil {
    // 调试模式来自BuildConfig.DEBUG,false表示发布模式,true表示调试模式
    public static boolean isDebug = BuildConfig.DEBUG;

    public static void v(String tag, String msg) {
        if (isDebug) {
            Log.v(tag, msg); // 打印冗余日志
        }
    }

    public static void d(String tag, String msg) {
        if (isDebug) {
            Log.d(tag, msg); // 打印调试日志
        }
    }

    public static void i(String tag, String msg) {
        if (isDebug) {
            Log.i(tag, msg); // 打印一般日志
        }
    }

    public static void w(String tag, String msg) {
        if (isDebug) {
            Log.w(tag, msg); // 打印警告日志
        }
    }

    public static void e(String tag, String msg) {
        if (isDebug) {
            Log.e(tag, msg); // 打印错误日志
        }
    }
}

结语

在Android开发过程中,APK打包、精简大小以及规范处理是开发者必须掌握的重要技能。通过本文的详细介绍,我们了解了如何使用Android Studio进行APK打包,包括签名配置、编译类型选择等关键步骤。同时,我们也学习了多种方法来精简APK大小,如移除未使用的资源和代码、压缩图像资源等,这些方法都能显著提高应用的下载速度和用户体验。

最后,希望本文能对广大Android开发者有所帮助,也期待大家在实践中不断积累经验,共同推动Android生态的繁荣发展。

 

;