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 卸載原來的應用。