MM線下打包遇到的問題總結,以及安卓破包重新簽名

 

MM線下打包遇到的問題總結,以及安卓破包重新簽名

分類: 安卓開發問題 11人閱讀 評論(0) 收藏 舉報



第二篇文章

在進行移動MM集成的時候總是會遇到一個bug:  failed to find resource file(mmiap.xml}

原因是:爲Unity打包的時候和原生Android工程不一樣,打包好了之後,找不到mmiap.xml
解決方法如下:
1.使用Unity打包好後。
2.使用apkTool解包
3.使用apkTool再打包
注:上述解包和打包的目的是爲了去除簽名。
4.使用aapt工具將
VERSON,mmiap.xml,CopyrightDeclaration.xml打包進apk
5.使用jarsigner工具將apk使用原來的keystore進行簽名,否則像微信這種依賴keystore的分享功能就不能使用
具體步驟如下:
1.apktool d xxx.apk folder
2.apktool b folder yyy.apk
3.aapt a yyy.apk file
4.jarsigner -verbose -keystore xxx.keystore -signedjar yyy_signed.apk yyy.apk release

轉自:http://www.yxkfw.com/?p=12341

jarsigner工具用於兩個目的 :簽名和校驗。
jarsigner -verbose -keystore E:\unitygames.keystore  -signedjar       E:\F\Project\SVN_Project\SVN_Project_SavingMonster\branch\SavingMonster_Android_1.0\SavingManstor_Signed.apk  -digestalg SHA1 
-sigalg MD5withRSA  C:\Users\Unity\Desktop\SavingMonster_041402.apk unitygameskey
上面三行命令行的功能是把E:\.....這個路徑下面的apk(此apk是使用ApkTools工具拆包得到的)獲取到,然後使用加密進行簽名打包,注意:根據打包時電腦的jre版本的不同,要使用的加密代碼也不同,不然會打包失敗,具體的用什麼可以在網上查到; 後面的unitygames是最後這個是alias
zipalign -v 4 C:\Users\yi.guo\Desktop\test01\testfightback.apk C:\Users\yi.guo\Desktop\test01\fightback_signed.apk
















jarsigner -verbose -keystore   C:\Users\yi.guo\Desktop\unitygames.keystore -signedjar  fightback_sign.apk -digestalg SHA1 -sigalg MD5withRSA  newfightback.apk   unitygameskey


zipalign -v 4 C:\Users\yi.guo\Desktop\test01\testfightback.apk C:\Users\yi.guo\Desktop\test01\fightback_signed.apk
        jarsigner工具用於兩個目的 :簽名和校驗。 該工具常用的命令行語句如下:

               

jarsigner用法: [選項] jar 文件別名

 jarsigner -verify [選項] jar 文件

[-keystore <url>]           密鑰庫位置
[-storepass <口令>]         用於密鑰庫完整性的口令
[-storetype <類型>]         密鑰庫類型
[-keypass <口令>]           專用密鑰的口令(如果不同)
[-sigfile <文件>]           .SF/.DSA 文件的名稱
[-signedjar <文件>]         已簽名的 JAR 文件的名稱
[-digestalg <算法>]    摘要算法的名稱
[-sigalg <算法>]       簽名算法的名稱
[-verify]                   驗證已簽名的 JAR 文件
[-verbose]                  簽名/驗證時輸出詳細信息
[-certs]                    輸出詳細信息和驗證時顯示證書
[-tsa <url>]                時間戳機構的位置
[-tsacert <別名>]           時間戳機構的公共密鑰證書
[-altsigner <類>]           替代的簽名機制的類名
[-altsignerpath <路徑列表>] 替代的簽名機制的位置
[-internalsf]               在簽名塊內包含 .SF 文件
[-sectionsonly]             不計算整個清單的散列
[-protected]                密鑰庫已保護驗證路徑
[-providerName <名稱>]      提供者名稱
[-providerClass <類>        加密服務提供者的名稱
[-providerArg <參數>]] ... 主類文件和構造函數參數

下面列出並說明了各種 jarsigner 選項。注意:

  • 所有選項名前都有一個減號 (-)。
  • 選項可以以任何次序提供。
  • 斜體項(選項值)代表必須提供的實際值。
  • -keystore-storepass-keypass-sigfile 和 -signedjar 選項僅在爲 JAR 文件簽名時相關,而不是在校驗已簽名的 JAR 文件時。同樣,別名僅在爲 JAR 文件簽名時在命令行中指定。
-keystore url
指定密鑰倉庫的 URL。缺省值是用戶的宿主目錄中的 .keystore 文件,它由系統屬性“user.home”決定。

簽名時需要密鑰倉庫,因此如果沒有缺省的(或要使用非缺省的)密鑰倉庫,就必須明確指定一個。

校驗時需要密鑰倉庫,但如果指定了一個,或存在缺省的,且 -verbose 選項也被指定了,則將輸出該密鑰倉庫中是否包含了用於校驗 JAR 文件的證書的附加信息。

注意: -keystore 參數實際上可以是指定的文件名(及路徑)而不是 URL,這種情況下它將當作“file:” URL. 也就是說,

  -keystore filePathAndName 

被當作等價於

  -keystore file:filePathAndName 
-storetype storetype
指定要被實例化的密鑰倉庫類型。默認的密鑰倉庫類型是安全屬性文件中 "keystore.type" 屬性值所指定的那個類型,由 java.security.KeyStore 中的靜態方法 getDefaultType 返回。
-storepass password
指定訪問密鑰倉庫所需的口令。這僅在簽名(不是校驗)JAR 文件時需要。在這種情況下,如果命令行中沒有提供 -storepass 選項,用戶將被提示輸入口令。

注意: 口令不應在命令行或腳本中指定,除非是爲了測試,或在安全系統中。並且,在口令提示下鍵入口令時將顯示出鍵入的字符,因此不要在其它人面前鍵入。

-keypass password
指定用於保護密鑰倉庫項(由命令行中指定的別名標出)的私鑰的口令。使用 jarsigner 爲 JAR 文件簽名時需要該口令。如果命令行中沒有提供口令,且所需的口令與密鑰倉庫的口令不同,則將提示用戶輸入它。

注意: 口令不應在命令行或腳本中指定,除非是爲了測試,或在安全系統中。並且,在口令提示下鍵入口令時將顯示出鍵入的字符,因此不要在其它人面前鍵入。

-sigfile file
指定用於生成 .SF 和 .DSA 文件的基本文件名。例如,如果 file 爲“DUKESIGN”,則生成的 .SF 和 .DSA 文件將被命名爲“DUKESIGN.SF”和“DUKESIGN.DSA”,並將放到已簽名的 JAR 文件的“META-INF”目錄中。

file 中的字符應來自“a-zA-Z0-9_-”。也就是說,只允許字母、數字、下劃線和連字符。注意: .SF 和 .DSA 文件名中小寫字母將被轉換爲大寫字母。

如果命令行中沒有 -sigfile 選項,則 .SF 和 .DSA 文件的基本文件名將是命令行中指定的別名的前 8 個字符,並全部被轉換爲大寫。如果別名少於 8 個字符,將使用整個別名。如果別名中包含簽名文件名所不允許的字符,則形成文件名時這樣的字符將被轉換爲下劃線 ("_")。

-signedjar file
指定用於已簽名的 JAR 文件的名稱。

如果命令行中沒有指定名稱,將使用輸入的 JAR 文件名(要簽名的 JAR 文件名);換句話說,該文件將被簽名 JAR 文件覆蓋。

-verify
如果它出現在命令行中,則指定的 JAR 文件將被校驗,而不是簽名。如果校驗成功,將顯示“jar verified”。如果試圖校驗未簽名的 JAR 文件,或校驗被不支持的算法(例如未安裝 RSA 提供者時使用的 RSA)簽名的 JAR 文件,則將有如下顯示: "jar is unsigned. (signatures missing or not parsable)"

可以校驗使用 jarsigner 或 JDK 1.1 javakey 工具或共用二者簽名的 JAR 文件。

有關校驗的詳細信息,參見 JAR 文件校驗

-certs
如果它與 -verify 和 -verbose 選項一起出現在命令行中,則輸出將包括 JAR 文件的每個簽名人的證書信息。該信息包括
  • 驗證簽名人公鑰的證書的類型名(保存在 .DSA 文件中)
  • 如果該證書是 X.509 證書(更準確地說是 java.security.cert.X509Certificate 的實例): 簽名人的特徵名

密鑰倉庫也被檢查。如果命令行中沒有指定密鑰倉庫值,缺省密鑰倉庫文件(如果有)將被檢查。如果簽名人的公鑰證書與密鑰倉庫中的項匹配,則還將顯示下列信息:

  • 該簽名人的密鑰倉庫項的別名,在圓括號中。如果該簽名人實際上來自於 JDK 1.1 身份數據庫而不是密鑰倉庫,則別名將顯示在方括號而不是圓括號中。
-verbose
如果它出現在命令行中,則代表“verbose”模式,它使 jarsigner 在 JAR 簽名或校驗過程中輸出額外信息。
-internalsf
過去,JAR 文件被簽名時產生的 .DSA(簽名塊)文件包含一個同時產生的 .SF 文件(簽名文件)的完整編碼副本。這種做法已被更改。爲了減小輸出 JAR 文件的整個大小,缺省情況下 .DSA 文件不再包含 .SF 文件的副本。但是如果 -internalsf 出現在命令行中,將採用舊的做法。該選項主要在測試時有用;實際上不應使用它,因爲這樣將消除有用的優化
-sectionsonly
如果它出現在命令行中,則 JAR 文件被簽名時生成的 .SF 文件(簽名文件)將包括含有整個清單文件的散列的頭。它僅包含 與 JAR 中每個單獨的源文件相關的信息和散列,如簽名 (.SF) 文件所述。

缺省情況下,該頭將作爲一種優化手段添加。只要該頭存在,則無論何時 JAR 被校驗,都將首先檢查該頭中的散列是否真正與整個清單文件的散列匹配。如果匹配,校驗將進行下一步。如果不匹配,則有必要執行一個次優的校驗,檢查 .SF 文件中每個源文件信息部分中的散列是否等於清單文件中相應部分的散列。

有關的詳細信息,參見 JAR 文件校驗

該選項主要在測試時有用;實際上不應使用它,因爲這樣將消除有用的優化。

-Jjavaoption
將指定的 javaoption 串直接傳遞到 Java 解釋器。((jarsigner 實際上是解釋器的一個 “wrapper”)。該選項不應含有任何空格。它有助於調整執行環境或內存使用。要獲得可用的解釋器選項的清單,可在命令行鍵入 java -h 或 java -X

程序例子

簽名 JAR 文件

假設您有一個 JAR 文件名爲“bundle.jar”並且希望使用“working”目錄中名爲“mystore”的密鑰倉庫裏別名爲“Jane”的用戶的私鑰進行簽名。假設密鑰倉庫口令是“myspass”且 jane 的私鑰口令是“j638klm”。您可以使用下列命令爲該 JAR 文件簽名並將簽了名的 JAR 文件命名爲“sbundle.jar”:

    jarsigner -keystore /working/mystore -storepass myspass       -keypass j638klm -signedjar sbundle.jar bundle.jar jane 

注意上面的命令中沒有指定 -sigfile,因此所產生的要放入已簽名 JAR 文件的 .SF 和 .DSA 文件將採用基於別名的缺省名。也就是說,它們將被命名爲 JANE.SF 和 JANE.DSA

如果要根據提示輸入倉庫口令和私鑰口令,可以將上面的命令縮短爲

    jarsigner -keystore /working/mystore       -signedjar sbundle.jar bundle.jar jane 

如果要使用的是缺省密鑰倉庫(它在宿主目錄中,名爲“.keystore”),則不必指定密鑰倉庫,如下:

    jarsigner -signedjar sbundle.jar bundle.jar jane 

最後,如果要使已簽名的 JAR 文件簡單地覆蓋輸入的 JAR 文件 (bundle.jar),則不必指定 -signedjar 選項:

    jarsigner bundle.jar jane 

校驗已簽名的 JAR 文件

要校驗已簽名的 JAR 文件,(也就是說驗證簽名合法且 JAR 文件未被更改過)請使用如下命令:

    jarsigner -verify sbundle.jar 

如果校驗成功,將顯示

    jar verified. 

。否則將出現錯誤信息。

如果使用 -verbose 選項則將獲得更多的信息。下面是用 -verbose 選項使用 jarsigner 的例子及其輸出:

    jarsigner -verify -verbose sbundle.jar             198 Fri Sep 26 16:14:06 PDT 1997 META-INF/MANIFEST.MF            199 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.SF           1013 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.DSA     smk   2752 Fri Sep 26 16:12:30 PDT 1997 AclEx.class     smk    849 Fri Sep 26 16:12:46 PDT 1997 test.class        s = signature was verified       m = entry is listed in manifest       k = at least one certificate was found in keystore      jar verified. 

校驗證書信息

如果校驗時與 -verify 和 -verbose 選項一起指定了 -certs 選項,則輸出將包括該 JAR 文件的每個簽名人的證書信息,其中包括證書類型、簽名人的特徵名信息(如果是 X.509 證書),以及括在圓括號中的簽名人的密鑰倉庫別名(如果 JAR 文件中的公鑰證書與密鑰倉庫項中的證書匹配。例如:

    jarsigner -keystore /working/mystore -verify -verbose -certs myTest.jar             198 Fri Sep 26 16:14:06 PDT 1997 META-INF/MANIFEST.MF            199 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.SF           1013 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.DSA            208 Fri Sep 26 16:23:30 PDT 1997 META-INF/JAVATEST.SF           1087 Fri Sep 26 16:23:30 PDT 1997 META-INF/JAVATEST.DSA     smk   2752 Fri Sep 26 16:12:30 PDT 1997 Tst.class        X.509, CN=Test Group, OU=Java Software, O=Sun Microsystems, L=CUP, S=CA, C=US (javatest)       X.509, CN=Jane Smith, OU=Java Software, O=Sun, L=cup, S=ca, C=us (jane)        s = signature was verified       m = entry is listed in manifest       k = at least one certificate was found in keystore      jar verified. 

如果簽名人的證書不是 X.509 證書,將沒有特徵名信息。這種情況下,僅顯示證書類型和別名。例如,如果該證書爲 PGP 證書,且別名爲“bob”,則將顯示

      PGP, (bob) 

校驗包含身份數據庫簽名人的 JAR 文件

如果 JAR 文件已用 JDK 1.1 javakey 工具簽名,因此簽名人是身份數據庫中的別名,則校驗輸出將包括一個“i”符號。如果 JAR 文件同時被身份數據庫中的別名和密鑰倉庫中的別名二者簽名,則將出現“k”和“i”。

當使用了 -certs 選項時,任何身份數據庫別名都將顯示在方括號中,而不是顯示在用於密鑰倉庫別名的圓括號中。例如:

    jarsigner -keystore /working/mystore -verify -verbose -certs writeFile.jar             198 Fri Sep 26 16:14:06 PDT 1997 META-INF/MANIFEST.MF            199 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.SF           1013 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.DSA            199 Fri Sep 27 12:22:30 PDT 1997 META-INF/DUKE.SF           1013 Fri Sep 27 12:22:30 PDT 1997 META-INF/DUKE.DSA    smki   2752 Fri Sep 26 16:12:30 PDT 1997 writeFile.html        X.509, CN=Jane Smith, OU=Java Software, O=Sun, L=cup, S=ca, C=us (jane)       X.509, CN=Duke, OU=Java Software, O=Sun, L=cup, S=ca, C=us [duke]        s = signature was verified       m = entry is listed in manifest       k = at least one certificate was found in keystore       i = at least one certificate was found in identity scope      jar verified. 

注意別名“duke”在方括號中,這說明它是身份數據庫別名,不是密鑰倉庫別名。

   
下面是一個簽名的例子:
第二篇文章 ,可能重新簽名會遇到的問題 這裏介紹
感謝原文作者http://www.jb51.net/article/49411.htm
這篇文章主要介紹了jarsigner重新簽名apk無法安裝的解決方法,需要的朋友可以參考下

因爲一些原因,要給未簽名的apk重新簽名,需要用到jarsigner工具,但是簽名之後,apk無法安裝,百思不得其解。終於找到一個解決方案,現在分享給大家:

在簽名時,要加上2個參數:

複製代碼代碼如下:

-digestalg SHA1 -sigalg MD5withRSA

造成無法簽名錯誤的原因,初步估計是JDK版本的問題。JDK 1.6簽名沒事,但是1.7會出這個問題。

完整的簽名命令如下:

複製代碼代碼如下:

jarsigner -verbose -keystore feelyou.keystore -storepass feelyou.info -signedjar signed.apk -digestalg SHA1 -sigalg MD5withRSA unsigned.apk feelyou

解釋:

1、-keystore feelyou.keystore:指定需要使用的簽名文件,直接寫文件名說明在當前目錄下,否則請自行指定具體路徑
2、-storepass feelyou.info:自動輸入密碼,keystore的密碼和alias的密碼都是我用的都是feelyou.info
3、-signedjar signed.apk:指定簽名後的文件存儲路徑,這裏是說以signed.apk的文件名存在當前路徑下
4、-digestalg SHA1 -sigalg MD5withRSA:這就是必須加上的參數,如果你是jdk 1.6也不受影響
5、unsigned.apk:未簽名的apk路徑,這裏是當前路徑下的unsigned.apk文件
6、feelyou:最後這個是alias,alias在unity的PlayerSetting/PulishingSettings/Alias的內容

例如:

jarsigner -verbose -keystore E:\unitygames.keystore  -signedjar    E:\F\Project\SVN_Project\SVN_Project_SavingMonster\branch\SavingMonster_Android_1.0\SavingManstor_Signed.apk  -digestalg SHA1 -sigalg MD5withRSA  C:\Users\Unity\Desktop\SavingMonster_041402.apk unitygameskey
上面三行命令行的功能是把E:\.....這個路徑下面的apk(此apk是使用ApkTools工具拆包得到的)獲取到,然後使用加密進行簽名打包,注意:根據打包時電腦的jre版本的不同,要使用的加密代碼也不同,不然會打包失敗,具體的用什麼可以在網上查到; 後面的unitygames是最後這個是alias,alias在unity的PlayerSetting/PulishingSettings/Alias的內容
zipalign -v 4 C:\Users\yi.guo\Desktop\test01\testfightback.apk C:\Users\yi.guo\Desktop\test01\fightback_signed.apk



另外一個例子:

用私鑰進行簽名

jarsigner:

 

Jarsigner 選項 描述
-keystore.keystore 包含你私鑰的存儲文件
-verbose 顯示輸出動作。
-sigalg 簽名算法,用 SHA1withRSA.
-digestalg 消息摘要算法,用 SHA1.
-storepass

存儲文件的密碼。

主要爲了安全起見,如果沒提供,jarsigner會提示你輸入。這個密碼不會存儲在你的shell歷史記錄中。

-keypass

私鑰的密碼。

主要爲了安全起見,如果沒提供,jarsigner會提示你輸入。這個密碼不會存儲在你的shell歷史記錄中。

jarsigner  -verbose -sigalg SHA1withDSA -digestalg SHA1  -keystore myDevel.keystore -storepass MyDevel test.apk devel


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章