開發Android的人這麼多,徹底有可能你們都把類名,包名起成了一個一樣的名字,這時候如何區分?簽名這時候就是起區分做用的。php
因爲開發商可能經過使用相同的Package Name來混淆替換已經安裝的程序,簽名能夠保證至關名字,可是簽名不一樣的包不被替換。html
APK若是使用一個key簽名,發佈時另外一個key簽名的文件將沒法安裝或覆蓋老的版本,這樣能夠防止你已安裝的應用被惡意的第三方覆蓋或替換掉。java
這樣簽名其實也是開發者的身份標識。交易中抵賴等事情發生時,簽名能夠防止抵賴的發生。android
全部的Android應用都必須有數字簽名,沒有不存在數字簽名的應用,包括模擬器上運行的。Android系統不會安裝沒有數字證書的應用。算法
簽名的數字證書不須要權威機構來認證,是開發者本身產生的數字證書,即所謂的自簽名。瀏覽器
模 擬器開發環境,開發時經過ADB接口上傳的程序會先自動被簽有Debug權限,而後才傳遞到模擬器。以下圖所示,Eclipse菜單的Window -> Preferences -> Android –> Build 下顯示的是咱們默認的調試用的簽名數字證書。安全
正式發佈一個Android應用時,必須使用一個合適的私鑰生成的數字證書來給程序簽名,不能使用ADT插件或者ANT工具生成的調試證書來發布。app
數字證書都是有有效期的,Android只是在應用程序安裝的時候纔會檢查證書的有效期。若是程序已經安裝在系統中,即便證書過時也不會影響程序的正常功能。eclipse
簽名後需使用zipalign優化程序。工具
Android將數字證書用來標識應用程序的做者和在應用程序之間創建信任關係,而不是用來決定最終用戶能夠安裝哪些應用程序。
此方法適用於Android1.5及以上版本。
步驟一:打開Eclipse->選擇你要簽名的項目->右擊->android tools->Export signed Application package
步驟二,在出現的窗口確認是否是這個項目要簽名,而後選擇下一步:
步驟三:在Export Android Application 這一步,若是咱們以前已有有了 keystore, 選擇咱們以前已有的,不然咱們新建一個。
以下,選擇須要保存這個證書文件的目錄,以及這個證書文件的一個密碼。
步驟四,點擊下一步後,咱們須要填寫keystore的基本信息,如,別名,密碼,有效期,姓名,組織,組織名稱,所在城市,所在省份,國家等,點擊Next
步驟5、選擇被簽名後的APK保存位置。點擊finish。注意是選擇最終將產生的文件。
以後咱們在剛纔選擇的目錄下就能夠看到生成的簽名後的APK文件。
這種方式比起前面要複雜不少了,可是卻對咱們理解APK文件有不少幫助。這裏咱們是使用Keytool和Jarsigner給程序簽名。
keytool 是個密鑰和證書管理工具。jarsigner 工具利用密鑰倉庫中的信息來產生或校驗 Java 存檔 (JAR) 文件的數字簽名 (JAR 文件將類文件、圖象、聲音和/或其它數字化數據打包在一個文件中)。
這兩個工具都是JDK自帶的,因此你當前須要先確保JDK安裝正確。而且環境變量設置正確,以即可以以命令行的方式進行處理。
下面是我隨便生成的一個證書文件:
E:\Projects\cybercare.cn\trunk\android\ks2>keytool -genkey -keystore ks2.keystor
e -keyalg RSA -validity 10000 -alias ks2.keystore
輸入keystore密碼:
您的名字與姓氏是什麼?
[Unknown]: www.cybercare.cn
您的組織單位名稱是什麼?
[Unknown]: Cybercare
您的組織名稱是什麼?
[Unknown]: 津馳速信
您所在的城市或區域名稱是什麼?
[Unknown]: 北京
您所在的州或省份名稱是什麼?
[Unknown]: 北京
該單位的兩字母國家代碼是什麼
[Unknown]: CN
CN=www.cybercare.cn, OU=Cybercare, O=津馳速信, L=北京, ST=北京, C=CN 正確嗎?
[否]: y
輸入<ks2.keystore>的主密碼
(若是和 keystore 密碼相同,按回車):
再次輸入新密碼:
E:\Projects\cybercare.cn\trunk\android\ks2>
命令參數說明:
-genkey 產生證書文件
-keystore 指定密鑰庫的.keystore文件中
-keyalg 指定密鑰的算法
-validity 爲證書有效天數,這裏咱們寫的是10000天。
-alias 產生別名
在輸入密碼時沒有回顯,只管輸入就能夠了,通常位數建議使用20位,切忌須要記下來後面還要用,
注意:
一、 CN(Common Name - 名字與姓氏):其實這個「名字與姓氏」應該是域名,好比說localhost或是blog.devep.net之類的。輸成了姓名,和真正運行的時候域名 不符,會出問題。瀏覽器訪問時,彈出一個對話框,提示「安全證書上的名稱無效,或者與站點名稱不匹配」,用戶選擇繼續仍是能夠瀏覽網頁。可是用http client寫程序訪問的時候,會拋出相似於「javax.servlet.ServletException: HTTPS hostname wrong: should be 」的異常。
二、在用keytool生成數字證書時必須保證:-keystore androidapp.keystore -alias androidapp.keystore 二者名稱必須相同。不然下一步簽名時會出現錯誤:jarsigner: 找不到 androidapp.keystore 的證書鏈。androidapp.keystore 必須引用包含專用密鑰和相應的公共密鑰證書鏈的有效密鑰庫密鑰條目。
KeyTool的更多參數說明能夠看這篇文章:
http://www.cnblogs.com/kungfupanda/archive/2010/09/01/1815047.html
方法一:使用Eclipse
打開Eclipse->選擇你要導出的項目->右擊->android tools->Export Unsigned Application package
而後在選擇保存文件目錄和文件名對話框中輸入你想保存的地址,確認後導出後提示信息相似以下:
方法二:
使用Eclipse,在Package Explorer中選擇Androidmanifest.xml文件,找到overview項中,單擊Export the unsigned apk,如圖
注意:
http://www.android123.com.cn/kaifafaq/175.html 提供的方法二:
直接進入工程文件夾的bin目錄,好比咱們的爲C:\Documents and Settings\Administrator\workspace\android123\bin\android123.apk,直接複製出來就是未簽名的APK文件。
這個方法並不可取,這個方法取出來的是加了Debug簽名的APK文件,而不是未簽名的APK文件。
下面是我簽名我一個以前寫的演示程序的執行效果:
E:\Projects\cybercare.cn\trunk\android\ks2>jarsigner -verbose -keystore ks2.keystore -signedjar GasBuddy_signed_00.apk GasBuddy002.apk ks2.keystore
輸入密鑰庫的口令短語:
輸入 ks2.keystore 的密鑰口令:
正在添加: META-INF/MANIFEST.MF
正在添加: META-INF/KS2_KEYS.SF
正在添加: META-INF/KS2_KEYS.RSA
正在簽名: res/layout/active.xml
正在簽名: res/layout/businessmeninfo_activitylayout.xml
正在簽名: res/layout/businessmeninfo_commentinfo_layout.xml
正在簽名: res/layout/businessmeninfo_commentlist_layout.xml
正在簽名: res/layout/businessmeninfo_information_layout.xml
正在簽名: res/layout/businessmeninfo_pointcardinfo_layout.xml
正在簽名: res/layout/businessmeninfo_pointcardlist_layout.xml
正在簽名: res/layout/commen_publish.xml
正在簽名: res/layout/discount_gasstation_foot_layout.xml
正在簽名: res/layout/discount_gasstation_head_layout.xml
正在簽名: res/layout/discount_gasstation_layout.xml
正在簽名: res/layout/discount_gasstation_list_activitylayout.xml
正在簽名: res/layout/discount_gasstation_title_layout.xml
正在簽名: res/layout/login.xml
正在簽名: res/layout/main.xml
正在簽名: res/layout/menu_activitylayout.xml
正在簽名: res/layout/my_point_gasstation.xml
正在簽名: res/layout/my_point_gasstation_view.xml
正在簽名: res/layout/nearby_gasstation.xml
正在簽名: res/layout/overlay_pop.xml
正在簽名: res/layout/register.xml
正在簽名: res/layout/splash_layout.xml
正在簽名: AndroidManifest.xml
正在簽名: resources.arsc
正在簽名: res/drawable-hdpi/bubble_background.9.png
正在簽名: res/drawable-hdpi/icon.png
正在簽名: res/drawable-hdpi/marker.png
正在簽名: res/drawable-hdpi/u25.png
正在簽名: res/drawable-hdpi/u30.png
正在簽名: res/drawable-ldpi/icon.png
正在簽名: res/drawable-mdpi/icon.png
正在簽名: classes.dex
E:\Projects\cybercare.cn\trunk\android\ks2>
有關 jarsigner 參數的詳細信息能夠參看
http://www.android123.com.cn/androidkaifa/173.html
解決對android APK 項目進行簽名過程當中遇到的問題
http://zhangkun716717-126-com.iteye.com/blog/774382
Android簽名用keytool和jarsigner製做apk文件
http://www.android123.com.cn/androidkaifa/173.html
如何導出一個未簽名的APK文件?
http://www.android123.com.cn/kaifafaq/175.html
沒法對jar進行簽名,Android jarsigner問題
http://www.android123.com.cn/kaifafaq/183.html
有關Android簽名問題總結
http://www.android123.com.cn/androidkaifa/272.html
Android 簽名詳解
http://yangguangfu.iteye.com/blog/723182
android簽名apk批處理文件
http://phenix.blogbus.com/logs/60336413.html
android簽名與release
http://my.chinaunix.net/space.php?uid=20665441&do=blog&id=377220
標籤: Android Eclipse ADT APK簽名