【问题标题】:How to use gradle and proguard printmapping to create out.map file with version code如何使用 gradle 和 proguard printmapping 创建带有版本代码的 out.map 文件
【发布时间】:2014-12-08 15:08:36
【问题描述】:

我正在使用这个文件来构建 release.apk 文件。

android {
   compileSdkVersion 21
   buildToolsVersion '20.0.0'
   signingConfigs {
      ...
   }
   buildTypes {
    debug {
        debuggable true
        jniDebugBuild true
    }
    release {
        runProguard true
        proguardFile('proguard-project.txt')
        debuggable false
        signingConfig signingConfigs.release
       }
   }
   defaultConfig {
       minSdkVersion 14
       targetSdkVersion 21
   }
   productFlavors {
   }
   lintOptions {
    disable 'ValidFragment'
   }

}

在 proguard-project.txt 我有这个:

-printmapping build\outputs\apk\out.map

一切都很好,我只想让 out.map 文件名包含版本代码,例如 out.29.map,其中 29 是版本代码。

谢谢

【问题讨论】:

  • 我认为您需要自定义构建任务,或者需要继续执行 Proguard 任务。关于人们想要用版本号重命名他们的输出 APK 的类似问题;你可以从其中一个婴儿床。
  • 酷,谢谢我试试

标签: android proguard android-gradle-plugin


【解决方案1】:

原来如此

首先定义一个函数来获取版本名称

def getVersionName() {
    File stringsXmlFile = new File("src\\main\\res\\values\\strings.xml")
    String contents = stringsXmlFile.getText()
    String version = contents.find("<string name=\"version\">[^<]*</string>");
    version = version.replace("<string name=\"version\">", "").replace("string>", "")
    version = version.replace("<", "")
    version = version.substring(0, version.length() - 1)

    return version
}

二、定义后任务功能

gradle.taskGraph.afterTask { Task task, TaskState state ->
    if (task.name.equals("assembleRelease")) {

        File proguard = new File("build\\outputs\\apk\\out.map")
        proguard.renameTo("build\\outputs\\apk\\out-" + getVersionName() + ".map")

    }
}

就是这样。

【讨论】:

  • 您应该提及您的代码的去向。我假设 build.gradle,但如果你提到它会更“用户友好”。
【解决方案2】:

这是一个轻量级插件,它检查映射文件的默认目录并将版本、版本代码和时间戳附加到文件中。如果您使用-printmapping 在 proguard 配置中明确地为 proguard 提供了另一条路径,则可以在 build.gradle 中指定该插件的路径:

apply plugin: 'com.android.application'
apply plugin: ProguardMapFileVersioning

proguardmapfileversioning.proguardPath = "app\\mapping.txt"

插件源码:

class ProguardMapFileVersioning implements Plugin<Object> {
    @Override
    public void apply(Object object) {
        try {
            Project project = null
            if (object != null)
                project = (Project) object

            if (project != null) {
                project.extensions.create("proguardmapfileversioning", ProguardMapFileVersioningExtension)
                project.task('ProguardMapFileVersioning') {
                    project.gradle.taskGraph.afterTask { Task task, TaskState taskState ->

                        AppExtension android = (AppExtension) project.extensions.findByName("android")
                        String versionName = android.defaultConfig.versionName
                        String versionCode = android.defaultConfig.versionCode

                        String taskName = 'assembleRelease'
                        if (task.name.startsWith('assemble') &&
                                task.name.endsWith('Release')) {
                            try {
                                String _default = "app\\build\\outputs\\apk\\mapping.txt"
                                String proguardPath = project.proguardmapfileversioning.proguardPath
                                if (proguardPath == null || proguardPath.isEmpty()) {
                                    proguardPath = _default
                                    println("Proguard mapping file path not specified, default to " + _default)
                                }
                                println("Proguard path: " + proguardPath)
                                File f = new File(proguardPath)
                                if (!f.exists()) {
                                    println("Mapping file: " + f.getAbsolutePath() + " does not exist, exiting..")
                                    return
                                } else {
                                    println("Found mapping file, continuing..")
                                }
                                String oldName = f.getName()

                                int index = oldName.lastIndexOf(".")
                                String nameWithoutExt
                                String ext
                                if (index > 0) {
                                    ext = oldName.substring(index)

                                    if (!ext == '.txt' && !ext == '.map') {
                                        println("Please provide a supported mapping file extension (.txt or .map) ... exiting.")
                                        return
                                    }

                                    nameWithoutExt = oldName.substring(0, index)
                                } else {
                                    println("Please provide mapping file extension.. exiting.")
                                    return
                                }
                                println("Extension type: " + ext)

                                String newName = nameWithoutExt + versionName +
                                        "(" + versionCode + ")" + "_" + getDate() + ext
                                f.renameTo(newName)

                                println("SUCCESS! Proguard mapping file has been renamed from " + oldName + " to " + newName)

                                if (proguardPath == _default)
                                    println("The new mapping file may have also been moved to inside the app/ directory")

                            } catch (ClassCastException e) {
                                e.printStackTrace()
                            }
                        }
                    }
                }
            } else {
                println("Object is null.")
            }
        } catch (ClassCastException e) {
            e.printStackTrace()
            println("Object != Project")
        }
    }

    def static getDate() {
        def d = new Date()
        def f = d.format('yyyy-MM-dd\'T\'HHmmss')
        return f
    }
}

class ProguardMapFileVersioningExtension {
    def String proguardPath = "app\\build\\outputs\\apk\\mapping.txt"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 2012-05-10
    • 2014-06-01
    • 2018-09-25
    • 2018-05-10
    • 2012-12-25
    • 2016-06-07
    相关资源
    最近更新 更多