apk 签名

由于某些限制,会有这样的需求:拿不到apk源码的情况下要对其中的一些资源进行修改,在Android签名的限制下,直接解压修改会导致签名不一致,这样的apk文件在手机上是无法被安装的,这样就只能对apk进行重新签名来生成新的apk包。从另外一个角度上来说,这也是从系统的级别来保证安全:一个被特定私钥签名的apk是无法被篡改且无法抵赖的。 

要对apk进行重新签名,首先要生成自己的公私钥对,然后删除apk中原有的签名信息再对apk进行重新签名。通过解压可知,apk的签名信息全都存在于META-INF中,删除这个文件,原apk就变成了一个未签名的apk。 

后面的做法摘自http://blog.csdn.net/zengyangtech/article/details/5801708,感谢原作者的探索。 

C:/Program Files/Java/jdk1.6.0_10/bin>keytool -genkey -alias android123.keystore 
-keyalg RSA -validity 20000 -keystore android123.keystore 
输入keystore密码:[密码不回显] 
再次输入新密码:[密码不回显] 
您的名字与姓氏是什么? 
  [Unknown]:  android123 
您的组织单位名称是什么? 
  [Unknown]:  www.android123.com.cn 
您的组织名称是什么? 
  [Unknown]:  www.android123.com.cn 
您的组织名称是什么? 
  [Unknown]:  www.android123.com.cn 
您所在的城市或区域名称是什么? 
  [Unknown]:  New York 
您所在的州或省份名称是什么? 
  [Unknown]:  New York 
该单位的两字母国家代码是什么 
  [Unknown]:  CN 
CN=android123, OU=www.android123.com.cn, O=www.android123.com.cn, L=New York, ST 
=New York, C=CN 正确吗? 
  [否]:  Y 

输入<android123.keystore>的主密码[img][/img] 
        (如果和 keystore 密码相同,按回车): 

通过以上步骤可以获得一个keystore,里面存储的是公私密钥信息。 

接下来就可以签名了。 

执行下面这句jarsigner -verbose -keystore test.keystore -signedjar test_signed.apk test.apk test.keystore 就可以生辰签名的apk文件,这里输入文件android123.apk,最终生成android123_signed.apk为Android签名后的APK执行文件。下面提示输入的密码和keytool输入的一样就行了 
这里-keystore 里是刚才生成的密钥 
-signedjar 第一个参数test_signed.apk是输出apk,test.apk是原apk,testkeystore是刚才生成的密钥对的别名 

执行完毕之后就可以得到重新签名的apk了。 



因为要在命令行下运行一些android的工具,所以配置一些环境变量会比较方便:


遇到问题: java -jar re-sign.jar 出现提示android路径没有配置好:


需要配置如下:

配置ANDROID_HOME为android sdk的安卓目录,例如:D:\android-sdk

在path下添加这两个:

%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;

重新开关一次命令窗口 

 

在真机中安装APK(以腾讯微信作为测试的apk)

因为robotium要求被测应用和测试代码要有一致的key,所以我们需要把下载到的apk,通过re-sign.jar来产生debug key的apk,这个重新生成的apk就会跟测试项目签名一致了

 

re-sign.jar可以从这里下载到:

http://www.troido.de/re-sign.jar

 

下载完后,在命令行下 通过 java -jar re-sign.jar就会出现一个节目,然后将apk拖到这个节目,就会自动生成一个debug key的apk

 

产生新apk的过程中会弹出一个信息框,记得截下图,因为里面有两个信息我们等会的代码中需要用到

 



然后打开模拟器(模拟器器一定要打开才能安装成功),然后打开命令行

adb install mitalk_debug.apk(新生成apk的名称)

安装成功就可以再模拟器里看到该应用的图标了

 

注意:

一、删除之前 APK 文件的签名
1、解压apk 文件
2、删除解压出来文件夹中的 META-INF 目录:META-INF 存放签名后的CERT 和MANIFEST 文件,用于识别软件的
签名及版权。
3、删除文件夹后重新把解压出来的其它文件夹压缩为zip 文件,然后直接把文件后缀改为apk

二、为 APK 重新生成签名

1、将证书复制到与需要重新签名的apk 文件相同的目录下

 2、jarsigner -keystore debug.keystore -storepass android -keypass android D:\Robotium\robotium\robotium\weixin_delet_rsa_sf.apk androiddebugkey

 

创建自动化测试项目

打开Eclipse,点击File->New一个Android Test Project,然后点击下一步的时候选择This project(因为我们没有米聊应用的源码),然后选择要在哪个android版本上测试

 

在该项目下创建一个包,com.tencent.test,在该包下创建LoginTest类,如下

 

package com.mitalk.test;


import android.app.Activity;
import android.test.ActivityInstrumentationTestCase2;


import com.jayway.android.robotium.solo.Solo;


@SuppressWarnings("rawtypes")
public class LoginTest extends ActivityInstrumentationTestCase2 {


public Solo solo;
public Activity activity;
private static Class<?> launchActivityClass;
// 对应re-sign.jar生成出来的信息框里的两个值
private static String mainActiviy = "com.tencent.mm.ui.LauncherUI";
private static String packageName = "com.tencent.mm";


static {
try {
launchActivityClass = Class.forName(mainActiviy);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}


@SuppressWarnings("unchecked")
public LoginTest() {
super(packageName, launchActivityClass);
}


@Override
protected void setUp() throws Exception {
super.setUp();
this.activity = this.getActivity();
// this.solo = new Solo(getInstrumentation(), getActivity());
}


public void testLoginWithIncorrentUsernameAndPassword() throws Exception {
wait(5000);
//待完成
}


@Override
public void tearDown() throws Exception {
try {
this.solo.finishOpenedActivities();
} catch (Throwable e) {
e.printStackTrace();
}
this.activity.finish();
super.tearDown();
}


}


右键该项目,选择property然后选择java build path, 选择 Add External JARs,选择下到的robotium.jar


在跑测试用例之前,还需要修改下AndroidManifest.xml文件的android:targetPackage为被测应用的根的包名
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mitalk.test"
    android:versionCode="1"
    android:versionName="1.0" >


    <supports-screens android:anyDensity="true" />


    <uses-sdk android:targetSdkVersion="17" />
    <uses-sdk android:minSdkVersion="17" />


    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.tencent.mm" />


    <application
        android:debuggable="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <uses-library android:name="android.test.runner" />
    </application>


</manifest>

以上都弄完了,run as android junit test,就可以跑了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值