Android Studio打包APK

1.导出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按钮等待即可

切换左上角的 AndroidProject,此时可以发现app项目下多了个release文件夹,文件夹下有apk文件

点击该apk文件,右键 Open In -> Explorer,就能打开到该apk所在的文件夹

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

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

2.安装APK

下载夜神模拟器https://www.yeshen.com/

夜神模拟器默认是平板机型,点击右上角设置图标,可以修改设置,调整机型和分辨率

将刚刚打包好的apk拖到夜神模拟器中

此时相当于将apk装到了手机里,点击该应用,打开即可

3.制作App图标

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

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

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

4.APK瘦身

去除冗余功能
  1. 这两个属性中的allowBackup,被设置为true,则代表允许用户备份Apk安装包和应用数据。这样可能会导致用户的隐私被泄露出去,因此建议将此属性值改为false
  2. 第二个属性值 supportRtl ,被设置为true,则支持从右到左的文字系统,像阿拉伯语等就是从右到左书写,但是常用的中文、英文都是从左到右的,因此无特殊情况也建议将此属性值设为false
精简无用资源

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

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

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

5.规范处理

版本设置
  • 每个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解注释就不会报错了。

发布模式

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

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

复制代码
package com.package.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); // 打印错误日志
        }
    }
}
相关推荐
阿巴斯甜12 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker13 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952714 小时前
Andorid Google 登录接入文档
android
黄林晴15 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android