{gradlew`如何建立pf APK的获取路径和名称?

时间:2018-08-19 09:55:57

标签: android android-studio gradle android-gradle

假设我使用gradlew为使用以下任一Android Studio模板创建的标准Android项目构建了调试和测试APK:

./gradlew assembleDebug assembleAndroidTest

这将在以下位置创建文件:

  • app/build/outputs/apk/debug/app-debug.apk
  • app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk

gradlew是否以某种方式公开了这两个路径和文件名?


Android Studio docs应该描述路径的构造方式:

  

要启动调试版本,请调用assembleDebug任务:    gradlew assembleDebug   这样会在module_name-debug.apk

中创建一个名为project_name/module_name/build/outputs/apk/的APK。

但这显然与我的任何文件都不匹配,尤其是与第二个文件都不匹配。

1 个答案:

答案 0 :(得分:1)

./gradlew只是一个包装,但是在build.gradle中,人们可以访问它们:

// root project build.gradle
project.ext.set('archiveBuildTypes', ['release', 'debug'])

// module-level build.gradle
android {
    getRootProject().each {
        applicationVariants.all { variant ->
            variant.outputs.all { output ->
                if (variant.getBuildType().getName() in rootProject.archiveBuildTypes) {
                    def buildType = variant.getBuildType().getName()
                    if (variant.versionName != null) {

                        // baseName is the base filename
                        def baseName = output.baseName

                        // perform some string-manipulation here, if required

                        // outputFileName is the file-name being actually used:
                        String fileName = "someapp_${variant.versionName}-${baseName}.apk"
                        outputFileName = new File(output.outputFile.parent, fileName).getName()

                        println(outputFileName)
                    }
                }
            }
        }
    }
}

如果需要使用./gradlew获取值,则可以将其包装到自定义的Gradle任务中,然后将其名称作为命令行参数传递。似乎outputFileName没有在该范围内定义,但在该范围内是已知的。