应用签名(译)

来源:互联网 发布:mac win10触控板手势 编辑:程序博客网 时间:2024/06/15 19:59

Original Source: https://developer.android.com/studio/publish/app-signing.html

 

Android系统要求所有的APK应用在安装前应当使用证书文件完成数字签名,本文将介绍如何使用Android Studio来给你的应用签名,包括:证书的创建与存储、用不同的证书为不同的构建版本签名和通过配置构建流程为你的应用自动签名。

 

 

证书及keystore(秘钥库)

公钥证书,也就是我们熟知的数字证书或身份证书,包含秘钥对里的公钥和所有者一些的身份信息(例如:名字,地址)。证书的所有者保管相应的私钥。

 

当进行应用签名时,签名工具将公钥证书附加到APK上,公钥证书的作用好比如人的指纹,把APK应用与你和相应的私钥唯一地联系起来。这有利于Android系统确保未来升级应用,应用是官方授权的,并且来自于同一个作者。

 

Keystore(秘钥库,后面称:keystore)是一个二进制文件,包含一个或私钥。当使用Android Studio签署发布使用APK文件时,你可以选择生成新的keystore和私钥,或者使用已有的keystore和私钥。你应该为你的keystore配置健壮的密码,分别为每一个存储在该keystore里的私钥配置独立的密码,同时把keystore存放到安全的地方,详情查看后面的”保护你的私钥”。

 

在证书的预期使用期限里,你必须使用相同的证书,这样,才能确保你的用户能够完成升级。更多使用同一个证书的好处,请查看后面的”签名须知”。

 

为调试版本的签名

当通过开发工具运行或调试你的项目时,Android Studio使用由 Android SDK tools生成的调试证书自动为你的APK签名。当你第一次运行或调试你的项目时,Android Studio会在路径” $HOME/.android/debug.keystore”自动生成调试用的keystore和证书文件,并且配置keystore的信息和密码。

 

由于调试用的证书由编译工具创建,出于安全考虑,大多数的应用商店不会接受使用调用证书签名的APK文件来发布。

 

Android Studio自动存储你的调试签名信息到签名配置里,所以你每次调试时都无需配置。签名配置包含签名时所需要的必要信息:keystore的位置,keystore的密码,key名字,key密码。你不能直接修改调试版本签名配置,但是你能配置发布版本的签名配置。

 

想了解更多关于构建和运行调试应用,请查看构建及运行应用”。

 

调试证书的有效期

调试用的证书有效期为365天,当证书过期了,会有构建错误的提示。

 

解决这个问题的简单的方法是,删除文件:debug.keystore。该文件存放在下面的位置:

·        ~/.android/ on OS X and Linux

·        C:\Documents andSettings\<user>\.android\ on Windows XP

·        C:\Users\<user>\.android\ on Windows Vista andWindows 7, 8, and 10

下一次,当你构建和运行调试时,工具会自动重新生成keystore和调试的key。备注:必须运行工程才会重新生成keystore和key,如果只构建,是不会重新生成的。

 

 

发布版本签名

你可以使用Android Studio手动操作生成签名的APK文件,一次一个,或一次多个构建版本;你也可以通过Gradle构建设置来处理构建过程中自动签名。本小节将介绍手动操作签名的过程。更多了解构建项目时完成签名的信息,请查看:”构建过程中自动签名配置”。

 

在Android Studio下,手动操作签名发布版本的步骤如下:

1、 菜单栏,点击Build Generate Signed APK.

2、  从下拉列表里,选择你想发布的应用模块,点击Next.

3、  如果你已经有keystore文件,直接跳到第5步;如果你想创建新的keystore,点击Create new.

4、  在窗口New Key Store,提供如下图的信息,让你输入。

 

Keystore

·        Key store path: 选择存放新建的keystore文件的路径.

·        Password: 为keystore初始并确认密码.

 

Key

·        Alias: 为你的key输入用于标识的名字.

·        Password:创建并确认密码,这个密码应当跟keystore设置的密码不一致

·        Validity (years):设置key的有效年长,至少25年,那样你就能有效期限内用同一个key为应用升级。

·        Certificate:输入关于你的信息到证书里,这些信息并不会显示到应用里,但是会包含到APK文件里。

完成以上输入后,点击OK

 

 

5、  在窗口:Generate Signed APK Wizard,选择keystore文件,私有key,并输入它们对应的密码(如果你在上一步,创建keystore,这些信息会自动帮你填入)。然后点击Next

 

6、  在下一个窗口里,选择APK文件的输出路径,选择构建类型,选择生产特点(如果有应用到的话),然后点击Finish.

 

当处理完成后,可以在前面选择目标路径下找到已签名的APK文件。现在,你就可以把这个已签名的APK文件提交到如:Google Play Store的应用市场或其它你选择的平台上去了。更多关于如何发布应用到Google Play Store的信息,查看”应用发布”。

 

为了用户能够成功完成应用的升级,你需要在证书的有效期限内使用同一个证书为你的应用签名。

 

 

构建过程中为应用自动签名配置

在Android Studio里,通过创建签名配置配置并指定到发布的构建类型里,工程将在构建过程中自动签署发布版本的APK。签名配置包含keystore的路径,keystore的密码,key的名称,key的密码。可以通过下面的步骤完成配置:

1、  在 窗口Project,右击你的app,选择Open Module Settings

2、  在窗口Project Structure,左侧板面Modules 下,选择你将要签名的模块

3、  选择标签Signing ,然后点击Add 

4、  选择你的keystore文件,为这个签名配置输入个名字(有可能会创建多个),然后输入需要的信息


5、  点击标签Build Types

6、  选择构建类型release 

7、  在Signing Config下面,选择已创建的签名配置

8、  点击OK

 

现在,每次使用AndroidStudio构建发布版本时,工具将自动使用你指定的签名配置为APK文件进行签名。你可以在build/outputs/apk/工程模块目录下找到已签名的APK文件。

 

当你创建签名配置里,你的签名信息将以字符串的形式添加到Gradle的构建文件里。如果你以团队开发,你应当将这些信息从构建文件里移除,以保证签名信息的安全性,并且独立存储。更多关于如何从构建文件里移除签名信息,可查看“移除构建文件里的签名信息”。更多关于如何保护你的签名信息,请查看“保护私钥”。

 

 

为不同特点的产品版本签名

如果你的应用有使用产品特点并且你希望每种特点的签名有区别,那么你可以再创建一个签名配置,并通过特点来指定:

1、  在窗口Project ,右击你的app,选择Open Module Settings

2、  在窗口Project Structure ,左侧板面Modules 下,选择你将要签名的模块

3、  选择标签Signing ,点击Add 

4、  选择你的keystore文件,为这个签名配置输入个名字(有可能会创建多个),然后输入需要的信息


5、  如果需要的话,重复第3步和第4步,直到所有的签名配置创建完成

6、  选择标签Flavors 

7、  选择你想要配置的flavor,然后从Signing Config的下拉菜单里选择适当签名配置

8、 点击 OK

 

你也可以在Gradle的配置文件里指定你的签名设置,更多信息,请查看“配置签名设置

 

 

为Android穿戴APP签名

在发布Android穿戴APK时,把穿戴的APK文件放置到已处理过的APK里,由于用户不能直接浏览和安装应用到穿戴设备。前面的两个APK文件都需要签名。更多关于穿戴设备的打包签名信息,请查看“穿戴设备APP的打包”。

 

 

 

签名须知

为APK签名时,应当在app的有效期限内使用同一个证书。这么做的原因有几个:

 

l  应用升级:当系统安装APP的升级时,它会比较新版本和已安装的版本的证书信息,只有当证书信息一致时,才允许应用升级。如果使用另一个证书签名新版本时,你必须指定一个不同的项目包名,这样子,用户以安装新应用的方式安装新版本。

 

l  应用模块性:Android允许使用同一个证书签名的APK文件运行在同一进程里,如果这些应用这么请求的话,系统将它们当作一个应用来看待。使用这种方式,你可以把应用部署成多个模块,用户可以分别独立更新各个模块。

 

l  授权共享代码/数据:Android提供了基于签名的权限执行,这样应用程序可以暴露方法到另一个使用指定证书签名的应用程序。通过使用同一个证书签名的多个APK和使用基于签名的权限检查,你的应用程序可以以一种安全的方式共享代码和数据。

 

如果你打算让应用支付升级,请确保key的有效日期超过应用的预期寿命。一般推荐25年以上。当你的key过期了,用户将不能无缝地升级应用。

 

如果你打算发布应用到GooglePlay上,签名使用的Key的有效期请必须设置在2033年10月22号之后。Google Play强制要求这么做,这样,用户才可能无缝地升级使用新版本。

 

 

保护私钥

无论对你还是用户来说,维护你私钥的安全是至关重要的。如果你允许某人使用你的key,或者你把keystore和密码存放到不安全的地方,以至于被第三方可能找到并利用,那么你作者的身份和用户对你的信赖将收到影响。

 

如果第三方没经你同意设法获得了你的私钥,那么他可能恶意地重新签名并发布应用,替换掉你原来的应用,从而摧毁你的应用。他也可能以你的身份重新签名并发布应用,来攻击其他应用或者系统本身,或恶意套取用户的数据。

 

你应用以后版本签名时需要使用到你的私钥。如果你丢失了或者忘记放在什么地方了,你将不能够发布升级使用的新版本。你不能重新生成之前生成的key。

 

你作为开发者的荣誉在于完全地、一直地保护私钥,直到私钥失效。下面是保护私钥的几个窍门:

 

l  为keystore和key设置健壮的密码;

l  绝不把私钥交给任何人,绝不让无授权的人知道你的密码;

l  把keystore文件存放到安全的地方。

 

一般来说,如果在生成、使用和存储私钥时,遵循常识性预防措施,它将是安全的。

 

 

移除构建文件里的签名信息

当你创建签名配置时,AndroidStudio会把你的签名信息添加到模块里的build.gradle文件,如果你以团队开发或开源你的代码,你应当移除这部份的敏感信息,以防别人轻易访问到。为了实现这个目的,应当创建另一个属性文件来存储安全信息,在构建文件里引用该文件,如下:

1、  创建签名配置,并指向一个或多个构建类型。假设你已经为发布构建粘在类型配置了一个签名配置,如上面“构建过程中为应用自动签名配置”描述的操作。

2、  在项目根目录里,创建一个名为keystore.properties的文件,该文件包含你的签名信息,如下:

storePassword=myStorePassword
keyPassword=mykeyPassword
keyAlias=myKeyAlias
storeFile=myStoreFileLocation

 

3、  在模块的build.gradle文件里,在android{}代码块前,添加加载keystore.properties文件的代码:

...// Create a variable called keystorePropertiesFile, and initialize it to your// keystore.properties file, in the rootProject folder.def keystorePropertiesFile = rootProject.file("keystore.properties")// Initialize a new Properties() object called keystoreProperties.def keystoreProperties = new Properties()// Load your keystore.properties file into the keystoreProperties object.keystoreProperties.load(new FileInputStream(keystorePropertiesFile))android {    ...}

 

备注:你可以在其它地方选择存放keystore.properties文件(如:模块文件夹而不是项目的根目录,或者你的构建服务器上,如果你正在使用持续集成工具)。那样的话,需要正确地修改上面的代码,keystorePropertiesFile存放真实的keystore.properties文件路径。

4、  你可以以这样的语法:keystoreProperties['propertyName']引用存储在keystoreProperties文件的属性。为模块构建文件build.gradle修改signingConfigs代码块,引用存储在keystoreProperties文件的签名信息,使用如下的语法:

android {    signingConfigs {        config {            keyAlias keystoreProperties['keyAlias']            keyPassword keystoreProperties['keyPassword']            storeFile file(keystoreProperties['storeFile'])            storePassword keystoreProperties['storePassword']        }    }    ...  }

 

 

5、  打开Build Variants工具窗口,确保选择的是发布构建类型;

6、  点击Build > Build APK开始发布版本的构建,确认AndroidStudio有没有在模块目录的build/outputs/apk/ 文件夹里创建已签名的APK文件。

 

由于你的构建文件里,不再包含敏感信息,你现在可以包含这些文件到源代码控制,或者上传到共享代码库。一定要保证keystore.properties文件的安全。一定要把该文件从源码控件里移除。

 

 

手动操作应用签名

你不一定使用Android Studio来为你的应用签名,你可以使用标准工具:Android SKD 和 JDK,通过命令行完成应用的签名。下面是操作为发布版本签名的步骤:

1、  使用keytool.工具生成私钥,例如:

$ keytool -genkey -v -keystore my-release-key.keystore
-alias alias_name -keyalg RSA -keysize 2048 -validity 10000

 

这个例子命令行提示你为keystore输入密码,提供唯一的key名,然后它将生成名为my-release-key.keystore的keystore文件,该文件包含一个key,有效期为10000天,alies将在后面为应用签名时使用到。

2、  在发布模块下,编译你的APP,将获得一下未签名的APK文件

3、  使用jarsigner为你的应用签名

$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1
-keystore my-release-key.keystore my_application.apk alias_name

 

这个例子命令行提示你为keystore和key输入密码,然后它将这个APK文件替换成已签名的。备注:可使用不同的key为APK文件进行多次的签名。

4、  标识APK文件已签名,如:

$ jarsigner -verify -verbose -certs my_application.apk

 

5、  使用 zipalign最后校正APK文件

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

 

zipalign确保所有未压缩的数据以特定的字节开始对齐相对于文件的开始,这样,可以减少应用对RAM的消耗。

0 0
原创粉丝点击