一、系统签名

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

  • 普通应用开发:使用公司自定义 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),那么可以在以下网址中找到这几个签名文件:

  • https://github.com/aosp-mirror/platform_build/tree/master/target/product/security
  • https://github.com/techexpertize/SignApk
  • https://github.com/maks/aosp-signapk

注:如果是 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 还可以指定其他值,详情说明可通过以下文章了解:https://www.cnblogs.com/scarecrow-blog/p/4876628.html

另外,如果你是 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),以下是它的仓库地址:

  • https://github.com/getfatday/keytool-importkeypair

将仓库中的 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_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 trueproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'signingConfig signingConfigs.platform}debug {initWith(buildTypes.release)debuggable trueminifyEnabled false}}...
}

注:initWith(otherBuildType) 可以让当前 buildType(debug)复制其他 buildType(release)的配置,减少相同配置的代码量。虽然这很方便,但是一定要注意,如果是 debug 构建类型,一定要指定其 debuggable 为 true(因为 release 的 debuggable 默认为 false),否则你的工程可能会无法进入 debug 模式。

至此,我们就可以像普通应用开发那样,愉快的开发系统应用了。

Android - 自动系统签名相关推荐

  1. PhoneGap/Cordova Android应用签名发布系列问题处理收集

    PhoneGap/Cordova Android应用签名发布注意事项 Android APK 签名比对 android获取签名,兼容5.0 Android APK 签名比对,防止软件被破解使用 用ap ...

  2. Android 应用开发(33)---Android程序签名打包

    Android程序签名打包 第一章的倒数第二节,本节给大家介绍的是如何将我们的程序打包成Apk文件,并且为我们的Apk签名! 上一节中已经说了,我们后续的教程使用的IDE是Android Studio ...

  3. Android APK 签名比对

    Android APK 签名比对 转载请注明出处:http://www.blogjava.net/zh-weir/archive/2011/07/19/354663.html Android APK  ...

  4. Android APK签名原理

    Android APK 签名原理涉及到密码学的加密算法.数字签名.数字证书等基础知识,这里做个总结记录. 非对称加密 需要两个密钥,一个是公开密钥,另一个是私有密钥:一个用作加密的时候,另一个则用作解 ...

  5. Android App签名的那些事

    App签名 Android App签名的目的是确保App的安装包来自于原创的作者,且App没有被篡改.Android手机是如何设别App来自于原创的作者且没有被篡改呢?请看App签名以及验签原理. A ...

  6. 对Android apk 签名 --apksigner

    Android自签名方法,仅作记录. 因 apksigner 签名工具支持V1和V2签名,所以选用它 进行手动签名: 步骤如下: 切到Android SDK/build-tools/SDK版本, 输入 ...

  7. Android 应用签名

    Android 应用签名是应用打包过程的重要步骤之一,Google 要求所有的应用必须被签名才可以安装到 Android 操作系统中.Android 的签名机制也为开发者识别和更新自己应用提供了方便. ...

  8. android app签名详解

    本文及文中图片转自:https://mp.weixin.qq.com/s?__biz=MzIwMzYwMTk1NA==&mid=2247493825&idx=1&sn=e926 ...

  9. Android平台签名证书(.keystore)生成指南

    来源:https://ask.dcloud.net.cn/article/35777 Android平台签名证书(.keystore)生成指南 分类:HTML5+ Android证书 Android平 ...

最新文章

  1. 做项目经理到底有多爽?
  2. 的python如何降级_提效降本:蚂蚁金服如何用融合计算改造在线机器学习
  3. Python-EEG工具库MNE中文教程(9)-参考电极应用
  4. Dialog外部点击事件
  5. python 读取geotiff_科学网—利用python GDAL库读写geotiff格式的遥感影像方法 - 张伟的博文...
  6. 计算机专业英语基础篇
  7. python数据收集整理教案_《数据收集整理(例1)》教案
  8. Maven常见警告解决办法
  9. 第3讲 | 浅说区块链共识机制
  10. 汉语拼音/pinyin4j
  11. mysql数据库分析结果与结论_mysql数据库show processlist结果分析
  12. IOS 支付宝支付开发流程
  13. 计算机与生活的ppt,计算机应用基础说课PPT
  14. vbox虚拟机安装ssh工具远程连接安装docker
  15. java 将json写入txt_关于json:在java中将String写入文本文件
  16. quota 磁盘配额管理
  17. 自然语言处理就业前景怎么样?
  18. HTTP状态码常见的状态码!
  19. Web 服务系列标准和规范
  20. 一个简单的shell脚本--判断网段主机IP存活情况

热门文章

  1. Windows命令行(cmd)指令合集
  2. iic jy901 单片机_用STM32的IIC引脚去读JY901陀螺仪和磁力计的数据
  3. Unity菜单树 TreeView
  4. 【spring1.00】jar包都正确,出现Error:(10, 30) java: 无法访问org.springframework.beans.factory.BeanNameAware 找不到
  5. 从一碗面条到一碗浆糊,再到哪里?
  6. Exp2 后门原理与实践
  7. 【图像处理】A Skinned Multi-Person Linear Model(SMPL)浅解析
  8. 意法半导体(ST)7月10日宣布收购TouchGFX
  9. python语言的开题报告怎么写_论文开题报告怎么写?
  10. DEJA_VU3D - Cesium功能集 之 054-模拟火箭发射全过程