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

目录

引言

一、应用打包

[1.1 导出APK安装包](#1.1 导出APK安装包)

[1.2 制作App图标](#1.2 制作App图标)

[1.3 给APK瘦身](#1.3 给APK瘦身)

[1.3.1 去除冗余功能](#1.3.1 去除冗余功能)

[1.3.2 精简无用资源](#1.3.2 精简无用资源)

[1.3.3 压缩图片大小](#1.3.3 压缩图片大小)

二、规范处理

[2.1 版本设置](#2.1 版本设置)

[2.2 发布模式](#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:应用的版本名称。

代码示例:

java 复制代码
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 {} 中添加以下配置:

java 复制代码
buildFeatures {
    buildConfig = true
}

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


2.2 发布模式

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

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

代码示例:

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

java 复制代码
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生态的繁荣发展。

相关推荐
openinstall全渠道统计3 小时前
免填邀请码工具:赋能六大核心场景,重构App增长新模型
android·ios·harmonyos
双鱼大猫3 小时前
一句话说透Android里面的ServiceManager的注册服务
android
双鱼大猫4 小时前
一句话说透Android里面的查找服务
android
双鱼大猫4 小时前
一句话说透Android里面的SystemServer进程的作用
android
双鱼大猫4 小时前
一句话说透Android里面的View的绘制流程和实现原理
android
Earth explosion4 小时前
ide使用技巧与插件推荐
ide
双鱼大猫4 小时前
一句话说透Android里面的Window的内部机制
android
双鱼大猫5 小时前
一句话说透Android里面的为什么要设计Window?
android
双鱼大猫5 小时前
一句话说透Android里面的主线程创建时机,frameworks层面分析
android
dringlestry5 小时前
pycharm将当前项目上传到github
ide·pycharm·github