重签名工具re-sign.jar的实现原理

做一个测试工具时,需要将被测应用重新签名。re-sign.jar用顺手了,想在代码中也调用它来进行重签名工作,但转念一想干嘛不在代码里把它实现了呢?


re-sign.jar工具可以将一个apk文件重签名,使用的是android自带的debug签名,也就是你在eclipse里build后在bin目录生成的apk文件的签名。

下面是它的实现原理,非常简单,就是下面两个命令:


D:\java\jdk1.6.0_43/bin/jarsigner(jarsigner工具,在JDK的bin目录下)  -sigalg MD5withRSA -digestalg SHA1 -keystore  C:\Users\zhuming/.android/debug.keystore(android的debug.keystore路径)  -storepass android -keypass android -signedjar  C:/Users/zhuming/Desktop/temp.apk(重签名后生成的临时文件,不是最终文件)  C:/Users/zhuming/Desktop/source_debug.apk(要签名的apk文件路径) androiddebugkey

这个命令完成了重签名的操作。

D:\android\sdk\build-tools\19.1.0/zipalign(zipalign工具,在android SDK的build-tools目录下) -f 4  C:/Users/zhuming/Desktop/temp.apk(刚才生成的临时文件路径) C:/Users/zhuming/Desktop/source_debug.apk(目标文件路径)

这个命令对重签名后的包进行了优化,即对资源文件做了“对齐”处理,详参点击打开链接


了解了这些,再想在代码中执行重签名操作,就非常简单了(下面是我的代码,注意使用前需要配置JAVA_HOME和ANDROID_HOME)。

public static boolean debugSignApk(String sourcePath){
		if (sourcePath == null) {
			return false;
		}

		String temp[] = sourcePath.replaceAll("\\\\","/").split("/"); 
		String name=sourcePath;
		if (temp.length > 1) { 
		    name = temp[temp.length - 1]; 
		}
		name=name.split("_unsigned")[0]+"_debug.apk";
		JDK_JARSIGNER="jarsigner";
		String sign_cmd = JDK_JARSIGNER+" -sigalg MD5withRSA -digestalg SHA1 -keystore "+
		ANDROID_KEYSTORE+" -storepass android -keypass android -signedjar "+"./temp.apk "+"./"+sourcePath+" androiddebugkey";
		
		String zip_cmd="zipalign -f 4 "+"./temp.apk "+name;

		try {
			Process process = Runtime.getRuntime().exec(sign_cmd);
			if (process != null) {
				InputStream inputStream = process.getErrorStream();
				InputStreamReader reader = new InputStreamReader(inputStream);
				BufferedReader bufferedReader = new BufferedReader(reader);
				String line = null;
				while ((line = bufferedReader.readLine()) != null) {
					System.out.println(line);
				}
				bufferedReader.close();
				reader.close();
				inputStream.close();
				process.destroy();
			}
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}
		
		try {
			Process process = Runtime.getRuntime().exec(zip_cmd);
			if (process != null) {
				InputStream inputStream = process.getErrorStream();
				InputStreamReader reader = new InputStreamReader(inputStream);
				BufferedReader bufferedReader = new BufferedReader(reader);
				String line = null;
				while ((line = bufferedReader.readLine()) != null) {
					System.out.println(line);
				}
				bufferedReader.close();
				reader.close();
				inputStream.close();
				process.destroy();
			}
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}

		return true;
	}


上面的代码可以对传入的apk文件进行重签debug签名的操作。


如果不想用debug签名,而想使用自定义签名怎么办呢?见下一篇文章吧。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你解答这个问题。以下是在Mac下使用re-sign.jarapk进行签名的步骤: 1. 首先,你需要下载re-sign.jar并解压缩。可以在GitHub上找到该工具。 2. 然后,你需要安装Java环境。如果你已经安装了Java,可以跳过这一步。 3. 接下来,你需要下载Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files。这是因为默认情况下,Java只支持128位的密钥,而有些应用需要256位的密钥。你可以在Oracle官网上下载对应版本的JCE文件,并将其解压缩到$JAVA_HOME/jre/lib/security/目录下。 4. 现在,你需要将需要签名apk文件和keystore文件放到同一目录下。假设你的apk文件名为app.apk,keystore文件名为key.keystore。 5. 打开终端,进入到re-sign.jar所在的目录。然后执行下面的命令: ``` java -jar re-sign.jar app.apk key.keystore key_alias keystore_password key_password ``` 其中,key_alias是你之前创建keystore时设置的别名,keystore_password是keystore的密码,key_password是别名所对应的密钥的密码。 6. 稍等片刻,re-sign.jar会自动对apk进行签名,并生成一个新的apk文件,名字类似于app-resigned.apk。 7. 最后,你可以使用jarsigner命令验证新apk文件是否已经成功签名。执行下面的命令: ``` jarsigner -verify app-resigned.apk ``` 如果没有任何输出,说明签名已经成功。 希望这个步骤能够帮到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值