新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Android簽名詳解(debug和release)

        Android簽名詳解(debug和release)

        作者: 時間:2016-09-12 來源:網絡 收藏

        1. 為什么要簽名

        本文引用地址:http://www.104case.com/article/201609/304715.htm

        1) 發送者的身份認證

        由于開發商可能通過使用相同的Package Name來混淆替換已經安裝的程序,以此保證簽名不同的包不被替換

        2) 保證信息傳輸的完整性

        簽名對于包中的每個文件進行處理,以此確保包中內容不被替換

        3) 防止交易中的抵賴發生,Market對軟件的要求

        2. 簽名的說明

        1) 所有的應用程序都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程序

        2) Android程序包使用的數字證書可以是自簽名的,不需要一個權威的數字證書機構簽名認證

        3) 如果要正式發布一個Android應用,必須使用一個合適的私鑰生成的數字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調試證書來發布

        4) 數字證書都是有有效期的,Android只是在應用程序安裝的時候才會檢查證書的有效期。如果程序已經安裝在系統中,即使證書過期也不會影響程序的正常功能

        5) 簽名后需使用zipalign優化程序

        6) Android將數字證書用來標識應用程序的作者和在應用程序之間建立信任關系,而不是用來決定最終用戶可以安裝哪些應用程序

        3. 簽名的方法

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

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

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

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

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

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

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

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

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

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

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

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

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

        第七步 對未簽名的apk進行簽名生成簽名后的android文件:

        Eclipse中使用Android Tools進行簽名,ant和命令行使用jdk的jarsigner對未簽名的包進行apk簽名。

        3.1 用eclipse+ADT方式簽名

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

        a) 調試簽名

        eclipse插件默認賦予程序一個DEBUG權限的簽名,此簽名的程序不能發布到market上,此簽名有效期為一年,如果過期則導致你無法生成apk文件,此時你只要刪除debug keystore即可,系統又會為你生成有效期為一年的新簽名

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

        右鍵點擊項目名,在菜單中選擇Android Tools,然后選擇Export Signed Application Package,即可通過eclipse自定義證書并簽名

        c) 開發者導出未簽名的包

        右鍵點擊項目名,在菜單中選擇Android Tools,然后選擇Export Signed Application Package…,即可導出未簽名的包,之后可通過命令行方式簽名

        3.2 用命令行方式簽名

        使用標準的java工具keytool和jarsigner來生成證書和給程序簽名。

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

        a) 生成簽名

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

        注:validity為天數,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) 看某個apk是否經過了簽名

        $ jarsigner -verify my_application.apk

        d) 優化(簽名后需要做對齊優化處理)

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

        3.3 在源碼中編譯的簽名

        a) 使用源碼中的默認簽名

        在源碼中編譯一般都使用默認簽名的,在某源碼目錄中用運行

        $ mm showcommands能看到簽名命令

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

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

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

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

        b) 在源碼中自簽名

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

        c) mkkey.sh介紹

        i. 生成公鑰

        openssl genrsa -3 -out testkey.pem 2048

        其中-3是算法的參數,2048是密鑰長度,testkey.pem是輸出的文件

        ii. 轉成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

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


        上一頁 1 2 3 下一頁

        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 静宁县| 兰考县| 琼结县| 中牟县| 内乡县| 龙海市| 合川市| 万载县| 昭通市| 广平县| 江西省| 龙口市| 永川市| 华容县| 简阳市| 凭祥市| 佛冈县| 枣阳市| 孝感市| 闽侯县| 霍州市| 改则县| 南乐县| 建湖县| 寿阳县| 宣化县| 富蕴县| 安乡县| 沁源县| 隆安县| 宁城县| 徐闻县| 长岭县| 衡南县| 吉隆县| 额敏县| 娱乐| 汾西县| 沈阳市| 岳西县| 大冶市|