欢迎重视微信公众号:FSA全栈举动

一、体系签名

以下是两类使用开发场景:

  • 一般使用开发:使用公司自定义 keystore 进行签名,如:微信、支付宝
  • 体系使用开发:使用 AOSP 体系签名或厂商自定义 keystore 进行签名,如:设置、录音

体系使用开发相对于一般使用开发拥有更高的权限,能够使用一些体系等级的 API,比如:

  • 静默装置(android.permission.INSTALL_PACKAGES
  • 屏幕抓取(SurfaceControl#createDisplay
  • 设备音频抓取(AudioSource.REMOTE_SUBMIX
  • 使用外悬浮窗

体系使用开发只适用于以下几类开发者:

  • Android 体系定制开发者(自主拥有体系签名)
  • Android 体系厂商协作开发者(能拿到厂商的自定义体系签名)

温馨提示:假如你不属于以上类别,那么你要清楚,没有体系签名一切都是空谈。

1、装备

体系使用开发需求在清单文件根节点指定 sharedUserId

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:sharedUserId="android.uid.system">
    ...
</manifest>

2、签名

装备完 android:sharedUserId="android.uid.system" 之后,此时的 app 是无法成功装置到设备的,控制台会提示 INSTALL_FAILED_SHARED_USER_INCOMPATIBLE,这是由于此时 app 已经被识别为体系使用,可是其签名信息却不是体系签名,于是无法经过体系检验。进行体系签名需求准备好如下几个文件:

  • platform.pk8:签名证书
  • platform.x509.pem:签名证书
  • signapk.jar:签名东西

假如你的设备是纯纯的原生体系(AOSP),那么能够在以下网址中找到这几个签名文件:

  • github.com/aosp-mirror…
  • github.com/techexperti…
  • github.com/maks/aosp-s…

注:假如是 Android 体系厂商协作开发 这种场景(自定义过体系签名),那么以上文件应该让协作厂商供给。

签名文件准备好之后,就能够经过以下指令对 app-unsigned.apk 进行体系签名了:

java -jar signapk.jar platform.x509.pem platform.pk8 app-unsigned.apk signed.apk

指令履行之后,生成出来的 signed.apk 文件就已经是经过体系签名的了。

3、装置

履行 adb install signed.apk 指令后,发现这次就能够正常装置了。经过 adb install 这种方式,就跟咱们平常一般使用开发相同,apk 会被装置到 /data/app/ 目录下,可是由于指定了 android:sharedUserId="android.uid.system",所以,这时的 app 会被认为是体系使用,能够使用体系权限。

注:除了 android.uid.system 以外,sharedUserId 还能够指定其他值,详情阐明可经过以下文章了解:www.cnblogs.com/scarecrow-b…

另外,假如你是 Android 体系定制开发者,你也能够将该 apk 文件放置到 /system/app/system/priv-app 目录下,之后 体系烧录 或 OTA 升级时就会主动携带上该体系使用。

二、主动签名

经过上面的几个步骤后,咱们确定能将自己开发好的体系使用成功装置到设备上,可是,你会发现签名环节太麻烦了,每次都要手动对 apk 进行签名,十分不利于开发和调试。当然,咱们能够经过编写 gradle 脚本,在项目每次编译完结时,履行主动签名使命,可是这种方式并不是最优解,还有一种更简单的方式。

1、生成体系签名文件

咱们知道,Android 项目中能够在 build.gradle 文件的 signingConfigs 域中装备咱们的自定义签名文件(*.jks),在装备好 buildTypes 之后,每次编译时 gradle 都会主动对 apk 进行签名,那这个签名文件(*.jks)能不能是体系签名文件呢?答案是能够的。keytool-importkeypair 这个东西能够将体系签名信息(*.pk8*.pem)导入到现有签名文件中(*.jks),以下是它的库房地址:

  • github.com/getfatday/k…

将库房中的 keytool-importkeypair 文件下载下来,然后履行以下指令:

# 语法:
# keytool-importkeypair [-k keystore] [-p storepass] -pk8 pk8 -cert cert -alias key_alias

# 示例:
keytool-importkeypair -k platform.jks -p 123456 -pk8 platform.pk8 -cert platform.x509.pem -alias platform

注:上面示例中 platform.jks 是我自己创立的签名文件(不知道怎样创立签名文件的请自行 ChatGPT~),请依据你自己项目的实际情况,修正 keystore、storepass、key_alias 等参数。

有一点需求特别注意,keytool-importkeypair 是 shell 脚本,在 Unix 体系下能够直接运行,可是在 Windows 体系下(cmd 或 PowerShell)是无法直接运行的,这时能够借助 Git Bash 来履行该指令。

Android - 自动系统签名

注:假如你的 Git Bash 呈现乱码,能够在右键->Options->Text,将 Locale 设置为 zh_CNCharacter set 设置为 GBK 即可。假如还是乱码,那么改成 UTF8 等其他字符集逐一试试吧~。

履行指令后,原本的 platform.jks 文件会被覆盖成拥有体系签名信息的签名文件了。

2、装备体系签名文件

接下来就跟一般使用开发相同,在 app 工程的 build.gradle 文件中装备一下签名就好了:

android {
    ...
    signingConfigs {
        platform {
            storeFile file('../config/signing/platform.jks')
            storePassword "123456"
            keyAlias "platform"
            keyPassword "123456"
        }
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.platform
        }
        debug {
            initWith(buildTypes.release)
            debuggable true
            minifyEnabled false
        }
    }
    ...
}

注:initWith(otherBuildType) 能够让当时 buildType(debug)复制其他 buildType(release)的装备,削减相同装备的代码量。尽管这很方便,可是必定要注意,假如是 debug 构建类型,必定要指定其 debuggable 为 true(由于 release 的 debuggable 默认为 false),否则你的工程可能会无法进入 debug 形式。

至此,咱们就能够像一般使用开发那样,愉快的开发体系使用了。

假如文章对您有所协助, 请不吝点击重视一下我的微信公众号:FSA全栈举动, 这将是对我最大的鼓励. 公众号不仅有Android技能, 还有iOS, Python等文章, 可能有你想要了解的技能知识点哦~

Android - 自动系统签名