新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Android簽名詳解(debug和release)

Android簽名詳解(debug和release)

作者: 時(shí)間:2016-09-12 來(lái)源:網(wǎng)絡(luò) 收藏

1. 為什么要簽名

本文引用地址:http://m.butianyuan.cn/article/201609/304715.htm

1) 發(fā)送者的身份認(rèn)證

由于開發(fā)商可能通過(guò)使用相同的Package Name來(lái)混淆替換已經(jīng)安裝的程序,以此保證簽名不同的包不被替換

2) 保證信息傳輸?shù)耐暾?/p>

簽名對(duì)于包中的每個(gè)文件進(jìn)行處理,以此確保包中內(nèi)容不被替換

3) 防止交易中的抵賴發(fā)生,Market對(duì)軟件的要求

2. 簽名的說(shuō)明

1) 所有的應(yīng)用程序都必須有數(shù)字證書,Android系統(tǒng)不會(huì)安裝一個(gè)沒(méi)有數(shù)字證書的應(yīng)用程序

2) Android程序包使用的數(shù)字證書可以是自簽名的,不需要一個(gè)權(quán)威的數(shù)字證書機(jī)構(gòu)簽名認(rèn)證

3) 如果要正式發(fā)布一個(gè)Android應(yīng)用,必須使用一個(gè)合適的私鑰生成的數(shù)字證書來(lái)給程序簽名,而不能使用adt插件或者ant工具生成的調(diào)試證書來(lái)發(fā)布

4) 數(shù)字證書都是有有效期的,Android只是在應(yīng)用程序安裝的時(shí)候才會(huì)檢查證書的有效期。如果程序已經(jīng)安裝在系統(tǒng)中,即使證書過(guò)期也不會(huì)影響程序的正常功能

5) 簽名后需使用zipalign優(yōu)化程序

6) Android將數(shù)字證書用來(lái)標(biāo)識(shí)應(yīng)用程序的作者和在應(yīng)用程序之間建立信任關(guān)系,而不是用來(lái)決定最終用戶可以安裝哪些應(yīng)用程序

3. 簽名的方法

有三種打包方式:命令行手動(dòng)打包、ant自動(dòng)編譯打包、eclipse+ADT編譯打包,打包步驟如下:

第一步 生成R.java類文件:

Eclipse中會(huì)自動(dòng)生成R.java,ant和命令行使用android SDK提供的aapt.ext程序生成R.java。

第二步 將.aidl文件生成.java類文件:

Eclipse中自動(dòng)生成,ant和命令行使用android SDK提供的aidl.exe生成.java文件。

第三步 編譯.java類文件生成class文件:

Eclipse中自動(dòng)生成,ant和命令行使用jdk的javac編譯java類文件生成class文件。

第四步 將class文件打包生成classes.dex文件:

Eclipse中自動(dòng)生成,ant和命令行使用android SDK提供的dx.bat命令行腳本生成classes.dex文件。

第五步 打包資源文件(包括res、assets、androidmanifest.xml等):

Eclipse中自動(dòng)生成,ant和命令行使用Android SDK提供的aapt.exe生成資源包文件。

第六步 生成未簽名的apk安裝文件:

Eclipse中自動(dòng)生成debug簽名文件存放在bin目錄中,ant和命令行使用android SDK提供的apkbuilder.bat命令腳本生成未簽名的apk安裝文件。

第七步 對(duì)未簽名的apk進(jìn)行簽名生成簽名后的android文件:

Eclipse中使用Android Tools進(jìn)行簽名,ant和命令行使用jdk的jarsigner對(duì)未簽名的包進(jìn)行apk簽名。

3.1 用eclipse+ADT方式簽名

詳見:http://jojol-zhou.iteye.com/blog/719428

a) 調(diào)試簽名

eclipse插件默認(rèn)賦予程序一個(gè)DEBUG權(quán)限的簽名,此簽名的程序不能發(fā)布到market上,此簽名有效期為一年,如果過(guò)期則導(dǎo)致你無(wú)法生成apk文件,此時(shí)你只要?jiǎng)h除debug keystore即可,系統(tǒng)又會(huì)為你生成有效期為一年的新簽名

b) 開發(fā)者生成密鑰并簽名

右鍵點(diǎn)擊項(xiàng)目名,在菜單中選擇Android Tools,然后選擇Export Signed Application Package,即可通過(guò)eclipse自定義證書并簽名

c) 開發(fā)者導(dǎo)出未簽名的包

右鍵點(diǎn)擊項(xiàng)目名,在菜單中選擇Android Tools,然后選擇Export Signed Application Package…,即可導(dǎo)出未簽名的包,之后可通過(guò)命令行方式簽名

3.2 用命令行方式簽名

使用標(biāo)準(zhǔn)的java工具keytool和jarsigner來(lái)生成證書和給程序簽名。

詳見:http://jojol-zhou.iteye.com/blog/729254

a) 生成簽名

$ keytool -genkey -keystore keyfile -keyalg RSA -validity 10000 -alias yan

注:validity為天數(shù),keyfile為生成key存放的文件,yan為私鑰,RSA為指定的加密算法(可用RSA或DSA)

b) 為apk文件簽名

$ jarsigner -verbose -keystore keyfile -signedjar signed.apk base.apk yan

注:keyfile為生成key存放的文件,signed.apk為簽名后的apk,base.apk 為未簽名的apk,yan為私鑰

c) 看某個(gè)apk是否經(jīng)過(guò)了簽名

$ jarsigner -verify my_application.apk

d) 優(yōu)化(簽名后需要做對(duì)齊優(yōu)化處理)

$ zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk

3.3 在源碼中編譯的簽名

a) 使用源碼中的默認(rèn)簽名

在源碼中編譯一般都使用默認(rèn)簽名的,在某源碼目錄中用運(yùn)行

$ mm showcommands能看到簽名命令

Android提供了簽名的程序signapk.jar,用法如下:

$ signapk publickey.x509[.pem] privatekey.pk8 input.jar output.jar

*.x509.pem為x509格式公鑰,pk8為私鑰

build/target/product/security目錄中有四組默認(rèn)簽名可選:testkey platform shared media(具體見README.txt),應(yīng)用程序中Android.mk中有一個(gè)LOCAL_CERTIFICATE字段,由它指定用哪個(gè)key簽名,未指定的默認(rèn)用testkey.

b) 在源碼中自簽名

Android提供了一個(gè)腳本mkkey.sh(build/target/product/security/mkkey.sh),用于生成密鑰,生成后在應(yīng)用程序中通過(guò)Android.mk中的LOCAL_CERTIFICATE字段指名用哪個(gè)簽名

c) mkkey.sh介紹

i. 生成公鑰

openssl genrsa -3 -out testkey.pem 2048

其中-3是算法的參數(shù),2048是密鑰長(zhǎng)度,testkey.pem是輸出的文件

ii. 轉(zhuǎn)成x509格式(含作者有效期等)

openssl req -new -x509 -key testkey.pem -out testkey.x509.pem -days 10000 -subj ‘/C=US/ST=California/L=MountainView/O=Android/OU=Android/CN=Android/emailAddress=android@android.com’

iii. 生成私鑰

openssl pkcs8 -in testkey.pem -topk8 -outform DER -out testkey.pk8 -nocrypt

把的格式轉(zhuǎn)換成PKCS #8,這里指定了-nocryp,表示不加密,所以簽名時(shí)不用輸入密碼


上一頁(yè) 1 2 3 下一頁(yè)

關(guān)鍵詞:

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉