Android Gradle 构建:重命名 apk

Posted

技术标签:

【中文标题】Android Gradle 构建:重命名 apk【英文标题】:Android Gradle build : renaming the apk 【发布时间】:2013-05-23 03:43:42 【问题描述】:

如何调整我的 build.gradle 以更改 apk(s) 的最终基本名称? (不改变默认后缀)

【问题讨论】:

【参考方案1】:

在 Gradle 1.8 上,project.archivesBaseName 确实有效,但它给出了这样的抱怨:

按需创建属性(也称为动态属性)已 已弃用,并计划在 Gradle 2.0 中删除。请阅读 http://gradle.org/docs/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html 有关替换动态属性的信息。已弃用 动态属性:“根项目”上的“archivesBaseName” 'myapp'",值:"AnotherName"。

要消除警告(并避免您的构建在 Gradle 2.0 上中断),请使用以下命令:

project.ext.set("archivesBaseName", "AnotherName");

...正如ExtraPropertiesExtension documentation 中所建议的那样。

更新(Gradle 插件 1.1.0)

android Gradle 插件版本 1.1.0 引入了一个破坏 archivesBaseName、as friederbluemle noted 的错误。但幸运的是,此问题已得到修复(在 version 1.1.2 中)。

【讨论】:

这个可以和版本号和版本名结合吗? @Marco:不确定,我自己没有这样做。您可以检查这些问题是否有帮助:Change apk name with Gradle & How to set versionName in APK filename using gradle?。如果没有,请就此提出一个新的具体问题! 由于某种原因,这停止与 Android Gradle 插件的版本 1.1.0-rc1 一起工作。有谁知道为什么? @friederbluemle 这是插件中的一个错误,但在 1.1.2 版本中已修复。 @kagali-san:为什么?我刚刚使用最新的 Android Gradle 插件 (1.2.2) 和最新的 Gradle (2.4) 验证了 archivesBaseName 工作正常。【参考方案2】:

我找到了一个非常简单的解决方案。 apk 基本名称是在项目上定义的属性archivesBaseName。所以以下行足以重命名 apk:

project.archivesBaseName = "AnotherName";

【讨论】:

您是如何找到此房源的?我的意思是,在哪里? 我在 gradle 源代码中 somewhere 找到了它......但我不记得确切的位置。对不起 project.archivesBaseName = "$applicationId-$versionName-$versionCode".toString() @danik 我用了你的截图,但出现错误,如何解决?错误显示:Could not get unknown property 'versionName' for project ':app' of type org.gradle.api.Project. @danik 感谢您的回复。这是我的错误,在project.ext.set("archivesBaseName", "$applicationId-$versionName-$versionCode".toString()); 错误范围内使用了$versionName,【参考方案3】:

从您必须使用的 Android Gradle 插件的 1.1.0 版本开始

archivesBaseName = "yourOtherName"

而不是 project.ext.set("archivesBaseName", "yourOtherName") 在您的 build.gradle 中使其工作。

【讨论】:

Android Gradle 插件中的archivesBaseName 存在一个错误,即fixed in version 1.1.2。 project.ext.set 现在又可以工作了。 现在在 Gradle 插件的 1.3.0 版本中完全被破坏了。见code.google.com/p/android/issues/detail?id=182016。 @F***Frank 1.3.1 中发布的 android gradle 工具修复了这个问题【参考方案4】:

以下代码在 v1.3.1 上对我来说非常有用,并且仅适用于 APK:

android 
    defaultConfig 
        archivesBaseName = "AnotherName"

同样,这适用于 android 插件 1.3.1(不是 1.3.0),但我们仍然无法重命名我们的应用程序 (APK) 和库 (AAR)。一个大问题,因为我们有 20 多个项目设置,我们锁定了部署的二进制文件的来源,而不是在每个子项目 build.gradle 中重复代码。

以下对我们有用:

在根 build.gradle 中定义以下方法(和插件):

ext.snapshotSuffix = "<sha>-<count>-SNAPSHOT"
ext.nextVersion = "patch"
apply plugin: 'com.cinnober.gradle.semver-git'

def renameArtifact(variant) 
    variant.outputs.each  output ->
        def fullName = output.outputFile.name
        def projectName = fullName.substring(0, fullName.indexOf('-'))
        output.outputFile = new File(
                (String) output.outputFile.parent,
                (String) output.outputFile.name.replace(projectName, "drivecx-$projectName-$project.version"))
    

应用程序使用:

apply plugin: 'com.android.application'
android 
    ...
    // Rename all output artifacts to include version information
    applicationVariants.all  variant ->
        renameArtifact(variant)
    

供图书馆使用:

apply plugin: 'com.android.library'
android 
    ...
    // Rename all output artifacts to include version information
    libraryVariants.all  variant ->
        renameArtifact(variant)
    

现在您会得到一些非常棒的文件,它们具有通用前缀、项目名称、git-describe-wth-sha1-buildflavor 和扩展名。

旧示例:

androidauto-debug.apk

新示例:

drivecx-androidauto-0.2.1-d1436b7-193-SNAPSHOT-debug.apk

一个好处是它不会重命名未对齐的 apk。

【讨论】:

【参考方案5】:

您也可以重命名子项目(不重命名目录),方法是将以下内容放在根settings.gradle

rootProject.children.each 
    it.name = ('app' == it.name ? 'MyAppName' : it.name)

【讨论】:

这是真的,尽管它有一个不幸的副作用,即您的构建命令必须符合修改后的名称。在上面的示例中,您必须输入 './gradlew :MyAppName:build' 而不是 './gradlew :app:build'。

以上是关于Android Gradle 构建:重命名 apk的主要内容,如果未能解决你的问题,请参考以下文章

Android build.gradle 配置

Android gradle 相关配置

android--jenkins+gradle+android自动化构建apk步骤(转)

Android Gradle 构建生成的 apk 包含混淆和非混淆类

Gradle 在 Android Studio 和 AppCenter 中都找不到 Flutter 构建的 APK

如何找到跨文件重命名和重新排序添加特定 Gradle 构建依赖项的 Git 提交?