5

我有一个不同风格的应用程序 - 每种风格都有两个 buildTypes。

重命名清单中的某些行后,我还重命名了 apk。一切正常 - 我只是想知道为什么我两次获得相同的 apk?一次没改名一次改名...

具有不同名称的同一应用程序的简短示例:

  • “myApp-flavor-buildType.apk”(未重命名)
  • “myApp-appName-buildType-version.apk”(重命名为 apk)

这是我的 build.gradle 文件的代码:

// *** OVERRIDE data in MANIFEST ***
android.applicationVariants.each { variant ->
    variant.processManifest.doLast {
        overrideDataInManifest(variant)
    }
}

def overrideMapsKey(buildVariant){
    def appName = getAppName(buildVariant)

    // override line ... this is not necessary to this question

    renameAPK(buildVariant, appName)
}

// *** RENAME APK ***
def renameAPK(buildVariant, appName){
    def apk = buildVariant.packageApplication.outputFile;
    def newName = "";

    // get data for apk renaming
    def versionName = android.defaultConfig.versionName 
    def versionNameSuffix = buildVariant.buildType.versionNameSuffix
    if(versionNameSuffix.toString().equals("null"))
        versionNameSuffix = ""
    def buildTypeOfApp= buildVariant.buildType.name 

    if (buildVariant.zipAlign) {
        newName = "etscanner-" + appName + "-" + buildTypeOfApp.toUpperCase() + "-v" + versionName + versionNameSuffix + ".apk"
    }else{
        newName = "etscanner-" + appName + "-" + buildTypeOfApp.toUpperCase() + "-v" + versionName + versionNameSuffix + "-ALIGNED" + ".apk"
    }
    buildVariant.packageApplication.outputFile = new File(apk.parentFile, newName);
}

只想知道发生了什么,以及是否可以在不获取两个 apk 的情况下执行相同的任务。

4

4 回答 4

11

对于 zipAlign 选项设置为 true 的变体,总会有两个 APK 文件。首先 gradle 构建原始 APK 文件,然后对其进行 zipalign 并生成优化版本而不删除原始版本。

buildVariant.packageApplication.outputFile 是构建过程的中间产品,据我观察,它始终是未对齐的 APK 文件。

buildVariant.outputFile 是应用 zipAlign 选项的最终输出。

另一方面,您可能想要更正 build.gradile 文件,它实际上将 APK 文件的未对齐版本重命名为“ALIGNED”版本,并保持 zipalign APK 文件不变。这是我的修改版本:

if (buildVariant.zipAlign) {
    newName = "etscanner-" + appName + "-" + buildTypeOfApp.toUpperCase() + "-v" + versionName + versionNameSuffix + "-ALIGNED.apk"
    buildVariant.outputFile = new File(apk.parentFile, newName);
}

newName = "etscanner-" + appName + "-" + buildTypeOfApp.toUpperCase() + "-v" + versionName + versionNameSuffix + "-UNALIGNED" + ".apk"
buildVariant.packageApplication.outputFile = new File(apk.parentFile, newName);
于 2013-09-02T15:43:08.043 回答
2

对于任何搜索重命名 android 库文件 (aar) 的人,这是我为 gradle 2.+ 版本提出的建议:

android.libraryVariants.all { variant ->
    if (variant.buildType.name == 'release') {
        def oldFile = variant.outputs.get(0).getOutputFile()
        if (oldFile.name.contains("release")) {
            def newPath = oldFile.name.replace("release.aar", version.toString() + ".aar")
            variant.outputs.get(0).
                    setOutputFile(new File(oldFile.parentFile.toString(), newPath.toString()))
        }
    }
}

如果您想出更好的方法,请告诉我。

于 2014-10-30T20:34:33.690 回答
1
 buildTypes {
        release {
            debuggable false
            jniDebuggable false
            signingConfig signingConfigs.config
            minifyEnabled false
            zipAlignEnabled true

            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if ((variant.buildType.name == 'release') && outputFile != null && outputFile.name.endsWith('.apk')) {
                        def fileName = "myFileName_release_" + defaultConfig.versionName + ".apk"
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
                }
            }


        }
        debug {
            debuggable true
            jniDebuggable false
            renderscriptDebuggable false
            minifyEnabled false
            zipAlignEnabled true
            signingConfig signingConfigs.config

            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if ((variant.buildType.name == 'debug') && outputFile != null && outputFile.name.endsWith('.apk')) {
                        def fileName = "myFileName_debug_" + defaultConfig.versionName + ".apk"
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
                }
            }
        }
    }
于 2015-07-14T20:32:10.853 回答
0

如果您使用的是 Android Gradle Plugin 0.13 或更高版本,界面会发生一些变化:

android.applicationVariants.all { variant ->

    def name
    variant.outputs.each { output ->

        def apkDirectory = variant.packageApplication.outputFile.parentFile

        if (output.zipAlign) {
            name = "yourAppName.apk"
            output.outputFile = new File(apkDirectory, name);
        }

        name = "yourAppName-UNALIGNED.apk"
        variant.packageApplication.outputFile = new File(apkDirectory, name);
    }    
}
于 2014-10-02T13:27:56.743 回答