目录(?)[-]

  1. Android安全模型
  2. 数字证书签发
    1. Debug的keystore
    2. 生产unsigned的apk
    3. 为apk进行证书签发
    4. align安装包
  3. 使用Export Wizard生成签发的apk
  4. adb安装apk命令

Android安全模型

Android应用在部署时有一个数字证书,当运行时,每个应用在一个独立的进程,并有在安装是分配到唯一的一个user ID。此外,通过权限声明来保护敏感信息。

数字证书签发

具体的签发过程可以阅读:http://developer.android.com/tools/publishing/app-signing.html

Android要求应用有数字证书签发,以此确保升级必须为原作者提供。数字证书包括诸如公司、地址等信息,关键属性是签名和公/私钥。公/私钥也称为key pair。数字证书可以从认证机构(CA)获取,也可以通过keytool工具生成。数字证书们保存在keystore中。

签发一个Andriod应用要求有三样:1、数字证书;2、.apk文件;3、如何将数字证书apply到.apk文件的工具。我们可以使用JDK的jarsigner命令行工具为jar签发数字证书。

签发应用需三个步骤:1、通过keytool(或其他工具)生成数字证书;2、使用jarsigner工具(位于JDK的bin/目录下)为apk签发证书;3、分配应用的存贮边界,使之在设备上对内存使用更有效。在Eclipse中,ADT插件在向模拟器或真实设备中部署前已经为你完成上面的步骤。

keytool -genkey -v -keystore "D:\developer\adt-bundle-windows-x86\workspace\release\release.keystore"-alias androidwei-storepasspaxxword-keypass keypaxxword-keyalg RSA-validity 14000

- genkey:产生公私钥对 
- v :在key生成过程中输入verbose。 
- keystore:存放keystore database的路径,本例直接为文件,运行后,我们会看到release.keystore的文件生成。 
- alias:keystore entry的唯一名字 
- storepass:keystore的密码 
- keypass:获取私钥的密码 
- keyalg:算法 
- validity:有效时间(日),这是该应用有效升级的期限,14000大概有38年,Android建议至少有25年以上。

我们需要保持要keystore文件,因为以后的应用版本升级都需要用它来签发,这个文件一旦丢失,无法重新生成。如果没有输入keypass和storepass,keytool会提示输入。keytool会询问作者的信息,例如姓名,公司等,见下图。

我们可以通过下面命令进行查看:

keytool -list -keystore "D:\developer\adt-bundle-windows-x86\workspace\release\release.keystore"

创建了keystore文件,可以重复使用这个文件,加入更多的证书。

Debug的keystore

前面提到,eclipse的ADT插件会帮你做好部署的一切工作。ADT会提供数字证书放在debug.keystore文件,具体路径查询方式如下。

需要注意对于debug版本,有效期validity只有365天,如果超出这个时间,我们编译会报错,不能提供新的版本,简单地,我们只要删除文件即可,ADT会提供一个新的具有365有效期的证书给我们。我们需要将模拟器上的应用uninstalled,或者简单地创建一个新的模拟器。另一种方式就是我们自己给数字证书,有效时间自己定,这个数字证书名字和目录和ADT创建相同,相关参数为:alias=androiddebugkey,storepass=android,keypass=android;在提示中frist  and last name为“Android Debug”,组织单位(organizational unit)为Android,国家代码US,其余的组织(organization)、城市(city)、州(state)不填,即unknown。

生产unsigned的apk

我们需要生成unsigned的apk,然后在为这个apk进行签发。点击project的右键-》Android Tools-》Export Unsigned Application Package即可。

为apk进行证书签发

有了证书,有了apk,我们就可以利用jarsinger工具实施签发。命令如下:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore "D:\developer\adt-bundle-windows-x86\workspace\release\release.keystore"-storepass paxxword -keypass keypaxxword "D:\developer\adt-bundle-windows-x86\ProPermission.apk"androidwei

最后一个参数是证书entry的alias。同样的,我们可以不输入两个password,命令会提示你输入。如果keypass和storepass一致,只需告知storepass密码。

我一开始根据《Pro Android 4.0》一书的指引,所签发的apk在设备上安装会报错,而通过wizard方式正常(见后面介绍),说明问题出现在jarsigner处。究其原因,是我使用了JDK 7,这个版本要求给出签发和digest算法,也即-sigalg和-digestalg参数。

align安装包

在Android,可以通过通过mmap()将没有压缩的数据直接放入内存,例如特定img或者文件。由于手机的CPU是32位,这要求安装包的数据也是以4个字节为边界。在签发证书后,我们可以利用zipalign工具(在Android SDK tools目录)进行对齐。调整后的apk会比原来的稍大一些。

zipalign –v 4 <infile.apk> <outfile.apk> 生产对齐apk -v即verbose,4即4字节,如要覆盖已有的outfile.apk,增加-f表示force
zipalign –c –v 4 <filename.apk> 检查该apk是否已经对齐调整

使用Export Wizard生成签发的apk

在生成unsigned apk时,我们注意到还有一项是Export Signed Application Package..(右键project-》Android Tools –》Export Signed Application Package),这是一个Export Wizard,引导完成上面的所有步骤。这种方式,可以使用已有的keystore,也可以新建,建议使用这种方式

adb安装apk命令

上面我们已经生产了签发的apk,对于apk文件,可以通过adb命令进行安装。

D:\developer\adt-bundle-windows-x86>adb install ProPermission.apk
71 KB/s (278408 bytes in 3.826s) 
        pkg: /data/local/tmp/ProPermission.apk 
Failure [INSTALL_FAILED_ALREADY_EXISTS]

不成功,已经存在,那可以采用强制覆盖的方式进行安装:

D:\developer\adt-bundle-windows-x86>adb install-r ProPermission.apk
68 KB/s (278408 bytes in 3.991s) 
        pkg: /data/local/tmp/ProPermission.apk 
Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES]

还不成功,原来我们已经在模拟器上安装的debug版本,这和apk使用不同的证书签发的,证书不同,不能安装,我们需要卸装,在模拟器上就上手机那样进行卸装,可以用命令:

adb uninstall cn.wei.flowingflying.propermission

注意,这里的参数是包名,不是apk的名字,而是在AndroidManifest.xml中定义的。在AndroidManifest.xml也定义了version,用于作为版本升级的判断。

相关链接: 我的Android开发相关文章

【转】 Pro Android学习笔记(六四):安全和权限(1):签发apk的更多相关文章

  1. 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版

    目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...

  2. 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果

    目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...

  3. 【转】 Pro Android学习笔记(四八):ActionBar(1):Home图标区

    目录(?)[-] Home Icon 源代码 TextView的滚动 返回主activity或指定activity     ActionBar在Android 3.0 SDK中为平板引入,在4.0中也 ...

  4. 【转】 Pro Android学习笔记(四七):Dialog(4):一些补充和思考

    目录(?)[-] 编程思想封装接口 fragment和activity以其他fragment之间的通信 编程思想:封装接口 在小例子中,fragment会调用activity的onDialogDone ...

  5. 【转】 Pro Android学习笔记(四三):Fragment(8):再谈Transaction和管理器

    目录(?)[-] Transaction的一些操作 再谈FragmentManager 调用其他fragment的方法 唤起activity 唤起fragment和相互通信 一些其它 Transact ...

  6. 【转】Pro Android学习笔记(四):了解Android资源(下)

    处理任意的XML文件 自定义的xml文件放置在res/xml/下,可以通过R.xml.file_name来获取一个XMLResourceParser对象.下面是xml文件的例子: <rootna ...

  7. 【转】 Pro Android学习笔记(五六):配置变化

    目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...

  8. Pro Android学习笔记 ActionBar(1):Home图标区

     Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...

  9. 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge

    目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...

  10. 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET

    目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...

随机推荐

  1. term frequency–inverse document frequency

    term frequency–inverse document frequency

  2. 换教室(期望+DP)

    换教室(期望+DP) \(dp(i,j,1/0)\)表示第\(i\)节课,申请了\(j\)次调换,这节课\(1/0\)调换. 换教室 转移的时候考虑: 上次没申请 这次也没申请 加上\(dis(fr[ ...

  3. Eclipse +Tomcat配置-【菜鸟学JAVA】

    说起来也惭愧,以前用(Unieap)工具搞了一年多的JAVA+Oracle,现在居然在Eclipse中配置tomcat都搞了半天时间,原来一直是做.NET的. 今天开始不再用集成的环境,话不多说,开始 ...

  4. [从jQuery看JavaScript]-匿名函数与闭包(Anonymous Function and Closure)

    http://blog.csdn.net/natineprince/article/details/4759533   jQuery片段: (function(){ //这里忽略jQuery所有实现 ...

  5. linux sort按照指定列排序

    sort怎样按指定的列排序0000 27189 41925425065f 15 419254250663 7 419254250675 5 419254250691 76 419254250693 2 ...

  6. 在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途

    contex指上下文,实际上就是一个web项目:path是虚拟目录,访问的时候用127.0.0.1:8080/welcom/*.jsp访问网页,welcome前面要加/;docBase是网页实际存放位 ...

  7. python 3 json 序列化

    python 3 json 序列化 我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特 ...

  8. hd acm2035

    求A^B的最后三位数表示的整数.说明:A^B的含义是“A的B次方” 思路:后三位只跟后三位相乘有关,所以可以每乘一次都对1000取余. 代码: #include <stdio.h>#inc ...

  9. MySQL跳过密码登录

    第一种 1.1停止mysql服务 1.2以管理员身份运行cmd,执行以下命令 cd C:\Program Files\mysql-5.7.17-winx64\bin mysqld --skip-gra ...

  10. java深入探究07-jdbc下

    1.BeanUtils组件 1)使用:导入commons-beanutils-1.8.3.jar核心包,日志支持包: commons-logging-1.1.3.jar 缺少日志的jar文件报错:ja ...