apk签名

Android系统要求每一个Android应用程序必须要经过数字签名才能够安装到系统中,也就是说如果一个Android应用程序没有经过数字签名,是没有办法安装到系统中的!
Android通过数字签名来标识应用程序的作者和在应用程序之间建立信任关系,不是用来决定最终用户可以安装哪些应用程序。
这个数字签名由应用程序的作者完成,并不需要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的
假如修改了APK中的一个文件,或者在APK中新加入了一个文件,则需要对APK重新签名,在ubuntu下步骤如下:
需要keytool和jarsigner这2个命令,这2个命令在jdk中
1:我要在APK中添加一个新文件,打开APK是下面这样的
2:加入1个新文件log,删除META-INF(不删除有时签名完不能安装),如下图
3:使用命令获取密钥
命令:
keytool -genkey -v -keystore android.keystore -alias android -keyalg RSA -validity 20000
解释:
keytool -genkey -v -keystore (生成的密钥名称) -alias (密钥别名) -keyalg RSA -validity (有效期)
Android Market强制要求所有应用程序数字证书的有效期要持续到2033年10月22日以后
需要设置密码,可以随便写,但是在签名时要用到,下面的内容都是我随便填的
4:开始签名
命令:
jarsigner -verbose -keystore android.keystore -signedjar ~/Desktop/PlayerProject.apk    PlayerProject.apk android
解释:
jarsigner -verbose -keystore (上面生成的密钥名称) -signedjar (签名后的APK路径)    (签名前的APK路径) (密钥android.keystore的别名)
这里就需要上面设置的密码
5:安装测试
一、安装apktool

1、访问http://code.google.com/p/android-apktool下载apktool-install-linux-*文件与apktool-*文件,将两文件夹内的文件(不带文件夹)解压至/usr/local/bin目录(需要管理员权限)。
2、cd到/usr/local/bin目录,在终端运行apktool命令,即可安装apktool。
apktool 命令
apktool d geek.apk test     反编译(解压) geek.apk到文件夹test
apktool b test geek_2.apk  从文件夹test重建apk

注:执行apktool b test geek_2.apk命令时可能会出现错误,授予/usr/bin/aapt可读写、可执行权限即可解决。




二、签名1、确认已安装Java。
2、在终端执行命令:keytool -genkey -v -keystore android.keystore -alias android -keyalg RSA -validity 20000生成签名( android.keystore为签名名称)
3、使用命令:jarsigner -verbose -keystore android.keystore -signedjar geek_2_signed.apk geek_2.apk android为修改过的程序签名
注:生成的签名应与所需签名程序在同一目录(也可以不在同一目录,具体参考本步骤中2条命令的使用方法)。




三、另附1、keytool用法:
-certreq     [-v] [-protected]

[-alias <别名>] [-sigalg <sigalg>]
[-file <csr_file>] [-keypass <密钥库口令>]
[-keystore <密钥库>] [-storepass <存储库口令>]
[-storetype <存储类型>] [-providername <名称>]
[-providerclass <提供方类名称> [-providerarg <参数>]] …
[-providerpath <路径列表>]

-changealias [-v] [-protected] -alias <别名> -destalias <目标别名>
[-keypass <密钥库口令>]
[-keystore <密钥库>] [-storepass <存储库口令>]
[-storetype <存储类型>] [-providername <名称>]
[-providerclass <提供方类名称> [-providerarg <参数>]] …
[-providerpath <路径列表>]

-delete      [-v] [-protected] -alias <别名>
[-keystore <密钥库>] [-storepass <存储库口令>]
[-storetype <存储类型>] [-providername <名称>]
[-providerclass <提供方类名称> [-providerarg <参数>]] …
[-providerpath <路径列表>]

-exportcert  [-v] [-rfc] [-protected]
[-alias <别名>] [-file <认证文件>]
[-keystore <密钥库>] [-storepass <存储库口令>]
[-storetype <存储类型>] [-providername <名称>]
[-providerclass <提供方类名称> [-providerarg <参数>]] …
[-providerpath <路径列表>]

-genkeypair  [-v] [-protected]
[-alias <别名>]
[-keyalg <keyalg>] [-keysize <密钥大小>]
[-sigalg <sigalg>] [-dname <dname>]
[-validity <valDays>] [-keypass <密钥库口令>]
[-keystore <密钥库>] [-storepass <存储库口令>]
[-storetype <存储类型>] [-providername <名称>]
[-providerclass <提供方类名称> [-providerarg <参数>]] …
[-providerpath <路径列表>]

-genseckey   [-v] [-protected]
[-alias <别名>] [-keypass <密钥库口令>]
[-keyalg <keyalg>] [-keysize <密钥大小>]
[-keystore <密钥库>] [-storepass <存储库口令>]
[-storetype <存储类型>] [-providername <名称>]
[-providerclass <提供方类名称> [-providerarg <参数>]] …
[-providerpath <路径列表>]

-help
-importcert  [-v] [-noprompt] [-trustcacerts] [-protected]
[-alias <别名>]
[-file <认证文件>] [-keypass <密钥库口令>]
[-keystore <密钥库>] [-storepass <存储库口令>]
[-storetype <存储类型>] [-providername <名称>]
[-providerclass <提供方类名称> [-providerarg <参数>]] …
[-providerpath <路径列表>]

-importkeystore [-v]
[-srckeystore <源密钥库>] [-destkeystore <目标密钥库>]
[-srcstoretype <源存储类型>] [-deststoretype <目标存储类型>]
[-srcstorepass <源存储库口令>] [-deststorepass <目标存储库口令>]
[-srcprotected] [-destprotected]
[-srcprovidername <源提供方名称>]
[-destprovidername <目标提供方名称>]
[-srcalias <源别名> [-destalias <目标别名>]
[-srckeypass <源密钥库口令>] [-destkeypass <目标密钥库口令>]]
[-noprompt]
[-providerclass <提供方类名称> [-providerarg <参数>]] …
[-providerpath <路径列表>]

-keypasswd   [-v] [-alias <别名>]
[-keypass <旧密钥库口令>] [-new <新密钥库口令>]
[-keystore <密钥库>] [-storepass <存储库口令>]
[-storetype <存储类型>] [-providername <名称>]
[-providerclass <提供方类名称> [-providerarg <参数>]] …
[-providerpath <路径列表>]

-list        [-v | -rfc] [-protected]
[-alias <别名>]
[-keystore <密钥库>] [-storepass <存储库口令>]
[-storetype <存储类型>] [-providername <名称>]
[-providerclass <提供方类名称> [-providerarg <参数>]] …
[-providerpath <路径列表>]

-printcert   [-v] [-file <认证文件>]
-storepasswd [-v] [-new <新存储库口令>]
[-keystore <密钥库>] [-storepass <存储库口令>]
[-storetype <存储类型>] [-providername <名称>]
[-providerclass <提供方类名称> [-providerarg <参数>]] …
[-providerpath <路径列表>]

2、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 <参数>]] … 主类文件和构造函数参数