請(qǐng)問(wèn)APP應(yīng)用做好了怎么申請(qǐng)證書(shū)發(fā)布到APP去?
Android系統(tǒng)要求,所有的程序經(jīng)過(guò)數(shù)字簽名后才能安裝。Android系統(tǒng)使用這個(gè)證書(shū)來(lái)識(shí)別應(yīng)用程序的作者,并且建立程序間的信任關(guān)系。證書(shū)不是用于用戶控制哪些程序可以安裝。證書(shū)不需要授權(quán)中心來(lái)簽名:Android應(yīng)用程序上使用自己簽名的證書(shū)是完全允許且普遍的。 理解Android應(yīng)用程序簽名有以下幾個(gè)重要點(diǎn): ·所有的應(yīng)用程序都必須簽名。系統(tǒng)不會(huì)安裝任何一個(gè)不簽名的程序。 ·你可以使用自己的證書(shū)來(lái)簽名。不需要任何授權(quán)中心。 ·當(dāng)你要為最終用戶發(fā)布你的應(yīng)用程序的時(shí)候,你必須簽入一個(gè)合適的密鑰。你不可以發(fā)布程序的時(shí)候還使用SDK工具簽入的DebugKey。 ·系統(tǒng)只在安裝應(yīng)用程序的時(shí)候檢測(cè)證書(shū)的有效期。如果應(yīng)用程序在安裝之后證書(shū)失效了,那么,應(yīng)用程序還是可以正常工作。 ·你可以使用標(biāo)準(zhǔn)工具——Keytool和Jarsigner——生成Key并簽名APK文件。 ·一旦你為應(yīng)用程序簽名了,一定要使用zipalign工具來(lái)優(yōu)化最終的APK包。 Android系統(tǒng)不會(huì)安裝和運(yùn)行沒(méi)有正確簽名的應(yīng)用程序。這條規(guī)則適用于任何運(yùn)行Android系統(tǒng)的地方,不管是真機(jī)還是模擬器。正是由于這個(gè)原因,你必須在模擬器或真機(jī)上運(yùn)行/調(diào)試程序之前對(duì)程序進(jìn)行簽名。 當(dāng)你調(diào)試應(yīng)用程序時(shí),AndroidSDK工具替你對(duì)應(yīng)用程序進(jìn)行了簽名。Eclipse的ADT插件和Ant編譯工具都提供了兩種簽名模式——Debug模式和Release模式。 ·當(dāng)開(kāi)發(fā)和測(cè)試時(shí),你可以使用Debug模式。在Debug模式下,編譯工具使用內(nèi)嵌在JDK中的Keytool工具來(lái)創(chuàng)建一個(gè)keystore和一個(gè)key(包含公認(rèn)的名字和密碼)。在每次編譯的時(shí)候,使用這個(gè)DebugKey來(lái)為apk文件簽名。由于密碼是公認(rèn)的,在每次編譯的時(shí)候,也不需要提示你輸入keystore和key密碼。 ·當(dāng)你的程序準(zhǔn)備發(fā)布時(shí),你必須在Release模式下,使用密鑰來(lái)為apk文件簽名。有以下兩種方式可以做到: 1.命令行中使用Keytool和Jarsigner。在這個(gè)方法中,首先需要編譯出一個(gè)未簽名的apk。然后使用Jarsigner(或相似的工具),用你的密鑰為apk手動(dòng)簽名。如果你沒(méi)有合適的密鑰,你可以運(yùn)行Keytool來(lái)手動(dòng)生成自己的keystore/key。 2.使用ADT導(dǎo)出向?qū)АH绻闶褂肊clipse/ADT插件進(jìn)行開(kāi)發(fā),你可以使用導(dǎo)出向?qū)?lái)編譯程序,生成密鑰(如果需要),并為apk簽名,所有這些操作都在導(dǎo)出向?qū)е小R坏┠愕某绦蚝灻耍瑒e忘了運(yùn)行zipalign來(lái)為apk進(jìn)行額外的優(yōu)化。 簽名策略 應(yīng)用程序簽名的某些方面可能會(huì)影響應(yīng)用程序的開(kāi)發(fā),特別是你打算一起發(fā)布多個(gè)應(yīng)用程序的時(shí)候。一般來(lái)說(shuō),推薦的策略是在整個(gè)應(yīng)用程序壽命內(nèi),所有的程序簽上相同的證書(shū)。 以下有幾個(gè)應(yīng)該這么做的原因: ·應(yīng)用程序升級(jí)——當(dāng)你對(duì)應(yīng)用程序進(jìn)行升級(jí)時(shí),如果你想用戶平穩(wěn)的升級(jí),那么,你就需要簽上相同的證書(shū)。當(dāng)系統(tǒng)安裝一個(gè)升級(jí)應(yīng)用程序時(shí),如果新版本的證書(shū)與老版本的證書(shū)有匹配的話,那么,系統(tǒng)才會(huì)允許進(jìn)行升級(jí)。如果你沒(méi)有為版本簽上合適的證書(shū),當(dāng)你安裝時(shí),你需要給應(yīng)用程序指定一個(gè)新的包名——在這種情況下,用戶安裝的新版本,被當(dāng)作是一個(gè)全新的應(yīng)用程序。 ·應(yīng)用程序模塊化——如果應(yīng)用程序請(qǐng)求的話,Android系統(tǒng)允許簽有相同證書(shū)的應(yīng)用程序運(yùn)行在相同的進(jìn)程里,這樣,系統(tǒng)就會(huì)把它們看作是一個(gè)單一的應(yīng)用程序。用這種方法配置應(yīng)用程序,用戶可以選擇更新每個(gè)獨(dú)立的模塊。 ·代碼/數(shù)據(jù)權(quán)限共享——Android系統(tǒng)提供了基于簽名的權(quán)限檢查,因此,如果應(yīng)用程序間簽有特定的證書(shū),那么,它們之間可以共享功能。通過(guò)多個(gè)程序簽有相同的證書(shū)并且使用基于簽名的權(quán)限檢查,你的程序可以以一種安全的方式共享代碼和數(shù)據(jù)。還有一個(gè)決定簽名策略的重要因素是:如何設(shè)定key的有效期。 ·如果你計(jì)劃支持單個(gè)應(yīng)用程序的升級(jí),你需要確保你的key擁有一個(gè)超過(guò)期望的應(yīng)用程序生命周期的有效期。推薦使用25年或更多的有效期。當(dāng)你的key過(guò)期了,用戶也就不能平穩(wěn)的更新到新版本了。 ·如果你想給多個(gè)無(wú)關(guān)的應(yīng)用程序簽上相同的key,那么,你必須確保key的有效期超過(guò)所有應(yīng)用程序所有版本的生命周期,包括將來(lái)有可能添加到這一陣營(yíng)的程序。 ·如果你想在AndroidMarket上發(fā)布你的程序,key的有效期必須在2033.10.22以后。Market服務(wù)器強(qiáng)制這一要求,目前是保證用戶可以平穩(wěn)的更新他們的程序。 當(dāng)你設(shè)計(jì)應(yīng)用程序時(shí),一定要把這些點(diǎn)記在腦子里,并且使用一個(gè)合適的證書(shū)來(lái)為應(yīng)用程序簽名。 簽名的基本設(shè)定 在你開(kāi)始之前,你必須保證Keytool對(duì)SDK編譯工具來(lái)說(shuō)是可利用的。多數(shù)情況下,你可以通過(guò)設(shè)置JAVA_HOME環(huán)境變量來(lái)告訴SDK編譯工具如何找到Keytool。另外,你還可以添加JDK中Keytool的路徑到PATH的變量里。 如果你在Linux上開(kāi)發(fā),并且使用GNU編譯器來(lái)編譯Java,那么,請(qǐng)確保系統(tǒng)是使用JDK中的Keytool,而不是gcj。如果Keytool已經(jīng)在你的PATH中,它有可能是對(duì)/usr/bin/keytool的符號(hào)鏈接。在這種情況下,檢查符號(hào)鏈接的目標(biāo),確保它是指向JDK中的Keytool。如果你打算對(duì)公眾釋放你的應(yīng)用程序,你還需要Jarsigner工具。Jarsigner和Keytool都包含在JDK中。 Debug模式下簽名 Android編譯工具提供了Debug簽名模式,使得開(kāi)發(fā)和調(diào)試應(yīng)用程序更加容易,而且還滿足Android系統(tǒng)的簽名要求。當(dāng)使用Debug模式編譯你的app時(shí),SDK工具會(huì)調(diào)用Keytool工具自動(dòng)創(chuàng)建一個(gè)Debug的keystore和key。然后,這個(gè)Debugkey會(huì)自動(dòng)用于apk的簽名,這樣,你不需要使用你自己的key來(lái)為應(yīng)用程序包簽名。 SDK工具使用預(yù)先定義好的名字/密碼來(lái)創(chuàng)建Debugkeystore/key: ·Keystore名字:“debug.keysotre” ·Keystore密碼:“android” ·Key別名:“androiddebugkey” ·Key密碼:“android” ·CN:“CN=AndroidDebug,O=Android,C=US” 如果需要的話,你可以改變Debugkeystore/key的位置和名字,或者提供一個(gè)自定義的Debugkeysotre/key。然而,任何自定義的Debugkeystore/key必須使用和默認(rèn)Debugkey(上面描述的)相同的名字和密碼。(在Eclipse/ADT中,操作Windows>Preferences>Android>Build實(shí)現(xiàn)。) 注意:你不能將簽有Debug證書(shū)的應(yīng)用程序發(fā)布給公眾。 Eclipse用戶 如果你在Eclipse/ADT下開(kāi)發(fā)(并且已經(jīng)按照上面描述的“簽名的基本設(shè)定”配置了Keytool),Debug模式下簽名默認(rèn)是開(kāi)啟的。當(dāng)你運(yùn)行或是調(diào)試應(yīng)用程序時(shí),ADT會(huì)使用Debug證書(shū)進(jìn)行簽名,并運(yùn)行zipalign,然后安裝到選擇的模擬器或是連接上的設(shè)備。整個(gè)過(guò)程不需要你參與,前提是ADT能訪問(wèn)Keytool。 Ant用戶 如果你使用Ant來(lái)編譯你的apk文件,需要在ant命令中添加debug選項(xiàng)來(lái)開(kāi)啟Debug簽名模式(假設(shè)你正在使用由android工具生成build.xml文件)。當(dāng)你運(yùn)行antdebug來(lái)編譯你的程序時(shí),編譯腳本會(huì)生成一個(gè)keystore/key,并為apk進(jìn)行簽名。然后腳本會(huì)使用zipalign工具對(duì)apk進(jìn)行對(duì)齊處理。整個(gè)過(guò)程不需要你參與。閱讀“其它IDE下開(kāi)發(fā):Debug模式編譯”來(lái)了解更多的信息。 Debug證書(shū)過(guò)期 Debug模式下簽名用的證書(shū)(默認(rèn)是Eclipse/ADT和Ant編譯)自從它創(chuàng)建之日起,1年后就會(huì)失效。 當(dāng)證書(shū)失效時(shí),你會(huì)得到一個(gè)編譯錯(cuò)誤,在Ant編譯上, 錯(cuò)誤如下: debug: [echo]Packagingbin/samples-debug.apk,andsigningitwithadebugkey... [exec]DebugCertificateexpiredon8/4/083:43PM 在Eclipse/ADT中,Android控制臺(tái)上你將會(huì)看到一個(gè)相似的錯(cuò)誤。 為了解決這個(gè)問(wèn)題,只需要?jiǎng)h掉debug.keystore文件即可。AVD默認(rèn)存儲(chǔ)的位置在:~/.android/avd(OSX和Linux),C:DocumentsandSettings\.android(WindowsXP),C:Users\.android(WindowsVista)。 當(dāng)下一次編譯的時(shí)候,編譯工具會(huì)重新生成一個(gè)新的keystore和Debugkey。 Release模式下簽名 當(dāng)你的程序準(zhǔn)備好釋放給其它用戶時(shí),你必須: 1.獲取一個(gè)合適的密鑰 2.在Release模式下編譯程序 3.使用密鑰簽名程序 4.對(duì)齊APK包 如果你是使用Eclipse/ADT插件開(kāi)發(fā),你可以使用導(dǎo)出向?qū)?lái)完成編譯、簽名和對(duì)齊等操作。在整個(gè)過(guò)程中,導(dǎo)出向?qū)踔吝€可以生成一個(gè)新的keystore和密鑰。因此,如果你使用Eclipse,你可以直接跳到“使用EclipseADT編譯和簽名”。 獲取一個(gè)合適的密鑰為了進(jìn)行程序的簽名,首先,你必須有一個(gè)合適的密鑰。密鑰指: ·個(gè)人持有。 ·代表個(gè)人、公司或組織實(shí)體的身份。 ·擁有一個(gè)有效期。有效期推薦超過(guò)25年。 如果你在AndroidMarket上發(fā)布你的程序,需要注意一點(diǎn)的是:程序的有效期需要在2033.10.22之后。你不能上傳一個(gè)應(yīng)用程序,而它的key的有效期是在這個(gè)日期之前。 ·不是由AndroidSDK工具生成的Debugkey。 如果你沒(méi)有一個(gè)合適的key,你一定要使用Keytool來(lái)生成一個(gè)。如“基本設(shè)定”中描述的,確保Keytool可用。 為了用Keytool生成一個(gè)key,使用keytool命令并傳入一些可選參數(shù),如下表所示。 警告:確保密鑰的安全。一定要閱讀“安全儲(chǔ)存你的密鑰”中討論如何確保你的密鑰的安全以及這對(duì)你和用戶為何如此重要。尤其是,當(dāng)你生成你的密鑰時(shí),一定要為keystore和key使用強(qiáng)密碼。