您的位置:首页 > 其它

MM线下打包遇到的问题总结,以及安卓破包重新签名

2015-03-12 11:44 323 查看


MM线下打包遇到的问题总结,以及安卓破包重新签名

分类: 安卓开发问题2015-03-06
10:31 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 -keystorexxx.keystore -signedjaryyy_signed.apk yyy.apk release
转自:http://www.yxkfw.com/?p=12341

jarsigner工具用于两个目的 :签名和校验。

jarsigner -verbose -keystoreE:\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. 也就是说,
  -keystorefilePathAndName 

被当作等价于
  -keystorefile: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
文件校验。
该选项主要在测试时有用;实际上不应使用它,因为这样将消除有用的优化。
-J
javaoption将指定的 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 -storepassmyspass       -keypassj638klm -signedjarsbundle.jar bundle.jar jane 

注意上面的命令中没有指定
-sigfile
,因此所产生的要放入已签名 JAR 文件的 .SF 和 .DSA 文件将采用基于别名的缺省名。也就是说,它们将被命名为
JANE.SF
JANE.DSA

如果要根据提示输入仓库口令和私钥口令,可以将上面的命令缩短为
    jarsigner -keystore/working/mystore       -signedjarsbundle.jar bundle.jar jane 

如果要使用的是缺省密钥仓库(它在宿主目录中,名为“.keystore”),则不必指定密钥仓库,如下:
    jarsigner -signedjarsbundle.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 -keystorefeelyou.keystore -storepassfeelyou.info -signedjarsigned.apk -digestalg SHA1 -sigalg MD5withRSA unsigned.apk feelyou

解释:

1、-keystorefeelyou.keystore:指定需要使用的签名文件,直接写文件名说明在当前目录下,否则请自行指定具体路径

2、-storepassfeelyou.info:自动输入密码,keystore的密码和alias的密码都是我用的都是feelyou.info

3、-signedjarsigned.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 -keystoreE:\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 -keystoremyDevel.keystore -storepassMyDevel test.apk devel






内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: