背景
团队达到一定规模时,需要更加完善crash堆栈信息来进行自动分配和快速定位问题。所以做了堆栈超级解析功能
方案实现流程
该方案的优点,除去打通 gitlab 流程以外,完全可以做到本地化,拿到mapping.txt和developer.txt后可以按照本地反混淆的流程 按行获取到组件信息(组件负责人),类最后修改人信息
组件发布时写入组件&developer信息
-
需要写入的信息
-
组件信息,组件的group,name,version,owner(这些信息一般获取extension中组件配置的信息即可)
-
git地址以及最后的commit信息。
- git地址可以通过git remote get-url origin命令获取。
- 最后的commit信息可以通过git rev-parse HEAD命令获取
-
找到组件下Java和kotlin目录(支持c++,资源文件),遍历写入文件名,最后commit,最后修改人
- 通过git ls-tree -r --name-only HEAD src/main/java/ 和 git ls-tree -r --name-only HEAD src/main/kotlin/ 分别去获取java和kotlin文件夹下的文件名
- 获取到文件路径后通过git log -1 --format="%h %an %ae" -- {filepath} 获取到
-
文件最后commit,最后commit作者以及作者邮箱。
- 这边如果是一个线程去做遍历,发布速度会被拖慢,所以这里可以用多线程去优化
- 逻辑集成在发布插件中,将产物打包到aar中同时发布到maven。
5. 本地性能测试,平均一个类5ms左右。这部分对发布速度影响也是可接受的。
APK打包merge信息
通过apply plugin实现。
这里我们要实现两个功能
- 获取我们自己所开发的组件信息,蒋aar中有developer.txt文件的我们要把里面的信息取出合并到一个文件中。
- 获取第三方sdk组件信息,aar中没有developer.txt文件的我们通过组件平台获取组件信息然后写入。
具体实现步骤
- 找到APP所依赖的所有的aar文件解压后路径
- 找到app所有依赖组件信息 ,有两种方案
- 通过组件管理平台获取,优点是速度快,缺点是组件不全。
- 先找到configuration.getResolvedConfiguration().getFirstLevelModuleDependencies(),再通过resolvedDependency.getChildren()遍历或者,优点是组节全 可以离线化,缺点是速度慢。
在实践中发现,第一个方案已经基本能满足需求,如果有第一个方案获取不到的情况也能通过手动添加信息到组件管理平台后修复。
- 遍历aar文件解压后文件路径,有developer.txt的复制写入新文件,没有的通过组件管理平台获取组件信息写入。将文件放入/outputs/mapping路径下,和mapping文件一起上传到oss apk产物地址。
retrace 出组件及负责人信息
和mapping.txt 类似我们把 developer.txt加载到内存中。每个class能找到以下对应信息。
打通组件管理平台&gitlab blame api
拿到上面的类信息后,就可以选择使用组件管理平台接口和git blame api拿到更加详细的信息。
String format = "https://pkg.test.com/api/v4/projects/%s/repository/files/%s/blame?ref=%s";
String url = String.format(format, moduleGitEncode, classRawFileEncode, classInfo.getModuleInfo().getModuleHeadCommit());