Android自定义签名文件 testkey.pk8 testkey.x509.pem
原文地址:http://www.cnblogs.com/wanqieddy/p/3556060.html
signapk.jar與eclipse export插件默認賦予程序一個DEBUG權(quán)限的簽名
signapk.jar包含有系統(tǒng)權(quán)限(system api, permission),而eclipse export插件默認賦予程序一個DEBUG權(quán)限的簽名。
D:\work_feixun\GalleryBack>java -jar signapk.jar platform.x509.pem platform.pk8 D:\work_feixun\Gallery2\bin\Gallery.apk Gallery_signed.apk
注:
signapk.jar ? 位于 out/host/linux-86/framework/signapk.jar
platform.x509.pem platform.pk8 ? 位于 build/target/product/security/platform.x509.pem, platform.pk8
Gallery.apk的生成,先在eclipse中對project->clean,然后 run ->android application.在bin目錄下會生成Gallery.apk。
最后
D:\work_feixun\GalleryBack>java -jar signapk.jar platform.x509.pem platform.pk8 D:\work_feixun\Gallery2\bin\Gallery.apk Gallery_signed.apk
這樣包含有系統(tǒng)權(quán)限的簽名apk就完成了。
?
我是在AndroidManifast中添加android.permission.WRITE_MEDIA_STORAGE時出現(xiàn)
permission is only granted to system apps.
?
from:http://blog.csdn.net/tangmin0719/article/details/8916417
?
一、為什么要簽名
???????開發(fā)Android的人這么多,完全有可能大家都把類名,包名起成了一個同樣的名字,這時候如何區(qū)分?簽名這時候就是起區(qū)分作用的。
?????? ?由于開發(fā)商可能通過使用相同的Package Name來混淆替換已經(jīng)安裝的程序,簽名可以保證相當(dāng)名字,但是簽名不同的包不被替換。
?????? APK如果使用一個key簽名,發(fā)布時另一個key簽名的文件將無法安裝或覆蓋老的版本,這樣可以防止你已安裝的應(yīng)用被惡意的第三方覆蓋或替換掉。
???????這樣簽名其實也是開發(fā)者的身份標識。交易中抵賴等事情發(fā)生時,簽名可以防止抵賴的發(fā)生。
二、簽名的注意事項
???????Android系統(tǒng)要求所有的程序經(jīng)過數(shù)字簽名才能安裝,如果沒有可用的數(shù)字簽名,系統(tǒng)將不許安裝運行此程序。不管是模擬器還是真實手機。因此,在設(shè)備或者是模擬器上運行調(diào)試程序之前,必須為應(yīng)用程序設(shè)置數(shù)字簽名。
?????? Android簽名的數(shù)字證書不需要權(quán)威機構(gòu)來認證,是開發(fā)者自己產(chǎn)生的數(shù)字證書,即所謂的自簽名。數(shù)字證書用來標識應(yīng)用程序的作者和在應(yīng)用程序之間建立信任關(guān)系,而不是用來決定最終用戶可以安裝哪些應(yīng)用程序。
???????系統(tǒng)僅僅會在安裝的時候測試簽名證書的有效期,如果應(yīng)用程序的簽名是在安裝之后才到期,那么應(yīng)用程序仍然可以正常啟用。
???????可以使用標準工具-Keytool and Jarsigner-生成密鑰,來簽名應(yīng)用程序的.apk文件。
???????簽名后需使用zipalign優(yōu)化程序。
???????模擬器開發(fā)環(huán)境,開發(fā)時通過ADB接口上傳的程序會先自動被簽有Debug權(quán)限,然后才傳遞到模擬器。Eclipse菜單的Window -> Preferences -> Android –> Build?下顯示的是我們默認的調(diào)試用的簽名數(shù)字證書。
???????正式發(fā)布一個Android應(yīng)用時,必須使用一個合適的私鑰生成的數(shù)字證書來給程序簽名,不能使用ADT插件或者ANT工具生成的調(diào)試證書來發(fā)布。
?
三、簽名方法:
1.使用Keytool?和jarsigner工具簽名(在jdk/bin目錄下)
1.生成簽名keystore:
確保電腦上安裝了JDK,因為我們將使用JDK自帶的創(chuàng)建和管理數(shù)字證書的工具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???????????
然后按回車鍵
按回車后首先會提示你輸入的密碼:這個在簽名時要用的,要記住
然后會再確認你的密碼。
之后會依次叫你輸入姓名、組織單位、組織名稱、城市區(qū)域、省份名稱、國家代碼(CN)等。
Keytool的詳細參數(shù)請參考:
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
然后按回車:會要求輸入剛才設(shè)置的密碼,輸入后按回車就開始簽名了。
?
3.查看簽名:
jarsigner -verify app_signed.apk??????????????????????????????????
查看是否簽名,如果已經(jīng)簽名會打印?"jar verified".
jarsigner -verify -verbose -certs app_signed.apk??????
查看簽名詳細信息。
?
4.通過zipalign工具進行優(yōu)化apk(android自帶的工具,./build/tools/zipalign)
zipalign -v 4??app_signed.apk androidres.apk???對apk優(yōu)化
zipalign -c -v 4??androidres.apk ????????????????查看apk是否經(jīng)過優(yōu)化
?
?2.使用eclipse ADT工具簽名
在Package Explorer?窗口,右鍵,選擇Android Tools--->Export Signed Application Package?然后按照提示一步一步,生成已簽名的apk。通過eclipse也可以導(dǎo)出未簽名的APK文件。
注:需要輸入兩次密碼,第一次是私鑰密碼,第二次時私鑰別名的密碼。
?
??3.eclipse在debug模式下自動簽名(無須手動配置):?
???????在debug模式下用eclipse?的ADT為android簽名,只要應(yīng)用程序在eclipse下開發(fā),系統(tǒng)就會自動給apk簽名和優(yōu)化。
???????在Eclipse中Windows > Preferences > Android? > Build可以看到你keysotre的位置;
四、生成Android系統(tǒng)簽名
???????上面講的Android數(shù)字簽名大多是與Android APK相關(guān),做CTS?認證時,需要用到Android系統(tǒng)簽名。為什么需要給Android系統(tǒng)簽個名才能進行CTS認證呢?原來我們通過make -j4編譯出來的system.img使用的是test key,這種類型的key只適用于開發(fā)階段,而且這種秘鑰是公開的,誰都可以使用。當(dāng)發(fā)布一款android產(chǎn)品,就需要另外給整個系統(tǒng)簽個名,防止被別人盜用。這種系統(tǒng)就是release版本的Android系統(tǒng)。
1、生成加密key文件
要對Android系統(tǒng)進行簽名,需要生成四種類型的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'???(系統(tǒng)將會提示輸入針對各種key的密碼,按照提示輸入即可)
將會生成?releasekey.pk8?和?releasekey.x509.pem文件,其中?*.pk8是生成的私鑰,而*.x509.pem是公鑰,生成時兩者是成對出現(xiàn)的.
注:如果出現(xiàn)?openssl : relocation error :openssl : symbol ...嘗試用?sudo?執(zhí)行命令,問題解決了!
2.回到根目錄android_src。
命令執(zhí)行的時候都最好在工程的根目錄下執(zhí)行,要不然腳本用到的某些文件找不到的。
3.編譯系統(tǒng)
???make -j4 PRODUCT-generic-user dist??
其中generic?表示生成的TARGET_PRODUCT類型為generic,
???? user代表TARGET_BUILD_VARIANT為user版本。
編譯完成之后回在android_src/dist/目錄內(nèi)生成個product_generic-user_files開頭的zip文件.這就是我們需要進行簽名的文件系統(tǒng).
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系統(tǒng)的簽名工作.
key_directory/?表示key所在的目錄。
out/dist/product_modul-target_files.zip???源文件。
out/dist/signed_target_files.zip???生成簽名的目標文件。
可能會出現(xiàn):
ERROR: no key specified for:
? CalendarWidget.apk
? Contacts_yellowpage.apk
? SnsAppMain.apk
這表示,簽名并沒有成功,原因是由于有些apk程序已經(jīng)簽過名了或者找不到對應(yīng)的key.?這需要我們對apk設(shè)置過濾,不對上面的應(yīng)用進行簽名.方法如下:
通過參數(shù)"-e <apkname>="?來過濾這些應(yīng)用.
./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的密碼,會出現(xiàn)四次密碼輸入提示。分別為四種類型的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就可以把簽了名的系統(tǒng)文件燒到手機上了。
五、幾個問題:
1.make_key?和Keytool兩種方式生成的key有何區(qū)別:
?????? Keytool?位于%JAVA_HOME%/bin目錄下,用于管理密鑰、證書和證書鏈。JavaSE6中的Keytool已經(jīng)改變,還可以用來管理對稱加密算法中的密鑰。它生成的mykey.keystore包括公鑰、私鑰和證書。
make_key?位于source_src/development/tools?目錄下,通過調(diào)用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?時,對所有應(yīng)用簽名規(guī)則:
系統(tǒng)在編譯的時候,讀取build/core/package.mk文件,根據(jù)LOCAL_CERTIFICATE的值在build/target/product/security/目錄下選擇相應(yīng)的簽名。LOCAL_CERTIFICATE值從各應(yīng)用的Android.mk文件中讀取,如果Android.mk文件中沒有該屬性,則默認為testkey。
六、常見異常:
1.如果遇到了ZipException invalid entry compressed size的錯誤方法
主要原因是平時Eclipse使用的ADT插件已經(jīng)賦予了DEBUG權(quán)限的數(shù)字簽名,我們可以通過導(dǎo)出一個未簽名的APK文件就可以解決。
2.使用jarsigner工具來簽名,出現(xiàn)無法對jar?進行簽名:java.util.zip.ZipException: invalid entry compressed size (expected?xxx but got?xxx bytes)這樣的提示。
這些問題主要是由于資源文件造成的,對于android開發(fā)來說應(yīng)該檢查res文件夾中的文件,逐個排查。這個問題可以通過升級系統(tǒng)的JDK和JRE版本來解決。
3.安裝apk過程中出現(xiàn):INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES。
這樣的問題主要是簽名沖突造成的,比如你使用了ADB的debug權(quán)限簽名,但后來使用標準sign簽名后再安裝同一個文件會出現(xiàn)這樣的錯誤提示,解決的方法只有先老老實實從手機上卸載原有版本再進行安裝,而adb install -r參數(shù)也無法解決這個問題。adb uninstall?卸載原來的應(yīng)用。
總結(jié)
以上是生活随笔為你收集整理的Android自定义签名文件 testkey.pk8 testkey.x509.pem的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(2369):组件的创建使用和组
- 下一篇: 【Android智能硬件开发】【009】