参阅文章:

为运用签名 – developer.android.com

从事 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,说到底也是个压缩文件,经过反编译后,能够将其转换为源码,一般经过混淆等机制后反编译后的代码阅览起来好不容易,但仍不扫除会被理解。也就是说,假如要做安全,需要从两方面下手:

  1. 加固:避免 apk 被反编译
  2. 混淆:增加反编译后的代码阅览理解的难度

加固的方案有两种,这儿的内容参阅的文章是 APK加固原理详解 :

  • 方法一:直接对 apk 进行加密,发动运用时经过壳程序去加载 apk 运转;
  • 方法二:仅对原 apk 的 dex 文件进行加密,发动运用时对 dex 解密,经过 DexClassLoader 进行加载。

加固技术方案这儿不展开讲,后续会单独出一篇文章。朋友们可参阅 《APK加固原理详解 》这篇文章。

360 免费加固实践

下面介绍 360 加固助手在 mac 上的免费加固实践流程。

下载链接:jiagu.360.cn/#/global/do…

登录后挑选运用加固,

Android 签名、打包加固实践

然后将您的 apk 文件拖到界面中或者挑选增加运用,挑选你的 apk 文件,会提示你:

Android 签名、打包加固实践

然后进行装备:

Android 签名、打包加固实践

点击增加后,会主动开端加固,当加固完结后,会提示是否翻开输出目录:

Android 签名、打包加固实践

翻开后就得到了加固后的装置包了。