Ứng dụng phát hành ứng dụng.apk Hướng dẫn cách thay đổi tên apk được tạo mặc định này


155

Bất cứ khi nào tôi tạo apk có chữ ký trong Android Studio, theo mặc định, nó sẽ đặt tên là app-release.apk ...

Chúng tôi có thể thực hiện bất kỳ cài đặt nào để nó nhắc và hỏi tôi tên cần được gán cho apk không (cách thực hiện trong nhật thực)

Những gì tôi làm là - đổi tên apk sau khi nó được tạo. Điều này không đưa ra bất kỳ lỗi nào nhưng có cách nào chính hãng để tôi có thể thực hiện bất kỳ thay đổi nào trong cài đặt để nhận được lời nhắc.

Ghi chú::

Trong khi tạo apk android studio sẽ cho tôi một lời nhắc để chọn vị trí (chỉ)nhập mô tả hình ảnh ở đây


1.change build varient để phát hành 2.select build-> tạo apk đã ký từ thanh menu. Bằng cách này đang tạo ra apk ký
Prabs

Tất cả các câu trả lời ở đây đều không chính xác .. Vấn đề này vẫn sẽ xảy ra khi sử dụng bất kỳ câu hỏi nào ... Vấn đề là studio lưu trữ tên của apk artifact và tiếp tục sử dụng tên được lưu trong bộ nhớ cache thay vì sử dụng tên được tạo mới!
TacB0sS

Câu trả lời:


142

Vâng, chúng tôi có thể thay đổi điều đó nhưng với một số chú ý hơn

Xem này

Bây giờ hãy thêm cái này vào build.gradle trong dự án của bạn trong khi đảm bảo rằng bạn đã kiểm tra biến thể xây dựng của dự án của bạn như release or Debug vậy ở đây tôi đã đặt biến thể xây dựng của tôi như releasenhưng bạn cũng có thể chọn là Debug.

    buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                signingConfig getSigningConfig()
                applicationVariants.all { variant ->
                    variant.outputs.each { output ->
                        def date = new Date();
                        def formattedDate = date.format('yyyyMMddHHmmss')
                        output.outputFile = new File(output.outputFile.parent,
                                output.outputFile.name.replace("-release", "-" + formattedDate)
    //for Debug use output.outputFile = new File(output.outputFile.parent,
   //                             output.outputFile.name.replace("-debug", "-" + formattedDate)
                        )
                    }
                }
            }
        }

Bạn có thể làm điều đó với cách tiếp cận khác nhau như thế này

 defaultConfig {
        applicationId "com.myapp.status"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        setProperty("archivesBaseName", "COMU-$versionName")
    }

Sử dụng phương thức thuộc tính Set trong build.gradle và Đừng quên đồng bộ hóa lớp trước khi chạy các dự án Hy vọng nó sẽ giải quyết vấn đề của bạn :)

Cách tiếp cận Một New để xử lý này thêm thời gian gần đây bởi bản cập nhật google Bây giờ bạn có thể đổi tên của bạn xây dựng theo hương vị hoặc đầu ra Variant // Dưới đây là nguồn tài liệu từ nhà phát triển Android Để biết thêm thông tin chi tiết theo liên kết tài liệu trên
Sử dụng API Ngôn ngữ địa phương để thao tác kết quả đầu ra biến thể được chia với plugin mới. Nó vẫn hoạt động cho các tác vụ đơn giản, chẳng hạn như thay đổi tên APK trong thời gian xây dựng, như hiển thị bên dưới:

// If you use each() to iterate through the variant objects,
// you need to start using all(). That's because each() iterates
// through only the objects that already exist during configuration time—
// but those object don't exist at configuration time with the new model.
// However, all() adapts to the new model by picking up object as they are
// added during execution.
android.applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "${variant.name}-${variant.versionName}.apk"
    }
}

Đổi tên gói .aab Điều này được trả lời độc đáo bởi David Medenjak

tasks.whenTaskAdded { task ->
    if (task.name.startsWith("bundle")) {
        def renameTaskName = "rename${task.name.capitalize()}Aab"
        def flavor = task.name.substring("bundle".length()).uncapitalize()
        tasks.create(renameTaskName, Copy) {
            def path = "${buildDir}/outputs/bundle/${flavor}/"
            from(path)
            include "app.aab"
            destinationDir file("${buildDir}/outputs/renamedBundle/")
            rename "app.aab", "${flavor}.aab"
        }

        task.finalizedBy(renameTaskName)
    }
//@credit to David Medenjak for this block of code
}

Có cần mã ở trên không

Những gì tôi đã quan sát trong phiên bản mới nhất của studio android 3.3.1

Việc đổi tên gói .aab được thực hiện bởi mã trước đó không yêu cầu bất kỳ tác vụ nào đổi tên tất cả.

Hy vọng nó sẽ giúp các bạn. :)


vì vậy hãy sử dụng chuỗi ở đó giống như "Abhishek Chaubey" được định dạng theo định
dạngDate

Có thể thêm versionNamebằng cách nào đó?
zygimantus

@AbhishekChaubey Tôi không thể chạy mã thông qua Android Studio nữa sau khi thay đổi tên apk, có ý kiến ​​gì không? xin vui lòng giúp đỡ ... nó hiển thịThe APK file /Users/.../outputs/apk/NewName-debug-20161004172815.apk does not exist on disk.
Beeing Jk

@BeeingJk xây dựng lại dự án hoặc một lần đóng studio android và xóa thư mục đầu ra khỏi thư mục xây dựng và sau đó xây dựng lại dự án hoặc thử bằng cách làm sạch. Hy vọng nó có thể giúp bạn
Abhishek Chaubey

4
Kể từ đầu ra Android Studio 3.0.outputFile chỉ được đọc. Câu trả lời của @ johnny-doe là giải pháp mới.
krishh

79

Bạn có thể gặp lỗi với plugin gradle Android mới nhất ( 3.0 ):

Không thể đặt giá trị của thuộc tính chỉ đọc 'outputFile'

Theo hướng dẫn di chuyển , chúng ta nên sử dụng phương pháp sau đây ngay bây giờ:

applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "${applicationName}_${variant.buildType.name}_${defaultConfig.versionName}.apk"
    }
}

Lưu ý 2 thay đổi chính ở đây:

  1. all được sử dụng ngay bây giờ thay vì each lặp đi lặp lại trên các đầu ra biến thể.
  2. outputFileName thuộc tính được sử dụng thay vì đột biến một tham chiếu tệp.

1
Bây giờ đây là câu trả lời chính xác của tháng 10 năm 2017 cho Android Studio 3.0 Beta 7. Cảm ơn.
krishh

3
Trong trường hợp của tôi ${applicationName}giải quyết BuildType_Decorated{name=applicationName, debuggable=false, testCoverageEnabled=false, jniDebuggable=false, pseudoLocalesEnabled=false, renderscript...(rút ngắn cho rõ ràng). Điều này gây ra bao bì thất bại. Đối với tôi ${applicationId}hoặc ${archivesBaseName}là lựa chọn tốt hơn. Ngoài ra ${defaultConfig.versionName}đối với tôi là null. Vì vậy, ${applicationId}_${variant.name}-${variant.versionName}những gì tôi đã kết thúc với.
pcdev

1
@KGCybeX Thông thường mã này được sử dụng trong android{}phần có cùng cấp độ với defaultConfig{}. Mặc dù, bạn có thể sử dụng nó bên ngoài android{}bằng cách sử dụng android.applicationVariants.all { }cú pháp
Johnny Doe

1
Bạn là một phao cứu sinh;)
Rik van Velzen

1
Làm việc trong
Lớp

53

Tôi đã sửa đổi câu trả lời @Abhishek Chaubey để thay đổi toàn bộ tên tệp:

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                project.ext { appName = 'MyAppName' }
                def formattedDate = new Date().format('yyyyMMddHHmmss')
                def newName = output.outputFile.name
                newName = newName.replace("app-", "$project.ext.appName-") //"MyAppName" -> I set my app variables in the root project
                newName = newName.replace("-release", "-release" + formattedDate)
                //noinspection GroovyAssignabilityCheck
                output.outputFile = new File(output.outputFile.parent, newName)
            }
        }
    }
    debug {
    }
}

Điều này tạo ra một tên tệp như: MyAppName-release20150519121617.apk


3
Làm thế nào để bạn thêm một biến trong Gradle
Mehdiway

1
Để thêm thuộc tính 'appName' tùy chỉnh, hãy thêm mã như thế này vào dự án gốc của bạn: project.ext { appName = 'MyApplicatioName' }
miha

2
@ ranma2913 Tôi không thể chạy mã qua Android Studio nữa sau khi thay đổi tên apk, có ý kiến ​​gì không? vui lòng giúp đỡ ... nó hiển thị tệp APK /Users/.../outputs/apk/NewName-debug-20161004172815.apk không tồn tại trên đĩa.
Nuôi ong Jk

1
Thay vì cài đặt thủ công MyAppName, rootProject.namesẽ cung cấp cho bạn tên dự án như trong nhật thực.
Hiren Dabhi

3
Kể từ Android Studio 3.0 chỉ output.outputFileđược đọc. Câu trả lời của @ johnny-doe là giải pháp mới.
krishh

50

(EDITED hoạt động với Android Studio 3.0 và Gradle 4)

Tôi đang tìm kiếm một tùy chọn đổi tên apk apk phức tạp hơn và tôi đã viết giải pháp này đổi tên apk với dữ liệu sau:

  • hương vị
  • kiểu xây dựng
  • phiên bản
  • ngày

Bạn sẽ nhận được một apk như thế này: myProject_dev_debug_1.3.6_131016_1047.apk .

Bạn có thể tìm thấy toàn bộ câu trả lời ở đây . Hy vọng nó giúp!

Trong bản dựng.gradle:

android {

    ...

    buildTypes {
        release {
            minifyEnabled true
            ...
        }
        debug {
            minifyEnabled false
        }
    }

    productFlavors {
        prod {
            applicationId "com.feraguiba.myproject"
            versionCode 3
            versionName "1.2.0"
        }
        dev {
            applicationId "com.feraguiba.myproject.dev"
            versionCode 15
            versionName "1.3.6"
        }
    }

    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def project = "myProject"
            def SEP = "_"
            def flavor = variant.productFlavors[0].name
            def buildType = variant.variantData.variantConfiguration.buildType.name
            def version = variant.versionName
            def date = new Date();
            def formattedDate = date.format('ddMMyy_HHmm')

            def newApkName = project + SEP + flavor + SEP + buildType + SEP + version + SEP + formattedDate + ".apk"

            outputFileName = new File(newApkName)
        }
    }
}

2
tuyệt quá. Chỉ cải thiện được thực hiện là một tên tệp không đổi (không có phiên bản hoặc ngày) cho một số hương vị hoặc buildType (hương vị == "dev" | | buildType = "gỡ lỗi")
Tony BenBrahim

"tất cả" thay vì "mỗi" có vẻ quan trọng ở đây.
Xan-Kun Clark-Davis

Đưa ra lỗi > groovy.lang.MissingPropertyException: No such property: variantConfiguration for class: com.android.build.gradle.internal.variant.ApplicationVariantData. Tại sao không đơn giản là thay đổi thành buildType = variant.buildType.name?
soshial

nó nói"file.apk" is not writeable
Hosein Haqiqian

38

Đây là một cách ngắn hơn nhiều:

defaultConfig {
    ...
    applicationId "com.blahblah.example"
    versionCode 1
    versionName "1.0"
    setProperty("archivesBaseName", applicationId + "-v" + versionCode + "(" + versionName + ")")
    //or so
    archivesBaseName = "$applicationId-v$versionCode($versionName)"
}

Nó cung cấp cho bạn tên com.blahblah.example-v1 (1.0) -debug.apk (trong chế độ gỡ lỗi)

Android Studio thêm versionNameSuffix theo tên loại xây dựng theo mặc định, nếu bạn muốn ghi đè lên điều này, hãy làm tiếp theo:

buildTypes {
    debug {
        ...
        versionNameSuffix "-MyNiceDebugModeName"
    }
    release {
        ...
    }
}

Đầu ra trong chế độ gỡ lỗi: com.blahblah.example-v1 (1.0) -MyNiceDebugModeName.apk


3
Cảm ơn. Đây là lựa chọn nhanh nhất!
Giăng

1
Lưu ý bên bạn có thể thêm archiveBaseName vào tệp gradle.properIES cục bộ của bạn.
Ge3ng

Nó thực sự có vẻ rõ ràng hơn. Tại sao đây không phải là giải pháp ưa thích?
Xan-Kun Clark-Davis

6

Tôi đã viết giải pháp phổ quát hơn dựa trên câu trả lời @Fer.

Nó cũng sẽ làm việc với hương vị và xây dựng kiểu cấu hình dựa trên applicationId, versionName, versionCode.

Trong bản dựng.gradle:

android {
    ...
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def appId = variant.applicationId
            def versionName = variant.versionName
            def versionCode = variant.versionCode
            def flavorName = variant.flavorName // e. g. free
            def buildType = variant.buildType // e. g. debug
            def variantName = variant.name // e. g. freeDebug

            def apkName = appId + '_' + variantName + '_' + versionName + '_' + versionCode + '.apk';
            output.outputFile = new File(output.outputFile.parentFile, apkName)
        }
    }
}

Tên apk ví dụ: com.example.app_freeDebug_1.0_1.apk

Để biết thêm thông tin về variantbiến thấy ApkVariantBaseVariant định nghĩa giao diện.


4

thêm android.applicationVariants.allkhối như bên dưới trong cấp độ ứng dụng của bạn

buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            lintOptions {
                disable 'MissingTranslation'
            }
            signingConfig signingConfigs.release
            android.applicationVariants.all { variant ->
                variant.outputs.all {
                    outputFileName = "${applicationId}_${versionCode}_${variant.flavorName}_${variant.buildType.name}.apk"
                }
            }
        }
        debug {
            applicationIdSuffix '.debug'
            versionNameSuffix '_debug'
        }
    }

có sẵn tại 2019/03/25



2

Đầu tiên đổi tên mô-đun của bạn từ ứng dụng thành tức là SurveyApp

Thứ hai thêm điều này vào lớp cấp cao nhất của dự án (dự án gốc). Nó hoạt động với Gradle 3.0

//rename apk for all sub projects
subprojects {
    afterEvaluate { project ->
        if (project.hasProperty("android")) {
            android.applicationVariants.all { variant ->
                variant.outputs.all {
                    outputFileName = "${project.name}-${variant.name}-${variant.versionName}.apk"
                }
            }
        }
    }
}

2

Thêm mã sau vào build.gradle (Module: ứng dụng)

android {
    ......
    ......
    ......
    buildTypes {
        release {
            ......
            ......
            ......
            /*The is the code fot the template of release name*/
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def formattedDate = new Date().format('yyyy-MM-dd HH-mm')
                    def newName = "Your App Name " + formattedDate
                    output.outputFile = new File(output.outputFile.parent, newName)
                }
            }
        }
    }
}

Và tên bản dựng phát hành sẽ là Tên ứng dụng của bạn 2018-03-31 12-34


1

Giải pháp của tôi cũng có thể giúp đỡ cho ai đó.

Đã thử nghiệm và hoạt động trên IntelliJ 2017.3.2 với Lớp 4.4

Kịch bản:

Tôi có 2 hương vị trong ứng dụng của mình, và vì vậy tôi muốn mỗi bản phát hành được đặt tên phù hợp theo từng hương vị.

Mã dưới đây sẽ được đặt vào tệp xây dựng lớp mô-đun của bạn được tìm thấy trong:

{app-root}/app/build.gradle

Mã lớp được thêm vào android{ }khối:

android {
    // ...

    defaultConfig {
        versionCode 10
        versionName "1.2.3_build5"
    }

    buildTypes {
        // ...

        release {
            // ...

            applicationVariants.all { 
                variant.outputs.each { output ->
                    output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace(output.outputFile.name, variant.flavorName + "-" + defaultConfig.versionName + "_v" + defaultConfig.versionCode + ".apk"))
                }
            }

        }
    }

    productFlavors {
        myspicyflavor {
            applicationIdSuffix ".MySpicyFlavor"
            signingConfig signingConfigs.debug
        }

        mystandardflavor {
            applicationIdSuffix ".MyStandardFlavor"
            signingConfig signingConfigs.config
        }
    }
}

Ở trên cung cấp các APK sau được tìm thấy trong {app-root}/app/:

myspicyflavor-release-1.2.3_build5_v10.apk
mystandardflavor-release-1.2.3_build5_v10.apk

Hy vọng nó có thể được sử dụng cho một ai đó.

Để biết thêm thông tin, hãy xem các câu trả lời khác được đề cập trong câu hỏi


0

Tôi nghĩ rằng điều này sẽ hữu ích.

buildTypes {
    release {
        shrinkResources true
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                project.ext { appName = 'MyAppName' }
                def formattedDate = new Date().format('yyyyMMddHHmmss')
                def newName = output.outputFile.name
                newName = newName.replace("app-", "$project.ext.appName-")
                newName = newName.replace("-release", "-release" + formattedDate)
                output.outputFile = new File(output.outputFile.parent, newName)
            }
        }
    }
}
productFlavors {
    flavor1 {
    }
    flavor2 {
        proguardFile 'flavor2-rules.pro'
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.