Grz*_*orz 41 android gradle apk android-gradle-plugin
我有一个Android项目,它使用Gradle进行构建过程.现在我想添加两个额外的构建类型登台和生产,所以我的build.gradle包含:
android {
    buildTypes {
        release {
            runProguard false
            proguardFile getDefaultProguardFile('proguard-android.txt')
        }
        staging {
            signingConfig signingConfigs.staging
            applicationVariants.all { variant ->
                appendVersionNameVersionCode(variant, defaultConfig)
            }
        }
        production {
            signingConfig signingConfigs.production
        }
    }
}
和我的appndVersionNameVersionCode看起来像:
def appendVersionNameVersionCode(variant, defaultConfig) {
    if(variant.zipAlign) {
        def file = variant.outputFile
        def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
        variant.outputFile = new File(file.parent, fileName)
    }
    def file = variant.packageApplication.outputFile
    def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
    variant.packageApplication.outputFile = new File(file.parent, fileName)
}
如果我执行任务assembleStaging然后我得到我的apk的正确名称,但当我执行assembleProduction然后我得到我的apk的更改名称(如在临时案例中).例如:
MyApp-defaultFlavor-production-9.9.9-999.apk
MyApp-defaultFlavor-production-9.9.9-999.apk
看起来在生产构建类型中执行appendVersionNameVersionCode.我怎么能避免呢?
Les*_*zek 37
正如CommonsWare在他的评论中写道的那样,你应该appendVersionNameVersionCode只为暂存变种打电话.您可以轻松地执行此操作,只需稍微修改您的appendVersionNameVersionCode方法,例如:
def appendVersionNameVersionCode(variant, defaultConfig) {
    //check if staging variant
    if(variant.name == android.buildTypes.staging.name){
        if(variant.zipAlign) {
            def file = variant.outputFile
            def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
            variant.outputFile = new File(file.parent, fileName)
        }
    def file = variant.packageApplication.outputFile
    def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
    variant.packageApplication.outputFile = new File(file.parent, fileName)
    }
}
Pio*_*zki 20
由于删除了已弃用的APIS,Lecho的解决方案不适用于Android Gradle Plugin 0.14.3+:http://tools.android.com/tech-docs/new-build-system
差不多1.0:删除了已弃用的属性/方法
...
- Variant.packageApplication/zipAlign/createZipAlignTask/outputFile/processResources/processManifest(使用变量输出)
以下适用于我:
def appendVersionNameVersionCode(variant, defaultConfig) {
    variant.outputs.each { output ->
        if (output.zipAlign) {
            def file = output.outputFile
            def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
            output.outputFile = new File(file.parent, fileName)
        }
        def file = output.packageApplication.outputFile
        def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
        output.packageApplication.outputFile = new File(file.parent, fileName)
    }
}
如果您使用 Kotlin DSL,则可以通过以下方式更改 APK 名称:
    applicationVariants.all {
        outputs.all {
            this as com.android.build.gradle.internal.api.ApkVariantOutputImpl
            val buildName = buildType.name
            val timestamp = SimpleDateFormat("yyyyMMdd").format(Date())
            val apkName = timestamp + "_AppName_" + defaultConfig.versionName + "." + defaultConfig.versionCode + "_" + buildName + ".apk"
            outputFileName = apkName
        }
    }
如果您不想使用时间戳,请将其删除。否则,不要忘记文件顶部的这些行来导入 java 类:
import java.util.Date
import java.text.SimpleDateFormat
您还可以比较构建名称,以便为不同构建指定配置,如下所示:
name == "debug"
/* or */
name.contains("release")
| 归档时间: | 
 | 
| 查看次数: | 35810 次 | 
| 最近记录: |