Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用gradle和proguard printmapping创建带有版本代码的out.map文件_Android_Proguard_Android Gradle Plugin - Fatal编程技术网

Android 如何使用gradle和proguard printmapping创建带有版本代码的out.map文件

Android 如何使用gradle和proguard printmapping创建带有版本代码的out.map文件,android,proguard,android-gradle-plugin,Android,Proguard,Android Gradle Plugin,我正在使用此文件构建release.apk文件 android { compileSdkVersion 21 buildToolsVersion '20.0.0' signingConfigs { ... } buildTypes { debug { debuggable true jniDebugBuild true } release { runProguard true

我正在使用此文件构建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是版本代码


谢谢

所以,就是这样做的

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

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
}

就是这样。

这里有一个轻量级插件,它检查映射文件应该位于的默认目录,并将版本、版本代码和时间戳附加到文件中。如果您已使用
-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"
}
class ProguardMapFileVersioning实现插件{
@凌驾
公共无效应用(对象){
试一试{
Project=null
if(对象!=null)
项目=(项目)对象
如果(项目!=null){
创建(“proguardmapfileversioning”,ProguardMapFileVersioningExtension)
任务('ProguardMapFileVersioning'){
project.gradle.taskGraph.posterTask{Task Task,TaskState TaskState->
AppExtension android=(AppExtension)project.extensions.findByName(“android”)
字符串versionName=android.defaultConfig.versionName
字符串versionCode=android.defaultConfig.versionCode
字符串taskName='AssemblereRelease'
if(task.name.startsWith('assembly'))&&
task.name.endsWith('Release')){
试一试{
字符串\u default=“app\\build\\outputs\\apk\\mapping.txt”
字符串proguardPath=project.proguardmapfileversioning.proguardPath
if(proguardPath==null | | proguardPath.isEmpty()){
proguardPath=\u默认值
println(“未指定Proguard映射文件路径,默认为”+\u默认值)
}
println(“前进路径:+前进路径”)
文件f=新文件(路径)
如果(!f.exists()){
println(“映射文件:“+f.getAbsolutePath()+”不存在,正在退出..”)
返回
}否则{
println(“找到映射文件,继续…”)
}
字符串oldName=f.getName()
int index=oldName.lastIndexOf(“.”)
字符串名称Withoutext
字符串扩展
如果(索引>0){
ext=oldName.substring(索引)
如果(!ext='.txt'&&&!ext='.map'){
println(“请提供支持的映射文件扩展名(.txt或.map)…正在退出。”)
返回
}
nameWithoutExt=oldName.substring(0,索引)
}否则{
println(“请提供映射文件扩展名..正在退出”)
返回
}
println(“扩展类型:“+ext”)
字符串newName=nameWithoutExt+versionName+
“(“+versionCode+”)”+““+getDate()+ext
f、 重命名(新名称)
println(“成功!Proguard映射文件已从“+oldName+”重命名为“+newName”)
如果(proguardPath==\u默认值)
println(“新映射文件可能也已移动到app/目录中”)
}catch(ClassCastException e){
e、 printStackTrace()
}
}
}
}
}否则{
println(“对象为空”)
}
}catch(ClassCastException e){
e、 printStackTrace()
println(“对象!=项目”)
}
}
def static getDate(){
def d=新日期()
def=d.format('yyyy-MM-dd'T'HHmmss')
返回f
}
}
类ProGuardMapFileVersionExtension{
def String proguardPath=“app\\build\\outputs\\apk\\mapping.txt”
}

我认为您需要自定义构建任务,或者需要附加到Proguard任务。也有类似的问题,人们希望用版本号重命名他们的输出APK;你可以从其中一个抄袭。酷,谢谢。我会尝试你应该提到你的代码去了哪里。我假设build.gradle,但如果您提到它,它会更“用户友好”。
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"
}