自动备份android的mapping.txt文件
为什么要这样做:
由于集成了腾讯的bugly,但是出现异常上报时因为需要上传mapping.txt对应表才能找到异常出错的位置,为了能够根据版本统一管理并自动操作mapping.txt文件,需要在build.gradle文件写一下脚本
每次混淆打包后复制mapping.txt到指定的项目目录统一管理
前提准备:
- 在proguard-rules.pro文件中需要加入
#混淆前后的映射
-printmapping mapping.txt
# 将.class信息中的类名重新定义为"Proguard"字符串
-renamesourcefileattribute Proguard
# 并保留源文件名为"Proguard"字符串,而非原始的类名 并保留行号
-keepattributes SourceFile,LineNumberTable
开始:
- 以下以我在build.gradle的flavorATest(测试环境)和flavorBProduct(正式环境)为例
//exapmle
flavorDimensions "testflavor"
publishNonDefault true
productFlavors {
//测试环境
flavorATest {
dimension "testflavor"
}
//正式环境
flavorBProduct {
dimension "testflavor"
}
}
- 在build.gradle中加入
tasks.whenTaskAdded {
task ->
android.productFlavors.all {
//我只需要assembleFlavorBProductRelease这个task(正式环境打包发布的情况下)才保存mapping.txt
//规则可以自己定义,我这边定义的比较宽泛
if (task.name.startsWith("assemble")
&& task.name.endsWith("Release")
) {
task.doLast {
println "\n\n=====复制mapping.txt文件出来======"
copyMapping(task.name
.replace("assemble", "")
.replace("Release", "")
)
}
}
}
}
- 复制函数+根据版本号等规则重命名文件
def copyMapping(String name) {
copy {
//此处是个人喜好,把assembleFlavorBProductRelease先去掉assemble和Release,否则感觉文件名太长
//然后把FlavorBProduct然后的F改成小写
String firstChar = "";
try {
firstChar = name.getAt(0);
} catch (Exception e) {
e.printStackTrace()
return
}
name = name.replace(firstChar, firstChar.toLowerCase())
//======================================================
String renameName = "mapping_save_" + name + "_" + rootProject.ext.VERSION_CODE + "_" + rootProject.ext.VERSION_NAME + ".txt"
println "\n=====文件名:" + renameName + "======\n"
from "$buildDir" + '/outputs/mapping/' + name + '/release/'
include "mapping.txt"
into "mapping/"
rename {
renameName
}
}
}
结束:
- 最终生成样例
admin-test:myAndroidProject yfjin$ tree
.
└── app
└── mapping
├── mapping_save_flavorBProduct_145_1.0.7.3.txt
└── mapping_save_flavorBProduct_146_1.0.7.4.txt