2015-01-31 5 views
70
АПК

Всякий раз, когда я произвожу подписанную APK в Android Studio, по умолчанию это дает название как приложение-release.apk ...«приложение-release.apk», как изменить это значение по умолчанию генерируется имя

Может мы делаем любые настройки, чтобы он запрашивал и запрашивал имя, которое нужно назначить apk (как это делается в eclipse)

Что я делаю - переименуйте apk после его создания. Это не дает никаких ошибок, но есть ли какой-либо подлинный способ, чтобы я мог вносить какие-либо изменения в настройки, чтобы получить подсказку.

Примечание ::

при создании студии андроид АПК дает мне подсказку для выбора места (только) enter image description here

+0

1.Change сборка varient выпустить 2.select Build-> генерировать подписанную APK из строки меню. Таким образом, я создаю подписанный apk – Prabs

+0

. Все ответы здесь неправильные .. Эта проблема все равно будет возникать с использованием любого из них ... Проблема заключается в том, что студия кэширует имя артефакта apk и продолжает использовать кешированное имя вместо использования новый сгенерированный! – TacB0sS

ответ

69

Да, мы можем изменить это, но с большим количеством некоторого внимания

SeeThis

Теперь добавьте это в build.gradle в проекте в то время как убедитесь, что вы проверили сборки вариант вашего проекта, например release or Debug , поэтому я установил свой вариант сборки как release, но вы также можете выбрать 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) 
         ) 
        } 
       } 
      } 
     } 

Вы можете сделать это с другой подход Как это

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

Использование метода Set свойства в build.gradle и не забудьте синхронизировать Gradle перед запуском проекты Надеюсь, что это решит вашу проблему :)

Новый подход справиться с этим добавили в последнее обновление Google Теперь вы можете переименовать сборки в соответствии с привкусом или выход Variant //Below source is from developer android documentation Для получения более подробной информации следуйте по ссылке выше ДОКУМЕНТАЦИЯ
Используя Variant API для управления вариантными выходами нарушается новый плагин.Он по-прежнему работает для простых задач, таких как изменение названия APK во время сборки, как показано ниже:

// 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" 
    } 
} 
+0

сейчас имя файла - «app-20150131154034.apk» – Prabs

+0

поэтому используйте строку там, в которой «Abhishek Chaubey» instaed formattedDate –

+0

Можно ли как-то добавить 'versionName'? – zygimantus

48

Я изменил @Abhishek Chaubey ответ изменить название целого файла:

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 { 
    } 
} 

Это приводит к названию файла: MyAppName-release20150519121617.apk

+3

Как добавить переменную в Gradle – Mehdiway

+0

@Mehdiway рассмотрите град другой язык, вы можете увидеть дату, указанную в коде типа 'def formattedDate'. –

+1

Для того, чтобы добавить пользовательское свойство «APPNAME», добавить код, как это в корневой проекта: 'project.ext { APPNAME =«MyApplicatioName» } ' – miha

21

Я искал более сложный вариант переименования файлов apk, и я написал это решение, которое переименовывает apk со следующими данными:

  • аромат
  • тип сборки
  • версия
  • Дата

Вы бы получить APK так: myProject_dev_debug_1.3.6_131016_1047.apk.

You can find the whole answer here. Надеюсь, поможет!

В build.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.each { 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" 

      output.outputFile = new File(output.outputFile.parent, newApkName) 
     } 
    } 
} 
+1

большой. Только улучшение должно быть постоянным именем файла (без версии или даты) для некоторых вариантов или buildType (flavor == "dev" || buildType = "debug") –

2

Я написал более универсальное решение, основанное на @Fer ответ.

Он также должен работать с конфигурацией на основе аромата и типа на основе applicationId, versionName, versionCode.

В build.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) 
     } 
    } 
} 

Пример имя APK: com.example.app_freeDebug_1.0_1.apk

Для получения дополнительной информации о variant переменных смотрите определение ApkVariant и BaseVariant интерфейсов.

0

Я думаю, что это будет полезно.

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' 
    } 
} 
25

Вы можете получить сообщение об ошибке с последним андроидом Gradle плагиным (3.0):

Невозможно установить значение свойства только для чтения 'файл_вывод'

Согласно the migration guide, мы должны использовать следующий подход сейчас:

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

Примечания 2 главных здесь:

  1. all сейчас используется вместо each для повторения вариантов.
  2. outputFileName Свойство используется вместо изменения ссылки на файл.
+1

Теперь это правильный ответ октября 2017 года для Android Studio 3.0 Beta 7. Спасибо. – Krish

+1

полезно .. спасибо :) – Prabs

+0

В моем случае '$ {applicationName}' разрешено 'BuildType_Decorated {name = applicationName, debuggable = false, testCoverageEnabled = false, jniDebuggable = false, pseudoLocalesEnabled = false, renderscript ...' (shortnened для ясности). Это привело к сбою упаковки. Для меня '$ {applicationId}' или '$ {archivesBaseName}' были лучшими параметрами. Также '$ {defaultConfig.versionName}' для меня равно null. Итак, '$ {applicationId} _ $ {variant.name} - $ {variant.versionName}' это то, с чем я столкнулся. – pcdev

7

Здесь гораздо более короткий путь:

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

Это дает вам имя com.blahblah.example-v1 (1,0) -debug.apk (в режиме отладки)

Android-студия добавить versionNameSuffix по имени типа сборки по умолчанию, если вы хотите изменить это, выполнить следующие действия:

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

Выход в режиме отладки: com.blahblah.example-v1 (1,0) -MyNiceDebugModeNam e.apk

+0

Спасибо. Это самый быстрый вариант! – John

1

Сначала переименовать модуль из приложения к т.е. SurveyApp

Второй добавить это к вашему проекту верхнего уровня (корень проекта) Gradle. Он работает с 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" 
       } 
      } 
     } 
    } 
} 
0

Мое решение также может быть полезным для кого-то.

Протестировано и работает на IntelliJ 2017.3.2 с Gradle 4.4

Сценарий:

У меня 2 ароматизаторов в моем приложении, и поэтому я хотел каждый выпуск будет называться соответствующим образом в зависимости от каждого аромата.

Приведенный ниже код будет помещен в ваш модуль файл Gradle сборки найден в:

{app-root}/app/build.gradle

Gradle код, который будет добавлен в android{ } блока:

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 
     } 
    } 
} 

выше предоставляет следующие APK- найдено в {app-root}/app/:

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

Надеюсь, он может быть полезен кому-то.

Для получения дополнительной информации см других ответов, упомянутых в вопросе

Смежные вопросы