Android – 在Gradle中更改APK文件名

默认情况下,Android Studio中的Gradle构建命名为.apk文件app-release.apk。对应用程序build.gradle文件进行了一些小的更改,可以将.apk名称更改为<app name>-release-<version>.apk。

需要在app的目录下面修改build.gradle文件。

第一步是将project.archivesBaseName设置为您的应用程序名称。

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.0"
    versionCode 1
    versionName "1.0.0"
    project.archivesBaseName = "AppName"
}

第二步是在该Gradle文件的buildTypes部分添加如下代码:

buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            applicationVariants.all { variant ->
                variant.outputs.each{ output ->
                    output.outputFile = new File(output.outputFile.parent,output.outputFile.name.replace(".apk","-" + defaultConfig.versionName + ".apk" ))
                }
            }
        }
    }

之前上面那么写是没问题的,当我更新android studio 3.0的时候,再重新打包的时候,就出现了问题,就会报下面的错误;

Error:(23, 0) Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=debug, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.

简单来说就是我们之前用的outputFile属性是只读的,不能再使用了。所以这里我又换了一种写法:

applicationVariants.all{
     variant->variant.outputs.all{
//android studio3.0之前的写法
 //    output->output.outputFile=new File(output.outputFile.parent,output.outputFile.name.replace(".apk","-"+defaultConfig.versionName+".apk"))
//android studio3.0的写法
       outputFileName = "${project.archivesBaseName}-${defaultConfig.versionName}.apk"
     }
 }

这就是重命名.apk文件所需要的全部。

//多渠道打包
productFlavors{
  test{}
}
//打包类型
buildTypes{
  //debug版本
  debug{}

  //release版本
  release{}
}

这里需要注意一点就是,如果我们用了productFlavors{}属性,那咱们就不用去添加defaultConfig.versionName了,因为如果添加了,打出包的名称就会多一个versionName。 例如: 没有使用productFlavors{}情况下:AppName-1.0.0.apk 使用productFlavors{}情况下:AppName-test-release-1.0.0.apk,如果您加了defaultConfig.versionName,那打出的包就会是AppName-test-release-1.0.0-1.0.0.apk。

修改应用包名的全部内容就这么多了。

快乐生活!快乐工作!快乐编程!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Pulsar-V

Ubuntu Linux下通过c++获取屏幕大小

操作1,从驱动读取屏幕大小 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #i...

3146
来自专栏iOS技术

iOS架构:MVVM设计模式+RAC响应式编程

每次做完项目过后,都会被自己庞大的ViewController代码吓坏,不管是什么网络请求、networking data process、跳转交互逻辑统统往V...

8029
来自专栏二次元

Linux下安装PHP环境

1901
来自专栏Android源码框架分析

Android ContentProvider支持跨进程数据共享与"互斥、同步"杂谈

在开发中,假如,A、B进程有部分信息需要同步,这个时候怎么处理呢?设想这么一个场景,有个业务复杂的Activity非常占用内存,并引发OOM,所以,想要把这个A...

2273
来自专栏xingoo, 一个梦想做发明家的程序员

套接字选项

选项影响套接字操作,如 封包路由,OOB数据传输,获取和设置套接字选项分别是 getsockopt  setsockopt 用法如下: int getsocko...

1856
来自专栏蓝天

同时具备多线程和多进程安全的写日志工具

接口请浏览:https://github.com/eyjian/mooon/blob/master/mooon/include/mooon/sys/log.h ...

2074
来自专栏Golang语言社区

[Go 语言社区]服务器自测JS 工程

<!DOCTYPE html> <meta charset="utf-8" /> <title>WebSocket Test</title> <sc...

4166
来自专栏信安之路

必知必会的安全工具

渗透测试中手工测试固然重要,但是测试工具也是必不可少的,一个好的工具可以让我们在渗透测试中事半功倍,俗话说,工欲善其事必先利其器,所以工具是很重要的,本文就主要...

930
来自专栏atom

国内最好的破解软件下载站整理

1.3K6
来自专栏程序员的酒和故事

C++工程中常用的宏定义(#define)

尽管说define有很多不足之处,很多时候我们需要使用const来替代define, 也可以使用typedef来替代define。 但是,在一些实际工程中,我们...

6236

扫码关注云+社区