Android 如何使用gradle和proguard printmapping创建带有版本代码的out.map文件
我正在使用此文件构建release.apk文件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
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"
}