• 在上一篇文章详细讲解了apktool.yml的作用,以及里面字段的具体含义,有哪些用处、需要修改的场景等,可参考Android逆向开发apktool.yml详解,常用的doNotCompress、sdkInfo、unknownFiles、versionInfo修改需求说明_林慈桥的博客-CSDN博客

下面我们来说下解析apktool.yml的解析、修改、合并java实现

  • apktool.yml是一个yml文件,解析的工具可以使用snakeyaml-x.x.x.jar工具,如果您需要这个工具的话可以去这里下载解析yml、yaml的工具类库文件-Java文档类资源-CSDN下载
  • 首先我们打开一个apktool.yml文件,将里面的所有key、value映射成一个java类
  • ApktoolYml.java:
    package com.lcq.apktoolyml;import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;public class ApktoolYml {public String version;public String apkFileName;public boolean isFrameworkApk;public UsesFramework usesFramework;public Map<String, String> sdkInfo;public PackageInfo packageInfo;public VersionInfo versionInfo;public boolean compressionType;public boolean sharedLibrary;public boolean sparseResources;public Map<String, String> unknownFiles;public List<String> doNotCompress;public Map<String, String> getUnknownFiles() {return unknownFiles;}public void putUnknownFiles(Map<String, String> data) {if (data == null) return;if (unknownFiles == null) {unknownFiles = new HashMap<>();}unknownFiles.putAll(data);}public void addDoNotCompress(List<String> data) {if (data == null) return;if (doNotCompress == null) {doNotCompress = new ArrayList<>();}doNotCompress.addAll(data);}
    }
    
  • PackageIfo.java
    package com.lcq.apktoolyml;public class PackageInfo {public String forcedPackageId;public String renameManifestPackage;
    }
    
  • UsesFramework.java
    package com.lcq.apktoolyml;import java.util.List;public class UsesFramework {public List<Integer> ids;public String tag;
    }
    
  • VersionInfo.java
    package com.lcq.apktoolyml;public class VersionInfo {public String versionCode;public String versionName;
    }
    
  • apktool.yml对应的实体类写好后,就可以开始使用snakeyaml-x.x.x.jar工具提供的Yaml类进行解析了,我封装了一个YmlUtil类,如下
    package com.lcq.apktoolyml;import org.yaml.snakeyaml.DumperOptions;
    import org.yaml.snakeyaml.Yaml;import java.io.*;
    import java.nio.charset.StandardCharsets;public class YmlUtil {/*** 加载apktool.yml 到ApktoolYml类中** @param ymlPath apktool.yml文件路径* @return*/public static ApktoolYml loadYml(String ymlPath) {FileInputStream fis = null;try {fis = new FileInputStream(new File(ymlPath));return new Yaml().loadAs(fis, ApktoolYml.class);} catch (Exception e) {e.printStackTrace();} finally {if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}return null;}/*** 将ApktoolYml 实例写入apktool.yml文件** @param data    ApktoolYml 实例* @param ymlPath apktool.yml文件路径*/public static void write(ApktoolYml data, String ymlPath) {FileOutputStream fos = null;OutputStreamWriter outputStreamWriter = null;Writer writer = null;try {fos = new FileOutputStream(new File(ymlPath));outputStreamWriter = new OutputStreamWriter(fos, StandardCharsets.UTF_8);writer = new BufferedWriter(outputStreamWriter);DumperOptions options = new DumperOptions();options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);new Yaml().dump(data, writer);} catch (Exception e) {e.printStackTrace();} finally {if (fos != null) {try {fos.close();} catch (IOException ioException) {ioException.printStackTrace();}}if (outputStreamWriter != null) {try {outputStreamWriter.close();} catch (IOException ioException) {ioException.printStackTrace();}}if (writer != null) {try {writer.close();} catch (IOException ioException) {ioException.printStackTrace();}}}}/*** @param srcYmlPath    需要合并的apktool.yml文件* @param targetYmlPath 合并到的目标apktool.yml文件*/public void merge(String srcYmlPath, String targetYmlPath) {ApktoolYml mergeYml = loadYml(srcYmlPath);ApktoolYml targetYml = loadYml(targetYmlPath);targetYml.addDoNotCompress(mergeYml.doNotCompress);targetYml.putUnknownFiles(mergeYml.unknownFiles);write(targetYml, targetYmlPath);}
    }
    
  • 调用loadYml()可以得到一个ApktoolYml实例,我们可以任意的修改里面的内容,然后再调用write()方法,将修改后的ApktoolYml实例写入到指定的apktool.yml文件文件中,这样我们在使用apktool进行回编译的时候,这些设置将会生效
  • 下面来写个修改versionCode和versionName的示例吧
    package com.lcq.apktoolyml;public class Main {public static void main(String[] args) {String path = "./apktool.yml";ApktoolYml apktoolYml = YmlUtil.loadYml(path);apktoolYml.versionInfo.versionCode = "110";apktoolYml.versionInfo.versionName = "1.1.1";YmlUtil.write(apktoolYml, path);System.out.println(apktoolYml.apkFileName);}
    }
    
  • 查看下apktool.yml文件,已经修改生效了,其他的也可以进行修改,如果您有兴趣的话,可以自己试试哦,这个代码的demo示例可以到这里查看:ApktoolYml: apktool.yml解析Demo

Android 逆向开发-apktool.yml的解析、修改、合并的java实现相关推荐

  1. 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )

    文章目录 I . 调用 Java 方法流程 II . 获取 jclass 对象 ( GetObjectClass ) III . 获取 jclass 对象 ( FindClass ) IV . JNI ...

  2. 【Android NDK 开发】JNI 方法解析 ( C/C++ 设置 Java 对象字段 | 查找字段 | 设置字段 )

    文章目录 I . 设置 Java 对象 属性 流程 II . 查找 Java 对象属性 ( GetFieldID ) III . 设置 Java 对象属性 ( SetXxxField ) I . 设置 ...

  3. 【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中进行断点调试 | ELFFile 实例对象分析 )

    文章目录 一.PyCharm 中进行断点调试 二.ELFFile 实例对象分析 一.PyCharm 中进行断点调试 在上一篇博客 [Android 逆向]使用 Python 代码解析 ELF 文件 ( ...

  4. Android逆向之八门神器原理解析(主要分析其修改内存原理)

    实现dump出指定进程的内存文件 进阶 进程注入 参考教程:Android注入完全剖析 问题解决 1.执行memdump时报错:error: only position independent exe ...

  5. android逆向开发工程师需要掌握的技能

    必须掌握的技能 1.负责安卓程序的加解密和数据传输分析.拆解.逆向等工作;  2 .逆向APK,了解运行过程:  3 .Andorid本地提权获得root权限:  4 .熟练掌握软件逆向静态分析.动态 ...

  6. android逆向开发工程师需要掌握的技能--实习一个月总结报告

    必须掌握的技能 1.负责安卓程序的加解密和数据传输分析.拆解.逆向等工作; 2 .逆向APK,了解运行过程: 3 .Andorid本地提权获得root权限: 4 .熟练掌握软件逆向静态分析.动态调试. ...

  7. 【Android 逆向】函数拦截原理 ( 通过修改 GOT 全局偏移表拦截函数 | 通过在实际被调用的函数中添加跳转代码实现函数拦截 )

    文章目录 一.通过修改 GOT 全局偏移表拦截函数 二.通过在实际被调用的函数中添加跳转代码实现函数拦截 一.通过修改 GOT 全局偏移表拦截函数 使用 GOT 全局偏移表 拦截函数 , 只需要将 G ...

  8. 【Android 逆向】Android 逆向工具 ( Apktool | IDA | Python )

    文章目录 一.Apktool 二.IDA 三.Python 一.Apktool 参考 [Android 安全]DEX 加密 ( 常用 Android 反编译工具 | apktool | dex2jar ...

  9. 【Android NDK 开发】JNI 方法解析 ( JNIEnv *env 参数 )

    文章目录 一. JNI 方法解析 二. JNIEnv *env 参数解析 三. C 语言 环境中 JNIEnv *env 参数解析 四. C ++ 环境中 JNIEnv *env 参数解析 总结 : ...

最新文章

  1. 《Adobe Illustrator大师班:经典作品与完美技巧赏析》目录—导读
  2. 有关数组的运算 (sizeof)(strlen)
  3. linux学习笔记之--vim 程序编辑器
  4. colab加载google drive并且调试时跳过不运行
  5. 布隆过滤器速度_详解布隆过滤器的原理、使用场景和注意事项
  6. python中字典的find_python中的字典
  7. lightoj1027_数学求期望
  8. 如何解决w3wp占用CPU和内存问题
  9. hibernate5(8)操纵对象入门[3]操控对象封装方法
  10. 2.C#2.0之泛型(完成)
  11. gif 动态加载_用 python 实现切割视频,加入水印,压缩并转成 gif !
  12. java面试中的智力题
  13. g4600黑苹果efi_在黑苹果系统下挂载和打开EFI(ESP)分区
  14. matlab 马氏距离 实例,MATLAB求马氏距离(Mahalanobis distance)
  15. Codeforces Round #828 (Div. 3) E1. Divisible Numbers (easy version) 解题报告
  16. ERD Online 4.0.3_fix 元数据在线建模(免费、私有部署)
  17. 还记得有一年红帽考试的一道题吗?创建一个大小为250M的逻辑卷
  18. 浅析Android地理定位(GPS)
  19. 考研英语一大作文模板,就背这2篇
  20. 能画数据库E-R图的软件有哪些

热门文章

  1. 【入门篇】Activiti流程绘制说明
  2. CAN转光纤以太网设备应用
  3. 5.复杂网络经济学应用
  4. odoo 新API装饰器中one、model、multi的区别
  5. 利用Tushare进行股票因子计算
  6. 大数据时代下的106短信群发有着什么样的新含义
  7. java开发个人博客过程_java web个人博客开发(四详细设计)
  8. linux桌面字体改中文,英文界面Ubuntu,修改界面默认雅黑字体
  9. 基于Python的图像分类 项目实践——图像分类项目的指导文档
  10. 表单查询显示翻页等不可用,提示对象不支持此属性或方法,切记查询按钮的name值不能为submit