2013-08-29 3 views
5

У меня есть приложение с разными вкусами - каждый вкус имеет два типа buildty.Переименование apk с градиентом -> получение того же apk дважды

После переименования некоторых строк в моем манифесте я также переименую apk. Все отлично работает - мне просто интересно, почему я получаю те же самые апки дважды? После того, как не был переименован и однажды переименован ...

Краткий пример того же приложения с разными названиями:

  • "MYAPP аромат 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); 
} 

Просто хочу знать, что происходит, и если одна и та же задача возможна без получения двух апков.

ответ

11

Всегда будет два файла APK для варианта с параметром zipAlign, установленным в true. Сначала 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); 
+0

Спасибо! В моем сообщении выше я не делал различия между 'buildVariant.packageApplication.outputFile' и' buildVariant.outputFile'. Поэтому я получаю странное поведение: некоторые файлы были переименованы, а некоторые нет. Теперь каждый apk переименован, как я хочу. Еще раз спасибо за ваше объяснение :) – owe

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); 
    }  
} 
2

Для всех, кто ищет для переименования файла андроида библиотеки (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())) 
     } 
    } 
} 

Позвольте мне знать, если вы придумали лучший способ сделать это.

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) 
        } 
       } 
      } 
     } 
    } 
Смежные вопросы