Android 簽名詳解
在Android 系統(tǒng)中,所有安裝 到 系統(tǒng)的應(yīng)用程序都必有一個(gè)數(shù)字證書(shū),此數(shù)字證書(shū)用于標(biāo)識(shí)應(yīng)用程序的作者和在應(yīng)用程序之間建立信任關(guān)系,如果一個(gè) permission的protectionLevel為signature,那么就只有那些跟該permission所在的程序擁有同一個(gè)數(shù)字證書(shū)的應(yīng) 用程序才能取得該權(quán)限。Android使用Java的數(shù)字證書(shū)相關(guān)的機(jī)制來(lái) 給apk加蓋數(shù)字證書(shū),要理解android的數(shù)字證書(shū),需要先了解以下數(shù)字證書(shū)的概念和java的數(shù)字證書(shū)機(jī)制。Android系統(tǒng)要求每一個(gè)安裝進(jìn)系 統(tǒng)的應(yīng)用程序都是經(jīng)過(guò)數(shù)字證書(shū)簽名的,數(shù)字證書(shū)的私鑰則保存在程序開(kāi)發(fā)者的手中。Android將數(shù)字證書(shū)用來(lái)標(biāo)識(shí)應(yīng)用程序的作者和在應(yīng)用程序之間建立信 任關(guān)系,不是用來(lái)決定最終用戶(hù)可以安裝哪些應(yīng)用程序。這個(gè)數(shù)字證書(shū)并不需要權(quán)威的數(shù)字證書(shū)簽名機(jī)構(gòu)認(rèn)證,它只是用來(lái)讓?xiě)?yīng)用程序包自我認(rèn)證的。
一:同一個(gè)開(kāi)發(fā)者的多個(gè)程序盡可能使用同一個(gè)數(shù)字證書(shū) ,這可以帶來(lái)以下好處。
(1)有利于程序升級(jí),當(dāng)新版程序和舊版程序的數(shù)字證書(shū)相同時(shí),Android系統(tǒng)才會(huì)認(rèn)為這兩個(gè)程序是同一個(gè)程序的不同版本。如果新版程序和舊版程序的數(shù)字證書(shū)不相同,則Android系統(tǒng)認(rèn)為他們是不同的程序,并產(chǎn)生沖突,會(huì)要求新程序更改包名。
(2)有利于程序的模塊化設(shè)計(jì)和開(kāi)發(fā)。Android系統(tǒng)允許擁有同一個(gè)數(shù)字簽名的程序運(yùn)行在一個(gè)進(jìn)程中,Android程序會(huì)將他們視為同一個(gè)程序。所以開(kāi)發(fā)者可以將自己的程序分模塊開(kāi)發(fā),而用戶(hù)只需要在需要的時(shí)候下載適當(dāng)?shù)哪K。
(3) 可以通過(guò)權(quán)限(permission)的方式在多個(gè)程序間共享數(shù)據(jù)和代碼。Android提供了基于數(shù)字證書(shū)的權(quán)限賦予機(jī)制,應(yīng)用程序可以和其他的程序共 享概功能或者數(shù)據(jù)給那那些與自己擁有相同數(shù)字證書(shū)的程序。如果某個(gè)權(quán)限(permission)的protectionLevel是signature, 則這個(gè)權(quán)限就只能授予那些跟該權(quán)限所在的包擁有同一個(gè)數(shù)字證書(shū)的程序。
在簽名時(shí),需要考慮數(shù)字證書(shū)的有效期 :
(1)數(shù)字證書(shū)的有效期要包含程序的預(yù)計(jì)生命周期,一旦數(shù)字證書(shū)失效,持有改數(shù)字證書(shū)的程序?qū)⒉荒苷I?jí)。
(2)如果多個(gè)程序使用同一個(gè)數(shù)字證書(shū),則該數(shù)字證書(shū)的有效期要包含所有程序的預(yù)計(jì)生命周期。
(3)Android Market強(qiáng)制要求所有應(yīng)用程序數(shù)字證書(shū)的有效期要持續(xù)到2033年10月22日以后。
二:Android數(shù)字證書(shū)包含以下幾個(gè)要點(diǎn):
(1)所有的應(yīng)用程序都必須有數(shù)字證書(shū) ,Android系統(tǒng)不會(huì)安裝一個(gè)沒(méi)有數(shù)字證書(shū)的應(yīng)用程序
(2)Android程序包使用的數(shù)字證書(shū)可以是自簽名的,不需要一個(gè)權(quán)威的數(shù)字證書(shū)機(jī)構(gòu)簽名認(rèn)證
(3)如果要正式發(fā)布 一個(gè)Android ,必須使用一個(gè)合適的私鑰生成的數(shù)字證書(shū)來(lái)給程序簽名 ,而不能使用adt插件 或者ant工具 生成的調(diào)試證書(shū)來(lái)發(fā)布。
(4)數(shù)字證書(shū)都是有有效期 的,Android只是在應(yīng)用程序安裝的時(shí)候才會(huì)檢查證書(shū)的有效期。如果程序已經(jīng)安裝在系統(tǒng)中,即使證書(shū)過(guò)期也不會(huì)影響程序的正常功能。
(***ndroid使用標(biāo)準(zhǔn)的java工具 Keytool and Jarsigner 來(lái)生成數(shù)字證書(shū),并給應(yīng)用程序包簽名。
(6)使用zipalign 優(yōu)化 程序。
Android 系統(tǒng)不會(huì)安裝運(yùn)行任何一款未經(jīng)數(shù)字簽名的apk程序,無(wú)論是在模擬器上還是在實(shí)際的物理設(shè)備上。Android的開(kāi)發(fā)工具(ADT插件和Ant)都可以協(xié) 助開(kāi)發(fā)者給apk程序簽名,它們都有兩種模式:調(diào)試模式(debug mode)和發(fā)布模式(release mode)。
在調(diào)試模式下,android的開(kāi)發(fā)工具會(huì)在每次編譯時(shí)使用調(diào)試用的數(shù)字證書(shū)給程序簽名,開(kāi)發(fā)者無(wú)須關(guān)心。
當(dāng)要發(fā)布程序時(shí),開(kāi)發(fā)者就需要使用自己的數(shù)字證書(shū)給apk包簽名,可以有兩種方法。
(1)在命令行下使用JDK中的和Keytool(用于生成數(shù)字證書(shū))和Jarsigner(用于使用數(shù)字證書(shū)簽名)來(lái)給apk包簽名。
(2)使用ADT Export Wizard進(jìn)行簽名(如果沒(méi)有數(shù)字證書(shū)可能需要生成數(shù)字證書(shū))。
三;兩種簽名方式
***種簽名方式, 使用Keytool和Jarsigner給程序簽名( 用于1.5以下版本 )
命令:keytool -genkey -v -keystore android.keystore -alias android -keyalg RSA -validity 20000
該 命令中,-keystore ophone.keystore 表示生成的證書(shū),可以加上路徑(默認(rèn)在用戶(hù)主目錄下);-alias ophone 表示證書(shū)的別名是ophone;-keyalg RSA 表示采用的RSA算法;-validity 20000表示證書(shū)的有效期是20000天。
此時(shí),我們會(huì)在互用主目錄下看到ophone.keystore,即我們剛剛創(chuàng)建的證書(shū)。
第二種簽名方式:現(xiàn)在介紹android 1.5及更新版本的apk簽名方式
1,打開(kāi)Eclipse->選擇你要簽名的項(xiàng)目->右擊->android tools->Export signed Application package...
2,跳出窗口
3,project checks 如果核對(duì)項(xiàng)目名沒(méi)有問(wèn)題的話(huà) 點(diǎn)擊 Next
然后跳出keystore selection 如果是已經(jīng)存在keystore的文件就選擇然后next 輸入keystore的密碼進(jìn)行簽名。
如果沒(méi)有的話(huà)選擇 create new keystore 然后選擇 keystore 保存的位置,設(shè)置keystore的密碼,點(diǎn)擊Next。
4.填寫(xiě)keystore的基本信息,如,別名,密碼,有效期,姓名,組織,組織名稱(chēng),所在城市,所在省份,國(guó)家等,點(diǎn)擊Next
5.選擇被簽名后的APK保存位置。點(diǎn)擊finish。
6.就可以在你保存的位置中找到相應(yīng)的被簽名后的APK文件。





























