一、 防止你已安裝的應用被惡意的第三方覆蓋或替換掉。java
二、 開發者的身份標識,簽名能夠防止抵賴等事件的發生。android
開發Android的人這麼多,徹底有可能你們都把類名,包名起成了一個一樣的名字,這時候如何區分?簽名這時候就是起區分做用的。另外因爲開發商可能經過使用相同的Package Name來混淆替換已經安裝的程序,簽名這時能夠能夠防止你已安裝的應用被惡意的第三方覆蓋或替換掉。於是APK若是使用一個key簽名,發佈時另外一個key簽名的文件將沒法安裝或覆蓋老的版本。算法
簽名有不少種方式,常見的有:微信
一、 在Eclipse下經過插件獲取數字證書,並簽名你的應用。less
打開Eclipse->選擇你要簽名的項目->右擊->android tools->Export signedApplication package,再進行相關操做。這裏首先須要建立數字證書,而後再利用數字證書籤名你的應用。工具
運氣好時,你會發現簽名失敗,卻怎麼也找不到緣由。本人以前就遇到過這種狀況,也困惑過很久,最終才發現是插件出問題了,抓狂。那你不妨使用下面一種方法。開發工具
二、 用KeyTool產生數字證書文件,再簽名你的應用。測試
命令:優化
keytool -genkey -v -keystore D:\Users\Administrator\Desktop\mytest.keystore-alias mytest -keyalg RSA -validity 20000
其中參數含義以下:spa
-keystore D:\Users\Administrator\Desktop\mytest.keystore表示生成的證書及其存放路徑,默認在用戶主目錄下; -alias mytest 表示證書的別名是mytest; -keyalg RSA 表示採用的RSA算法; -validity 20000表示證書的有效期是20000天。
這樣你就會在相應目錄下得到所需的數字證書,如上圖所示。
獲取到數字證書以後,你就能夠用數字證書去簽名你的應用,簽名步驟以下:
右擊工程 --> 選擇Android Tools --> Export Signed Application Package --> 選擇next --> 選擇Use existing keystore,並填寫數字證書位置,以及密碼,再next --> using existing key,選擇alias,以及密碼,再next --> 選擇程序存放位置後完成。
有時你可能還須要獲得證書指紋(MD5和SHA1)。
一、獲取證書指紋(MD5)命令:
keytool -list -alias mytest -keystore D:\Users\Administrator\Desktop\mytest.keystore
二、獲取證書指紋(SHA1)命令:
keytool -list -v -alias mytest -keystore D:\Users\Administrator\Desktop\mytest.keystore
三、這兩條命令只是參數不一樣,你也能夠同時獲取證書指紋(MD5和SHA1),固然-alias後面的別名必定要跟前面的對應。命令以下圖所示:
在Android系統中,全部安裝到系統的應用程序都必有一個數字證書,此數字證書用於標識應用程序的做者和在應用程序之間創建信任關係,不是用來決定最終用戶能夠安裝哪些應用程序,數字證書的私鑰則保存在程序開發者的手中。這個數字證書並不須要權威的數字證書籤名機構認證,它只是用來讓應用程序包自我認證的。若是一個permission的protectionLevel爲signature,那麼就只有那些跟permission所在的程序擁有同一個數字證書的應用程序才能取得該權限。
Android使用Java的數字證書相關的機制來給apk加蓋數字證書,要理解android的數字證書,須要先了解如下數字證書的概念和java的數字證書機制。Android系統要求每個安裝進系 統的應用程序都是通過數字證書籤名的, Android將數字證書用來標識應用程序的做者和在應用程序之間創建信任關係。
(1)全部的應用程序都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程序。
(2)Android程序包使用的數字證書能夠是自簽名的,不須要一個權威的數字證書機構簽名認證。
(3)若是要正式發佈一個Android,必須使用一個合適的私鑰生成的數字證書來給程序簽名 ,而不能使用adt插件或者ant工具生成的調試證書來發布。
Android的開發工具(ADT插件和Ant)均可以協助開發者給apk程序簽名,它們都有兩種模式:調試模式(debug mode)和發佈模式(release mode)。在調試模式下,android的開發工具會在每次編譯時使用調試用的數字證書(default.keystore)給程序簽名,開發者無須關心。當要發佈程序時,開發者就須要使用本身的數字證書給apk包簽名。所以,當咱們在開發微信分享功能時候,須要使用發佈模式。若是不使用本身生成的數字證書,你將只能在第一次分享成功,之後就一直調不出分享的界面。
(4)數字證書都是有有效期的,Android只是在應用程序安裝的時候纔會檢查證書的有效期。若是程序已經安裝在系統中,即便證書過時也不會影響程序的正常功能。Android Market強制要求全部應用程序數字證書的有效期要持續到2033年10月22日之後。
(5)Android使用標準的java工具Keytool和Jarsigner來生成數字證書,並給應用程序包簽名。
(6)使用zipalign優化程序。
下面是我本身測試的結果,跟網上的一些資料有些出入,我的認爲包主要判斷是否屬於同一應用,而後簽名用來判斷程序所屬者,判斷是否屬於不一樣版本。有任何問題,歡迎輕拍。
一、包名相同,簽名相同:安裝時可覆蓋安裝(就是同一程序同一版本)。
二、包名相同,簽名不一樣:Android認爲版本發生了變化,需先卸載再安裝(同一程序不一樣版本)。
三、包名不一樣,簽名相同:正常安裝。
四、包名不一樣,簽名不一樣:正常安裝。
程序覆蓋安裝檢查:
(1)、兩個程序的入口Activity是否相同。兩個程序若是包名不同,即便其它全部代碼徹底同樣,也不會被視爲同一個程序的不一樣版本;
(2)、兩個程序所採用的簽名是否相同。若是兩個程序所採用的簽名不一樣,即便包名相同,也不會被視爲同一個程序的不一樣版本,不能覆蓋安裝。
總結一下就是:簽名、包名相同,需覆蓋安裝。
這裏有一個很簡單的例子:當咱們在公司開發時,在本身電腦上調試的手機,屢次調試時不須要卸載(此時是覆蓋安裝)。而當其餘人拿了這個手機去他電腦上調試時,就須要先卸載該程序(必須卸載安裝)。當你之前的程序是採用默認簽名的方式(即debug簽名),一旦換了新的簽名應用將不能覆蓋安裝,必須將原先的程序卸載掉,才能安裝上。
所以使用debug簽名的應用:沒法在Android市場銷售;並且,不一樣機器生成的debug密鑰不一樣,不利apk升級和維護;debug簽名有一年有效期。使用獨立簽名的應用:可在Android市場銷售,簽名固定會更加便利apk升級和維護。
參考資料:
http://blog.csdn.net/wirelessqa/article/details/7651613
http://blog.csdn.net/lyq8479/article/details/6401093
http://blog.csdn.net/wenlin56/article/details/8153301
本文轉自:http://blog.csdn.net/qianfu111/article/details/9113887