signapk.jar与eclipse export插件默认赋予程序一个DEBUG权限的签名html
signapk.jar包含有系统权限(system api, permission),而eclipse export插件默认赋予程序一个DEBUG权限的签名。java
D:\work_feixun\GalleryBack>java -jar signapk.jar platform.x509.pem platform.pk8 D:\work_feixun\Gallery2\bin\Gallery.apk Gallery_signed.apklinux
注:android
signapk.jar 位于 out/host/linux-86/framework/signapk.jar算法
platform.x509.pem platform.pk8 位于 build/target/product/security/platform.x509.pem, platform.pk8api
Gallery.apk的生成,先在eclipse中对project->clean,而后 run ->android application.在bin目录下会生成Gallery.apk。app
最后
D:\work_feixun\GalleryBack>java -jar signapk.jar platform.x509.pem platform.pk8 D:\work_feixun\Gallery2\bin\Gallery.apk Gallery_signed.apkeclipse
这样包含有系统权限的签名apk就完成了。ssh
我是在AndroidManifast中添加android.permission.WRITE_MEDIA_STORAGE时出现工具
permission is only granted to system apps.
from:http://blog.csdn.net/tangmin0719/article/details/8916417
1、为何要签名
开发Android的人这么多,彻底有可能你们都把类名,包名起成了一个一样的名字,这时候如何区分?签名这时候就是起区分做用的。
因为开发商可能经过使用相同的Package Name来混淆替换已经安装的程序,签名能够保证至关名字,可是签名不一样的包不被替换。
APK若是使用一个key签名,发布时另外一个key签名的文件将没法安装或覆盖老的版本,这样能够防止你已安装的应用被恶意的第三方覆盖或替换掉。
这样签名其实也是开发者的身份标识。交易中抵赖等事情发生时,签名能够防止抵赖的发生。
2、签名的注意事项
Android系统要求全部的程序通过数字签名才能安装,若是没有可用的数字签名,系统将不准安装运行此程序。不论是模拟器仍是真实手机。所以,在设备或者是模拟器上运行调试程序以前,必须为应用程序设置数字签名。
Android签名的数字证书不须要权威机构来认证,是开发者本身产生的数字证书,即所谓的自签名。数字证书用来标识应用程序的做者和在应用程序之间创建信任关系,而不是用来决定最终用户能够安装哪些应用程序。
系统仅仅会在安装的时候测试签名证书的有效期,若是应用程序的签名是在安装以后才到期,那么应用程序仍然能够正常启用。
可使用标准工具-Keytool and Jarsigner-生成密钥,来签名应用程序的.apk文件。
签名后需使用zipalign优化程序。
模拟器开发环境,开发时经过ADB接口上传的程序会先自动被签有Debug权限,而后才传递到模拟器。Eclipse菜单的Window -> Preferences -> Android –> Build 下显示的是咱们默认的调试用的签名数字证书。
正式发布一个Android应用时,必须使用一个合适的私钥生成的数字证书来给程序签名,不能使用ADT插件或者ANT工具生成的调试证书来发布。
3、签名方法:
1.使用Keytool 和jarsigner工具签名(在jdk/bin目录下)
1.生成签名keystore:
确保电脑上安装了JDK,由于咱们将使用JDK自带的建立和管理数字证书的工具Keytool。在命令行下输入以下命令:
keytool -genkey -v -keystore app.keystore -alias alias_name -keyalg RSA -validity 20000
-alias 后面跟的是别名这里是alias_name
-keyalg 是加密方式这里是RSA
-validity 是有效期这里是20000
-keystore 就是要生成的keystore的名称这里是app.keystore
而后按回车键
按回车后首先会提示你输入的密码:这个在签名时要用的,要记住
而后会再确认你的密码。
以后会依次叫你输入姓名、组织单位、组织名称、城市区域、省份名称、国家代码(CN)等。
Keytool的详细参数请参考:
http://www.android123.com.cn/androidkaifa/173.html
2.签名:
jarsigner -verbose -keystore app.keystore -signedjar app_signed.apk app.apk alias_name
-keystore: keystore的名称
-signedjar app_signed.apk: 指定签名后生成的APK名称
app.apk: 目标APK
而后按回车:会要求输入刚才设置的密码,输入后按回车就开始签名了。
3.查看签名:
jarsigner -verify app_signed.apk
查看是否签名,若是已经签名会打印 "jar verified".
jarsigner -verify -verbose -certs app_signed.apk
查看签名详细信息。
4.经过zipalign工具进行优化apk(android自带的工具,./build/tools/zipalign)
zipalign -v 4 app_signed.apk androidres.apk 对apk优化
zipalign -c -v 4 androidres.apk 查看apk是否通过优化
2.使用eclipse ADT工具签名
在Package Explorer 窗口,右键,选择Android Tools--->Export Signed Application Package 而后按照提示一步一步,生成已签名的apk。经过eclipse也能够导出未签名的APK文件。
注:须要输入两次密码,第一次是私钥密码,第二次时私钥别名的密码。
3.eclipse在debug模式下自动签名(无须手动配置):
在debug模式下用eclipse 的ADT为android签名,只要应用程序在eclipse下开发,系统就会自动给apk签名和优化。
在Eclipse中Windows > Preferences > Android > Build能够看到你keysotre的位置;
4、生成Android系统签名
上面讲的Android数字签名大可能是与Android APK相关,作CTS 认证时,须要用到Android系统签名。为何须要给Android系统签个名才能进行CTS认证呢?原来咱们经过make -j4编译出来的system.img使用的是test key,这种类型的key只适用于开发阶段,并且这种秘钥是公开的,谁均可以使用。当发布一款android产品,就须要另外给整个系统签个名,防止被别人盗用。这种系统就是release版本的Android系统。
1、生成加密key文件
要对Android系统进行签名,须要生成四种类型的key文件。
a)releasekey (testkey)
b)media
c)shared
d)platform
1)进入/android_src/development/tools目录。
2)使用make_key工具生成签名文件。须要分别生成 releasekey,media,shared,platform。
./make_key releasekey '/C=CN/ST=JiangSu/L=NanJing/O=Company/OU=Department/CN=Your Name/emailAddress=YourE-mailAddress' (系统将会提示输入针对各类key的密码,按照提示输入便可)
将会生成 releasekey.pk8 和 releasekey.x509.pem文件,其中 *.pk8是生成的私钥,而*.x509.pem是公钥,生成时二者是成对出现的.
注:若是出现 openssl : relocation error :openssl : symbol ...尝试用 sudo 执行命令,问题解决了!
2.回到根目录android_src。
命令执行的时候都最好在工程的根目录下执行,要否则脚本用到的某些文件找不到的。
3.编译系统
make -j4 PRODUCT-generic-user dist
其中generic 表示生成的TARGET_PRODUCT类型为generic,
user表明TARGET_BUILD_VARIANT为user版本。
编译完成以后回在android_src/dist/目录内生成个product_generic-user_files开头的zip文件.这就是咱们须要进行签名的文件系统.
4.开始签名
./build/tools/releasetools/sign_target_files_apks -d key_directory/ out/dist/product_modul-target_files.zip out/dist/signed_target_files.zip
经过sign_target_files_apks 脚本,完成android系统的签名工做.
key_directory/ 表示key所在的目录。
out/dist/product_modul-target_files.zip 源文件。
out/dist/signed_target_files.zip 生成签名的目标文件。
可能会出现:
ERROR: no key specified for:
CalendarWidget.apk
Contacts_yellowpage.apk
SnsAppMain.apk
这表示,签名并无成功,缘由是因为有些apk程序已经签过名了或者找不到对应的key. 这须要咱们对apk设置过滤,不对上面的应用进行签名.方法以下:
经过参数"-e <apkname>=" 来过滤这些应用.
./build/tools/releasetools/sign_target_files_apks -d key_directory/ -e CalendarWidget.apk= -e Contacts_yellowpage.apk= -e SnsAppMain.apk= -e out/dist/product_modul-target_files.zip out/dist/signed_target_files.zip
输入该命令时会提示输入key的密码,会出现四次密码输入提示。分别为四种类型的key的密码。
5.生成image文件
./build/tools/releasetools/img_from_target_files out/dist/signed-target-files.zip signed-img.zip
用img_from_target_files 命令对生成的igned-target-files.zip文件进行打包,signed-img.zip包含了boot.img,userdate.img,system.img文件等.
6.经过fastboot下载signed-img.zip文件
fastboot update signed-img.zip
经过fastboot就能够把签了名的系统文件烧到手机上了。
5、几个问题:
1.make_key 和Keytool两种方式生成的key有何区别:
Keytool 位于%JAVA_HOME%/bin目录下,用于管理密钥、证书和证书链。JavaSE6中的Keytool已经改变,还能够用来管理对称加密算法中的密钥。它生成的mykey.keystore包括公钥、私钥和证书。
make_key 位于source_src/development/tools 目录下,经过调用openssh生成公钥和私钥,因此生成*.x509.pem和*.pk8的密钥对。
2.用make_key生成的密钥对,对apk进行手动签名:
经过signapk.jar 工具对apk签名,用法:signapk [-w] publickey.x509[.pem] privatekey.pk8 input.jar output.jar
java -jar out/host/linux-x86/framework/signapk.jar releasekey.x509.pem releasekey.pk8 source.zip source-signed.zip
signapk.jar能够本身编译,源码在build/tools/signapk目录下。
3.android源码编译make 时,对全部应用签名规则:
系统在编译的时候,读取build/core/package.mk文件,根据LOCAL_CERTIFICATE的值在build/target/product/security/目录下选择相应的签名。LOCAL_CERTIFICATE值从各应用的Android.mk文件中读取,若是Android.mk文件中没有该属性,则默认为testkey。
6、常见异常:
1.若是遇到了ZipException invalid entry compressed size的错误方法
主要缘由是平时Eclipse使用的ADT插件已经赋予了DEBUG权限的数字签名,咱们能够经过导出一个未签名的APK文件就能够解决。
2.使用jarsigner工具来签名,出现没法对jar 进行签名:java.util.zip.ZipException: invalid entry compressed size (expected xxx but got xxx bytes)这样的提示。
这些问题主要是因为资源文件形成的,对于android开发来讲应该检查res文件夹中的文件,逐个排查。这个问题能够经过升级系统的JDK和JRE版原本解决。
3.安装apk过程当中出现:INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES。
这样的问题主要是签名冲突形成的,好比你使用了ADB的debug权限签名,但后来使用标准sign签名后再安装同一个文件会出现这样的错误提示,解决的方法只有先老老实实从手机上卸载原有版本再进行安装,而adb install -r参数也没法解决这个问题。adb uninstall 卸载原来的应用。