参考文章:
从事 Android 开发也有几个年头了,日常的工作中,虽然也对打包加固有所接触,但一直没有清晰的工作步骤,因为在大厂或者成熟的小公司中,都会搭建打包平台,安装包的加固,也不需要每个研发去实际操作。因此,本文为您总结 Android App 安装包的签名、打包和加固流程。
签名
Android 系统要求所有 APK 必须先使用证书进行数字签名,然后才能安装到设备上或进行更新。
计算机加密通常为密钥对:公钥和私钥,成对出现,就像是一把锁和能打开这把锁的钥匙,公钥是锁,密钥是钥匙。在 https 加密机制中,还会有证书的概念。这一部分可以自行去了解。
Android 的密钥库文件的类型是 .jks 或 .keystore ,是用作证书和私钥存储库的二进制文件。
公钥证书(.der
或 .pem
文件,也称为数字证书或身份证书)包含公钥/私钥对中的公钥,以及可以标识持有对应私钥的所有者的一些其他元数据(例如名称和位置)。
为了避免中间人攻击, HTTPS 在浏览器中预置了 CA 证书来验证网站的身份,而 apk 打包不存在 C/S 这种架构模式,也就无需通过在客户端预设的证书来验证身份;而是可以直接通过在公钥证书中附加一些私钥的信息(名称和位置等),来查找对应的私钥。
官方文档中提供了两种密钥,用来打包和上传 Play 商店两种用途:
- 应用签名密钥:用于为用户设备上安装的 APK 签名的密钥。作为 Android 安全更新模型的一部分,应用签名密钥在应用的整个生命周期内保持不变。应用签名密钥属于私钥,因此必须保密。不过,您可以与他人共享使用应用签名密钥生成的证书。
- 上传密钥:在上传 App Bundle 或 APK 以通过 Google Play 为应用签名之前,您可以使用上传密钥为 App Bundle 或 APK 签名。您必须对上传密钥做好保密工作。不过,您可以与他人共享使用上传密钥生成的证书。您可以通过以下任一种方式生成上传密钥:
- 如果要让 Google 在您选择加入计划时为您生成应用签名密钥,那么您用于为应用签名以进行发布的密钥将被指定为上传密钥。
- 如果您在将新应用或现有应用加入计划时向 Google 提供应用签名密钥,那么您可以在选择加入计划的过程中或之后生成新的上传密钥,以提高安全性。
- 如果您没有生成新的上传密钥,就会继续将您的应用签名密钥用作上传密钥来为每个版本签名。
使用 Android App Bundle 格式发布应用时,需要先使用上传密钥为 app bundle 签名,然后才能将其上传到 Play 管理中心,其余操作则由 Play 应用签名功能完成。对于在 Play 商店中(适用于 2021 年 8 月之前创建的应用)或其他商店中使用 APK 分发的应用,必须为 APK 手动签名才能上传。
为什么新项目没有配置签名也可以打包?
前面提到了 Android 系统要求所有 APK 都必须先使用证书进行数字签名,那么疑问来了,为什么我在 Android Studio 创建一个新项目,什么都不做也能 run 起来安装到设备上?
这是因为从 IDE 中运行或调试您的项目时,Android Studio 会自动使用由 Android SDK 工具生成的调试证书为您的应用签名。当您首次在 Android Studio 中运行或调试项目时,IDE 会自动在 $HOME/.android/debug.keystore
中创建调试密钥库和证书,并设置密钥库和密钥密码。
当然了这样做是无法发布应用的:由于调试证书由构建工具创建并且在设计上不安全,因此大多数应用商店(包括 Google Play 商店)都不接受使用调试证书为要发布的应用签名。
Android Studio 会自动将您的调试签名信息存储在签名配置中,因此您不必在每次调试时都输入此信息。签名配置是一种包含为应用签名所需全部信息的对象,这些信息包括密钥库位置、密钥库密码、密钥名称和密钥密码。
生成签名
请参考官方文档:生成上传密钥和密钥库 。
在项目中配置签名
在生成 keystore 文件后,在 app 目录下的 build.gradle 文件中添加 signingConfigs 配置:
android {
// ...
/*必须放在 buildTypes 前面,否则 signingConfig signingConfigs.release 调用会报错,无法识别 release 属性*/
signingConfigs {
release {
storeFile rootProject.file('keystore.jks')
storePassword 'android'
keyAlias 'key'
keyPassword 'android'
}
debug {
storeFile rootProject.file('keystore.jks')
storePassword 'android'
keyAlias 'key'
keyPassword 'android'
}
}
buildTypes {
release {
// ...
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
// ...
signingConfig signingConfigs.debug
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
在 signingConfigs 代码块中为不同的 build variants 添加密钥库文件的相关信息,然后在 buildTypes 代码块中启用不同的签名配置 signingConfig signingConfigs.release
。
这样在构建不同版本的安装包时,就会使用不同的签名进行打包。
加固
Android 的软件文件类型是 apk,说到底也是个压缩文件,通过反编译后,可以将其转换为源码,通常经过混淆等机制后反编译后的代码阅读起来十分困难,但仍不排除会被理解。也就是说,如果要做安全,需要从两方面入手:
- 加固:防止 apk 被反编译
- 混淆:增加反编译后的代码阅读理解的难度
加固的方案有两种,这里的内容参考的文章是 APK加固原理详解 :
- 方式一:直接对 apk 进行加密,启动应用时通过壳程序去加载 apk 运行;
- 方式二:仅对原 apk 的 dex 文件进行加密,启动应用时对 dex 解密,通过 DexClassLoader 进行加载。
加固技术方案这里不展开讲,后续会单独出一篇文章。朋友们可参考 《APK加固原理详解 》这篇文章。
360 免费加固实践
下面介绍 360 加固助手在 mac 上的免费加固实践流程。
登录后选择应用加固,
然后将您的 apk 文件拖到界面中或者选择添加应用,选择你的 apk 文件,会提示你:
然后进行配置:
点击添加后,会自动开始加固,当加固完成后,会提示是否打开输出目录:
打开后就得到了加固后的安装包了。
今天的文章Android 签名、打包加固实践分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/21949.html