Android反编译助手

本文介绍了一个Java程序,用于将XML资源文件中的十六进制ID转换为十进制形式,并在指定的源码文件夹中进行查找和替换操作。此外,程序还提供了从XML文件中读取资源映射并应用这些映射到Java源文件的功能。
package cn.android.find.main;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class FindReplace {

	public Map<String, String> resources = new HashMap<String, String>(); // key:id value:R.id.bg

	public static File xml = new File("D:/qq/public.xml");	//XML路径
	public static File file = new File("D:/qq/mobileqq.src");	//待替换的源码文件夹
	
	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		FindReplace replace = new FindReplace();
		replace.findReplace(replace.findReplaceXml(xml), file);
		System.out.println("用时:" + (System.currentTimeMillis() - start));
	}
	
	/**
	 * 生成十六进制转成十进制的资源文件
	 * @param file
	 * @return
	 */
	public File findReplaceXml(File file) {
		FileReader fr = null;
		FileWriter fw = null;
		File fileTemp = new File(file.getParent(), "re"+file.getName());
		try {
			fr = new FileReader(file);
			
			fw = new FileWriter(fileTemp);

			BufferedReader bf = new BufferedReader(fr);
			String str = null;// 取一行
			while ((str = bf.readLine()) != null) { // 一行一行的读取全部内容
				// 显示行号
				int index = str.lastIndexOf("id=\"0x");
				if (index != -1) {
					index = index + 6;
					String s = str.substring(index, index + 8);
					str = str.replace("0x" + s, hexToDecimal(s));
				}
				fw.write(str);
				fw.write("\r\n");// 写入换行
			}
			fw.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return fileTemp;
	}
	
	/**
	 * 十六进制转成十进制
	 * @param hexString
	 * @return
	 */
	private static String hexToDecimal(String hexString) {
		BigInteger bi = null;
		bi = new BigInteger(hexString, 16);
		String show = bi.toString(10);
		return show;
	}

	/**
	 * 查找替换
	 * @param xml
	 * @param fileDir
	 */
	public void findReplace(File xml, File fileDir) {
		InputStream inStream = null;
		try {
			initMap(new FileInputStream(xml));
			findFileList(fileDir);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			if (inStream != null)
				try {
					inStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}
	
	/**
	 * 正则表达式查找替换
	 */
	private String matcher(String regex) {
		Matcher m = Pattern.compile("[0-9]\\d{9}").matcher(regex);
		while (m.find()) {
			String recource = resources.get(m.group());
			if(recource!=null){
				regex = regex.replaceAll(m.group(), recource);
			}
		}
		return regex;
	}
	
	/**
	 * 递归遍历目录文件
	 * 
	 * @param file
	 * @param resourceContent
	 * @param replaceContent
	 */
	public void findFileList(File file) {
		File[] files = file.listFiles();
		if (files == null) {
			return;
		}
		for (File f : files) {
			if (f.isDirectory()) {
				findFileList(f);
			} else {
				if (f.getName().endsWith(".java")) {
					transferFile(f); // 查找替换
				}
			}
		}
	}
	/**
	 * 保存到原文件
	 * @param file
	 */
	private void transferFile(File file) {
		try {
			FileReader reader = new FileReader(file);
			char[] dates = new char[1024];
			int count = 0;
			StringBuilder sb = new StringBuilder();
			while ((count = reader.read(dates)) > 0) {
				String str = String.valueOf(dates, 0, count);
				sb.append(str);
			}
			reader.close();
			// 从构造器中生成字符串,并替换搜索文本
			String fileContent = matcher(sb.toString());
			FileWriter writer = new FileWriter(file);
			writer.write(fileContent.toCharArray());
			writer.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 从流中初始化资源集合
	 *  // R.attr.name 2130771968
	 * @param inStream
	 */
	public void initMap(InputStream inStream) {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		try {
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document dom = builder.parse(inStream);
			Element root = dom.getDocumentElement();
			NodeList items = root.getElementsByTagName("public");// 查找所有person节点
			System.out.println("XML文件中有记录:" + items.getLength());
			for (int i = 0; i < items.getLength(); i++) {
				// 得到public节点
				Element publicNode = (Element) items.item(i);
				resources.put(publicNode.getAttribute("id"), "R." + publicNode.getAttribute("type") + "." + publicNode.getAttribute("name"));
			}
			System.out.println("添加记录:"+resources.size());
			inStream.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


转自:http://my.oschina.net/onlytwo/blog/52758

物联网通信协议测试是保障各类设备间实现可靠数据交互的核心环节。在众多适用于物联网的通信协议中,MQTT(消息队列遥测传输)以其设计简洁与低能耗的优势,获得了广泛应用。为确保MQTT客户端与服务端的实现严格遵循既定标准,并具备良好的互操作性,实施系统化的测试验证至关重要。 为此,采用TTCN-3(树表结合表示法第3版)这一国际标准化测试语言构建的自动化测试框架被引入。该语言擅长表达复杂的测试逻辑与数据结构,同时保持了代码的清晰度与可维护性。基于此框架开发的MQTT协议一致性验证套件,旨在自动化地检验MQTT实现是否完全符合协议规范,并验证其与Eclipse基金会及欧洲电信标准化协会(ETSI)所发布的相关标准的兼容性。这两个组织在物联网通信领域具有广泛影响力,其标准常被视为行业重要参考。 MQTT协议本身存在多个迭代版本,例如3.1、3.1.1以及功能更为丰富的5.0版。一套完备的测试工具必须能够覆盖对这些不同版本的验证,以确保基于各版本开发的设备与应用均能满足一致的质量与可靠性要求,这对于物联网生态的长期稳定运行具有基础性意义。 本资源包内包含核心测试框架文件、一份概述性介绍文档以及一份附加资源文档。这些材料共同提供了关于测试套件功能、应用方法及可能包含的扩展工具或示例的详细信息,旨在协助用户快速理解并部署该测试解决方案。 综上所述,一个基于TTCN-3的高效自动化测试框架,为执行全面、标准的MQTT协议一致性验证提供了理想的技术路径。通过此类专业测试套件,开发人员能够有效确保其MQTT实现的规范符合性与系统兼容性,从而为构建稳定、安全的物联网通信环境奠定坚实基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值