JFrame实现批量获取Android安装包安全证书MD5

今天遇到一个需求,获取所有apk的签名的MD5,下面是我使用Java SE实现的一个工具,贴出核心源代码,希望给有需要的朋友有所帮助。

界面如下:

只需要制定.apk文件所在的目录即可,核心代码如下:

public class ReadCmdLine {
	private static MD5Window window;
	private static String inputPath;

	public static void main(String args[]) {
		window = new MD5Window();
		window.setVisible(true);
		initWindow();
	}

	private static void initWindow() {
		// 文件目录文本框
		window.getFilePathButton().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				JFileChooser jfc = new JFileChooser();
				jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
				jfc.showDialog(new JLabel(), "选择");
				File file = jfc.getSelectedFile();
				notDirectoryExcute(file);
			}
		});
		// 开始运行按钮
		window.getBeginButton().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				inputPath = window.getJTextFiled();
				if (inputPath != null && !"".equals(inputPath.trim())) {
					notDirectoryExcute(new File(inputPath));
				}
			}
		});
		// 清空结果按钮
		window.getClearButton().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				window.setTextArea("");
			}
		});
	}

	/**
	 * 判断是否是目录,如果不是则执行
	 *
	 * @param file
	 */
	public static void notDirectoryExcute(File file) {
		if (file.isDirectory()) {
			inputPath = file.getAbsolutePath();
			window.setJTextFiled(inputPath);
			File[] fiels = file.listFiles();
			for (int i = 0; i < fiels.length; i++) {
				String absPath = fiels[i].getAbsolutePath();
				if (absPath.contains(".apk")) {
					excute(absPath);
				}
			}
		} else {
			JOptionPane.showMessageDialog(window, "请选择目录");
		}
	}

	/**
	 * 核心逻辑
	 *
	 * @param absPath
	 */
	public static void excute(String absPath) {
		// 1、从.apk中读取CERT.RSA文件
		String appName = absPath.substring(absPath.lastIndexOf("_") + 1,
						absPath.lastIndexOf("."));
		try {
			if (absPath != null) {
				readZipFile(absPath);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		// 2、执行 keytool命令获取MD5
		Process process = null;
		List<String> processList = new ArrayList<String>();
		try {
			process = Runtime.getRuntime().exec(
				"keytool -printcert -file D:/test/CERT.RSA");
			BufferedReader input = new BufferedReader(new InputStreamReader(
				process.getInputStream()));
			String line = "";
			while ((line = input.readLine()) != null) {
				processList.add(line);
			}
			input.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		// 过滤内容
		for (String line : processList) {
			if (line.contains("MD5")) {
				window.setTextArea(window.getTextArea()
					+ String.format("%-30s", appName) + line.trim() + "\n");
			}
		}
	}

	/**
	 * 读取压缩文件内容
	 *
	 * @param file 压缩文件的路径
	 * @throws Exception
	 */
	public static void readZipFile(String file) throws Exception {
		ZipFile zf = new ZipFile(file);
		InputStream in = new BufferedInputStream(new FileInputStream(file));
		ZipInputStream zin = new ZipInputStream(in);
		File outFile = new File("D:\\test\\CERT.RSA");
		OutputStream out = new FileOutputStream(outFile);
		InputStream rsaStream = zf.getInputStream(zf
				.getEntry("META-INF/CERT.RSA"));
		byte[] buf1 = new byte[1024];
		int len;
		while ((len = rsaStream.read(buf1)) > 0) {
			out.write(buf1, 0, len);
		}
		rsaStream.close();
		out.close();
		in.close();
		zin.closeEntry();
	}
}
时间: 2024-10-20 06:45:16

JFrame实现批量获取Android安装包安全证书MD5的相关文章

unity 导出 android安装包配置方案

原地址:http://blog.csdn.net/u012085988/article/details/17393111 1.jdk本人安装的是win32版的(虽然系统是64位的.但听说装64位的导出时会报错).这个很重要,我当时就因为装错了jdk,蛋疼了好久. 2.android sdk.为了防止兼容问题,我直接下载的adt 20131030(Android Developer Tools). 3.unity.本人unity版本为4.1.5f1. 基本就这些东西了.就这三个步骤,折腾了我整整一

android获取apk安装包信息

public class TestActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.main);  String archiveFilePath="sdcard/jb51.net.apk";//安装包路径  PackageManager p

获取手机安装包信息+运行应用信息

1 PacInfo pacInfo=new PacInfo(); 2 ArrayList<AppInfo> appInfos=pacInfo.Get(SysInfoService.this); 3 StringBuffer stringBuffer=new StringBuffer(); 4 stringBuffer.append("\n\n"+"日记时间:"+FileStore.date()); 5 stringBuffer.append("

android 安装包签名问题探究

1.首先先科普一下,android为什么需要给安装包签名: 所有的Android应用程序在发布之前都要求开发人员用一个证书进行数字签名,anroid系统不会安装没有进行签名的由于程序.    平时我们的程序可以在模拟器上安装并运行,是因为在应用程序开发期间,由于是以Debug面试进行编译的,因此ADT根据会自动用默认的密钥和证书来进行签名,而在以发布模式编译时,apk文件就不会得到自动签名,这样就需要进行手工签名. 给apk签名可以带来以下好处:    1. 应用程序升级:如果你希望用户无缝升级

Mac下获取AppStore安装包文件路径

本文介绍了Mac下如何找到AppStore下载的安装包路径,以及如何提取出来供以后使用的相关步骤,希望对大家有所帮助. 通过远在大洋彼岸的苹果服务器下载东西,确实有够慢啊!AppStore更甚:甚至都经常提示连不上服务器,而有些软件呢,还必须从AppStore下载安装,所以没办法,谁让上了苹果的贼船呢!公司的网速更是不敢恭维,以至于基本上不下东西,除非像这次一样:手贱的把iPhone6升级到8.2.2了,然后Xcode6.1.1真机调试不成了,所以需要下个Xcode6.2.昨天刚更新的Xcode

Android获取未安装包的信息

public String PATH = Environment.getExternalStorageDirectory()   .getAbsolutePath()   + File.separator   + GlobalConfig.WENJIANJIA   + File.separator + GlobalConfig.WENJIANJIAZIWENJIANJIA+ File.separator+"WENJIANMINGZI"; ApplicationInfo packAppl

关于arcgis android 安装包较大的问题

如果想缩小大小,可以只保留armeabi,只是这样就不支持x86类型cpu的手机了. 可以考虑做成单独的版本,供用户下载. 即打2个包,一个供普通arm cpu手机用,一个供x86 cpu手机用. x86 cpu手机普遍还是较少

[Android] Robotium手机自动化测试(仅需apk安装包版)——环境搭建 【转】

Robotium的手机自动化测试,很多都是利用app源代码里的Id定义来开发自动化脚本.而在我开始要为项目中的app写自动化测试脚本的时 候,开发的环境还很不稳定,app也还处于开发的状态中,而且,在需要自己搭建Android整个开发环境的时候,也遇到许多需要耗费很多时间去解决的开 发问题.因此,我觉得,在这种情况下,如果自己的自动化脚本环境能和开发完全独立,那么,应该可以更好地展开自动化脚本的开发.所以,在网上一番探索后, 选择了只需要apk安装包的方法. 当然,这样也会遇到问题,比如,在开发

Windows Phone 8.1中安装包文件及其两种获取方法

Windows Phone中除了应用文件存储的三种文件类型:本地文件,漫游文件,临时文件.还有一种文件叫做安装包 文件,它是指应用程序编译之后生成的部署文件的内部数据.在安装包下的文件数据其实就是应用程序项目中添加的 文件,就比如Assets文件夹里面的图片文件等等.我们可以通过代码获取安装包下的文件,但是获取不到编译的文件 (源代码或者资类的文件). 那么哪些数据应该放到安装包文件中,哪些数据应该放到应用文件中呢?两种文件的地址和获取方式是不一样的,但 是获取的思想是一样的.应用文件的获取方式