Android studio 使用gradle时如何定义apk输出目录?

Android studio 使用gradle时如何定义apk输出目录?,android-studio,android-gradle-plugin,Android Studio,Android Gradle Plugin,使用gradle时如何定义apk输出目录 我希望能够在每次构建后将apk上传到共享文件夹。这对我来说很有用: android.applicationVariants.all { variant -> def outputName = // filename variant.outputFile = file(path_to_filename) } 或Gradle 2.2.1+ android { applicationVariants.all { variant

使用gradle时如何定义apk输出目录

我希望能够在每次构建后将apk上传到共享文件夹。

这对我来说很有用:

android.applicationVariants.all { variant ->
    def outputName = // filename
    variant.outputFile = file(path_to_filename)
}
或Gradle 2.2.1+

android {
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            output.outputFile = new File(path_to_filename, output.outputFile.name)
        }
    }
}
但是“清理”任务不会删除该apk,所以您应该按如下方式扩展清理任务:

task cleanExtra(type: Delete) {
    delete outputPathName
}

clean.dependsOn(cleanExtra)
全样本:

apply plugin: 'android'

def outputPathName = "D:\\some.apk"

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.3"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }

    applicationVariants.all { variant ->
        variant.outputFile = file(outputPathName)
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:19.+'
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

task cleanExtra(type: Delete) {
    delete outputPathName
}

clean.dependsOn(cleanExtra)

我找到了使用最新Gradle插件的解决方案:

def archiveBuildTypes = ["release", "debug"];

applicationVariants.all { variant ->
    variant.outputs.each { output ->
        if (variant.buildType.name in archiveBuildTypes) {
            // Update output filename
            if (variant.versionName != null) {
                String name = "MY_APP-${variant.versionName}-${output.baseName}.apk"
                output.outputFile = new File(output.outputFile.parent, name)
            }
            // Move output into DIST_DIRECTORY
            def taskSuffix = variant.name.capitalize()
            def assembleTaskName = "assemble${taskSuffix}"
            if (tasks.findByName(assembleTaskName)) {
                def copyAPKTask = tasks.create(name: "archive${taskSuffix}", type: org.gradle.api.tasks.Copy) {
                    description "Archive/copy APK and mappings.txt to a versioned folder."
                    print "Copying APK&mappings.txt from: ${buildDir}\n"
                    from("${buildDir}") {
                        include "**/mapping/${variant.buildType.name}/mapping.txt"
                        include "**/apk/${output.outputFile.name}"
                    }
                    into DIST_DIRECTORY
                    eachFile { file ->
                        file.path = file.name // so we have a "flat" copy
                    }
                    includeEmptyDirs = false
                }
                tasks[assembleTaskName].finalizedBy = [copyAPKTask]
            }
        }
    }
}

对于Gradle版本2.2.1+,您可以执行以下操作:

def outputPathName = "app/app-release.apk"
applicationVariants.all { variant ->
        variant.outputs.each { output ->
            output.outputFile = new File(outputPathName)
        }
    }

此解决方案适用于
classpath'com.android.tools.build:gradle:3.1.2'
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
。将以下代码放入应用程序级别的android范围
build.gradle
文件中。使用命令
/gradlew assembleedbug
/gradlew assembleerelease
时,输出文件夹将复制到
distFolder

// Change all of these based on your requirements
def archiveBuildTypes = ["release", "debug"];
def distFolder = "/Users/me/Shared Folder(Personal)/MyApplication/apk/"
def appName = "MyApplication"

applicationVariants.all { variant ->
    variant.outputs.all { output ->
        if (variant.buildType.name in archiveBuildTypes) {
            // Update output filename
            if (variant.versionName != null) {
                String name = "$appName-${variant.versionName}-${output.baseName}.apk"
                outputFileName = new File(name)
            }
            def taskSuffix = variant.name.capitalize()
            def assembleTaskName = "assemble${taskSuffix}"
            if (tasks.findByName(assembleTaskName)) {
                def copyAPKFolderTask = tasks.create(name: "archive${taskSuffix}", type: org.gradle.api.tasks.Copy) {
                    description "Archive/copy APK folder to a shared folder."
                    def sourceFolder = "$buildDir/outputs/apk/${output.baseName.replace("-", "/")}"
                    def destinationFolder = "$distFolder${output.baseName.replace("-", "/")}"
                    print "Copying APK folder from: $sourceFolder into $destinationFolder\n"
                    from(sourceFolder)
                    into destinationFolder
                    eachFile { file ->
                        file.path = file.name // so we have a "flat" copy
                    }
                    includeEmptyDirs = false
                }
                tasks[assembleTaskName].finalizedBy = [copyAPKFolderTask]
            }
        }
    }
}

这不适用于Gradle 2.2.1+版本:>没有这样的属性:outputFile for class:com.android.build.Gradle.internal.api.ApplicationVariatimpl\u decoredThis不适用于Gradle 4.1:无法使用Gradle 4.1:-1设置只读属性“outputFile”的值。而不是“variant.outputs.each”使用“variant.outputs.all”和2。使用“variant.outputFile”代替“variant.outputFileName”不能用outputFileName设置目录,可以吗?不能用outputFileName设置特定的目录/文件夹,但可以使用其中的相对路径(.e.g.\..\\\\\\\\${buildType}\\\${variant.flavorName}.apk”这对Gradle 4.1不起作用:无法设置只读属性“outputFile”的值。Gradle 4.1现在将APK保存在以变量命名的子文件夹中。支持哪个版本?最新的Gradle 4.1报告未知属性“archivedBuildTypes”。接下来是只读属性“outputFile”我的Gradle生成失败,错误为:
无法执行t类型为com.android.build.gradle.internal.api.apkvariantutputimpl
@3c71的apkvariantutputimpl{apkData=Main{type=Main,fullName=oneOfMyVariantDebug,filters=[]}的只读属性'outputFile'的值。我想您在那里有打字错误。不是archivedBuildTypes,而是archiveBuildTypes