欢迎重视微信公众号: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
来履行该指令。
注:假如你的
Git Bash
呈现乱码,能够在右键->Options->Text,将Locale
设置为zh_CN
,Character 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等文章, 可能有你想要了解的技能知识点哦~