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按钮等待即可
切换左上角的 Android
为 Project
,此时可以发现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瘦身
去除冗余功能
- 这两个属性中的allowBackup,被设置为true,则代表允许用户备份Apk安装包和应用数据。这样可能会导致用户的隐私被泄露出去,因此建议将此属性值改为false
- 第二个属性值 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); // 打印错误日志}}
}
相关文章:

Android Studio打包APK
1.导出APK安装包 如果是首次打包,Create new 单击蓝色对话框右边文件夹📂图标 ,选择密钥保存路径,然后在下方File name对话框中填写您想要名称,再点击OK回到密钥创建对话框。 在此对话框中填写密码(Passwo…...

08 比特币通用技术介绍
比特币分层 比特币区块结构 存储结构 区块是比特币存储交易的结构,一个区块总是指向其父节点。 一个区块包含三个字段:区块头、区块交易数量、交易列表。交易数量受到区块大小限制,输入、输出数量和脚本都会占用区块空间,矿工往…...

拟合损失函数
文章目录 拟合损失函数一、线性拟合1.1 介绍1.2 代码可视化1.2.1 生成示例数据1.2.2 损失函数1.2.3 绘制三维图像1.2.4 绘制等高线1.2.5 损失函数关于斜率的函数 二、 多变量拟合2.1 介绍2.2 代码可视化2.2.1 生成示例数据2.2.2 损失函数2.2.3 绘制等高线 三、 多项式拟合3.1 介…...

二进制安卓清单 binary AndroidManifest - XCTF apk 逆向-2
XCTF 的 apk 逆向-2 题目 wp,这是一道反编译对抗题。 题目背景 AndroidManifest.xml 在开发时是文本 xml,在编译时会被 aapt 编译打包成为 binary xml。具体的格式可以参考稀土掘金 MindMac 做的类图(2014),下面的博…...

在线免费快速无痕去除照片海报中的文字logo
上期和大家分享了用photoshop快速无痕去除照片海报中的文字logo的方法,有的同学觉得安装PS太麻烦,有那下载安装时间早都日落西山了,问有没有合适的在线方法可以快速去除;达芬奇上网也尝试了几个网站,今天分享一个对国人…...

引领未来科技潮流:Web3 前沿发展趋势
随着技术不断发展,我们正站在一个全新的互联网时代的门槛上,Web3的出现正在重新定义互联网的构架和运作方式。Web3,作为互联网的下一代发展趋势,其核心思想是去中心化、开放与用户主权。与现有的Web2.0相比,Web3更加注…...

【番外篇】鸿蒙扫雷天纪:运混沌灵智勘破雷劫天局
大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。 这一节课我们不学习新的知识,我们来做一个扫雷小游戏 目录 扫雷小游戏概述一、扫雷游戏分析…...
08.OSPF 特殊区域及其他特性
OSPF 特殊区域及其他特性 一. 前言OSPF的四个特殊区域Stub末梢区域Totally Stub完全末梢区域NSSATotally NSSA完全的NSSA二.Stub 区域和 Totally Stub 区域(1)网络规模变大引发的问题(2)传输区域和末端区域(3)Stub 区域(4)Totally Stub 区域三.NSSA 区域和 Totally NSS…...
人工智能在医疗领域的应用有哪些?
人工智能在医疗领域的应用十分广泛,涵盖了诊断、治疗、药物研发等多个环节,以下是一些主要的应用: 医疗影像诊断 疾病识别:通过分析 X 光、CT、MRI 等影像,人工智能算法能够识别出肿瘤、结节、骨折等病变,…...
c#使用Confluent.Kafka实现生产者发送消息至kafka(远程连接kafka发送消息超时的解决 Local:Message timed out)
水一篇: 参考:c#使用Confluent.Kafka实现生产者发送消息至kafka(远程连接kafka发送消息超时的解决 Local:Message timed out) - 寒冰之光 - 博客园 该死的Kafka,远程连接Kafka超时以及解决办法 - 博客王大…...

【2025年数学建模美赛F题】(顶刊论文绘图)模型代码+论文
全球网络犯罪与网络安全政策的多维度分析及效能评估 摘要1 Introduction1.1 Problem Background1.2Restatement of the Problem1.3 Literature Review1.4 Our Work 2 Assumptions and Justifications数据完整性与可靠性假设:法律政策独立性假设:人口统计…...
DeepSeek 的背景介绍
在全球人工智能大模型蓬勃发展的浪潮中,DeepSeek 宛如一颗耀眼的新星,迅速崛起并吸引了众多关注的目光。它的出现不仅为人工智能领域注入了新的活力,也在一定程度上改变了行业的竞争格局。 一、创立背景与资金支持 DeepSeek,中文…...

Meta 计划 2025 年投资 650 亿美元推动 AI 发展
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
信息学奥赛一本通 2110:【例5.1】素数环
【题目链接】 ybt 2110:【例5.1】素数环 【题目考点】 1. 深搜回溯 2. 质数 【解题思路】 1~n的数字构成一个环,要求相邻数字加和必须是质数。 该题最终输出的是一个序列,只不过逻辑上序列最后一个数字的下一个数字就是序列的第一个数字…...
Redis、MongoDB 和 MySQL评估
Redis、MongoDB 和 MySQL 是三种不同类型的数据库系统,各自有独特的特点和适用场景。MySQL 是一个关系型数据库管理系统(RDBMS),而 Redis 和 MongoDB 是非关系型数据库(NoSQL)。以下是对这三者的比较以及它…...
P1719 最大加权矩形
为了更好的备战 NOIP2013,电脑组的几个女孩子 LYQ,ZSC,ZHQ 认为,我们不光需要机房,我们还需要运动,于是就决定找校长申请一块电脑组的课余运动场地,听说她们都是电脑组的高手,校长没有马上答应他们…...
在生产环境中部署和管理 Apache:运维从入门到精通
在生产环境中部署和管理 Apache:运维从入门到精通 引言 Apache HTTP Server(简称 Apache)作为世界上最受欢迎的 Web 服务器之一,因其稳定性、灵活性和丰富的模块支持而被广泛使用。从个人网站到企业级应用,Apache 都能游刃有余。然而,要想在生产环境中高效部署和管理 A…...

DeepSeek API 的获取与对话示例
代码文件下载:Code 在线链接:Kaggle | Colab 文章目录 注册并获取API环境依赖设置 API单轮对话多轮对话流式输出更换模型 注册并获取API 访问 https://platform.deepseek.com/sign_in 进行注册并登录: 新用户注册后将赠送 10 块钱余额&#…...
【愚公系列】《循序渐进Vue.js 3.x前端开发实践》027-组件的高级配置和嵌套
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...
预测性维护系统:让设备“未卜先知”
预测性维护系统:让设备“未卜先知” 在工业4.0的浪潮中,设备管理正在向智能化转型。传统的设备维护方式,要么是定期维护(时间消耗大),要么是被动维修(问题发生后再处理)。这种方式效率低下且成本高昂。而预测性维护(Predictive Maintenance,简称PdM)则为设备管理提…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...