android-自动系统签名(代码片段)

GitLqr GitLqr     2023-03-03     710

关键词:

一、系统签名

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

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

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

将仓库中的 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 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 模式。

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

android给apk系统签名(代码片段)

...源码的platform.pk8、platform.x509.pem是不同的所以我们需要在Android源码里拿到platform.pk8、platform.x509.pem放进签名工具里即可,若已存在替换即可。获取方式一:在源码根目录下, 查看详情

android签名制作签名文件(代码片段)

...pp,如何创建一个应用签名? 2.为了安全性,Android系统不想使用Google给的原生签名,如何定制系统签名?这篇博客介绍了如何制作签名文件,首先介绍Android开发中使用到的签名文件类型,然后介绍系 查看详情

让androidstudio支持系统签名(代码片段)

...时候,我们开发的apk需要用到系统权限,需要在AndroidManifest.xml中添加共享系统进程属性:android:sharedUserId="android.uid.system"android:sharedUserId="android.uid.shared"android:sharedUserId="android.media"这时候apk... 查看详情

基于android-11.0.0_r39,系统应用的手动签名方法和过程(代码片段)

文章目录片头1.签名的命令2.签名的过程及错误2.1noconscrypt_openjdk_jni-linux-x86_642.2RegisterNativesfailedfor'org/conscrypt/NativeCrypto'2.3查找正确的libconscrypt_openjdk_jni.so3.查看APK的签名4.结束语片头基于android-11.0.0_r39这个版 查看详情

android中的权限(代码片段)

1、权限类型Android将权限分为不同的类型,包括安装时权限、运行时权限和特殊权限。每种权限类型都指明了当系统授予应用该权限后,应用可以访问的受限数据范围以及应用可以执行的受限操作范围。每项权限的保护级... 查看详情

android.mk中对apk进行签名(代码片段)

...下几个属性值:默认的四种签名类型:四组默认签名供Android.mk在编译APK使用:1、testkey:普通APK,默认情况下使用。2、platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试&#x 查看详情

android.mk中对apk进行签名(代码片段)

...下几个属性值:默认的四种签名类型:四组默认签名供Android.mk在编译APK使用:1、testkey:普通APK,默认情况下使用。2、platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试&#x 查看详情

oneflow源码解析:算子签名的自动推断(代码片段)

撰文|郑建华OneFlow是一个原生支持分布式训练的、高性能的深度学习框架。最近读了一些OneFlow的源码、架构设计和代码实现的文章,简单梳理一下自己的理解。主要通过图形展示调用过程和类之间的关系,只对部分重要... 查看详情

andorid进行签名的方式(代码片段)

目录Android签名的简介1.Android签名的作用2.签名的方式2.1签名方式的比较3.在AS上操作的一般步骤(手动签名)3.1在AS操作步骤如下图 4.apk常用的签名方法(系统签名)有两种Android签名的简介生成证书签名apk文件1.Android签名的作用确保信... 查看详情

andorid进行签名的方式(代码片段)

目录Android签名的简介1.Android签名的作用2.签名的方式2.1签名方式的比较3.在AS上操作的一般步骤(手动签名)3.1在AS操作步骤如下图 4.apk常用的签名方法(系统签名)有两种Android签名的简介生成证书签名apk文件1.Android签名的作用确保信... 查看详情

详解android项目配置签名文件的完整流程(代码片段)

...名文件配置到项目中,首先需要创建一个签名文件。androidstudio为我们提供了图形化创建方式,这里简单赘述一下࿱ 查看详情

androidapk签名详解——as签名获取签名信息系统签名命令行签名(代码片段)

Apk签名,每一个Android开发者都不陌生。它就是对我们的apk加了一个校验参数,防止apk被掉包。一开始做Android开发,就接触到了apk签名;后来在微信开放平台、高德地图等平台注册时,需要填写apk签名的md5值和sha256值;再后来做... 查看详情

electronmac签名-针对electron-builder的自动更新(代码片段)

针对electron-builder的自动更新配合自动更新-安装包签名(mac)(待补充)前提:实现自动更新需要签名一、本地开发调试mac签名(无需具有权限的appple账号)打开xcode,xcode->preference->addnewacount登录apple账号(系统会生成默认开发... 查看详情

android签名验证与反调试机制的对抗技术(代码片段)

...2.6时间差异检测2.7内置函数检测2.8调试断点检测总结前言Android的APK文件为了防止被篡改和重打包,经常会做签名校验来保证自身完整性,当程序被篡改后将提示用户或者直接退出运行。同时有些APP为了防止被攻击者动态... 查看详情

自动化打包之fastlane--代码签名和项目配置(代码片段)

自动化打包之fastlane–(1)研究之必须提前了解的几点自动化打包之fastlane–(2)fastlaneinit图文教程自动化打包之fastlane–(3)安装fir插件图文教程自动化打包之fastlane–(4)安装其他插件自动化打包之fastlane–(5)自动打包到蒲公英自动化... 查看详情

androidstudio支持系统签名(证书)(代码片段)

让AndroidStudio集成系统签名,需要用到一个工具keytool-importkeypair这个工具的作用是将系统签名的相关信息导入到已有的签名文件里。可从这里下载。相关文件platform.x509.pem、platform.pk8、keytool-importkeypair、demo.jks我的做法是在App... 查看详情

rockchip主板系统签名说明(代码片段)

...都是RockChip芯片的主板,我们要求最终运行的App都有系统权限,因此最终签名都会使用系统签名。之前都是打包完成之后再手动签名,现改成打包的时候直接使用RockChip的签名。操作手动签名先生成apk,然后使用sig... 查看详情

对android应用签名(代码片段)

  Android使用包名作为唯一标识,当在同一台手机安装两个包名相同的应用,后安装的应用就会覆盖前面的应用(签名相同的情况下)。  签名有两个主要作用:    1.确定发布者身份。由于应用开发者可以通过使用相同... 查看详情