使用AndroidStudio生成打有系统签名的apk

前言

用 Android Studio 开发应用时,adb 连接设备后,可以直接 run 运行到设备上。
当 debug 的是系统应用时,都会配置 android:sharedUserId="android.uid.system"
因为没有打系统签名, 无法直接装到设备上,不利于开发效率。
于是有了AS给应用打系统签名的需求。

要打系统签名,需要如下工具:
1.系统签名文件 platform.x509.pem platform.pk8 ; 在源码 build/target/product/security 路径下;
2.keytool-importkeypair-master 工具以及 Linux 环境;
keytool-importkeypair-master下载链接 https://github.com/getfatday/keytool-importkeypair

一、使用platform.x509.pem platform.pk8生成 jks

在Linux环境下,在 keytool-importkeypair-master 根目录放置 platform.x509.pem 、 platform.pk8 文件,进入 keytool-importkeypair-master 根目录执行

./keytool-importkeypair -k name.jks -p yourpassword -pk8 platform.pk8 -cert platform.x509.pem -alias mykeyalias

其中,name.jks 为生成的 jks,name 是 jks 的名称,随便取;
jks 的密码为 yourpassword ,一般为字母和数字;
mykeyalias 为 jks 的别名,随便取;
举例,要生成 beauty.jks,密码为 beauty100 ,别名是 love ,则命令为:

./keytool-importkeypair -k beauty.jks -p beauty100 -pk8 platform.pk8 -cert platform.x509.pem -alias love

ps:
jks 是 AndroidStudio 生成的签名。
keystore 是 Eclipse 生成的签名。

生成 keystore 文件也是可以的,如果生成的是 keystore 文件,后面的操作步骤同 jks,将对应的 jks 替换为 keystore 即可。

./keytool-importkeypair -k beauty.keystore -p beauty100 -pk8 platform.pk8 -cert platform.x509.pem -alias love

二、AndroidStudio导入jks

我的AS是 4.0 版本,为方便,将生成的 beauty.jks 放到工程的 app/ 目录下,
Build --> Generate Signed Bundle/APK -->APK --> Next
在这里插入图片描述

如图,Choose existing... 选择 app 目录下的 beauty.jks 文件;
Key store password 即为密码,对应 beauty100 ;
Key alias 为别名,对应 love ;
Key password 为别名的密码,保持和 Key store password 一致,要不然编译报错。

下一步,选择 release 版本打签名,debug版本选上也没问题,
v1 、v2 版本签名都打上,Finish
在这里插入图片描述

三、配置 app 的 build.gradle

android { } 里添加 signingConfigs {}signingConfig signingConfigs.release
signingConfigs{ } 要添加在 buildTypes{ } 之前,否则提示 signingConfigs.release 找不到

	
    signingConfigs {
        release {
            storeFile file('beauty.jks')
            storePassword 'beauty100'
            keyAlias 'love'
            keyPassword 'beauty100'
        }
        // 如果 debug 版本也打签名,则添加这一部分
        debug {
            storeFile file('beauty.jks') 
            storePassword 'beauty100'
            keyAlias 'love'
            keyPassword 'beauty100'
        }
        // 如果 debug 版本也打签名,则添加这一部分        
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }

其中,
storeFile file('beauty.jks') 指 beauty.jks 相对于 app/build.gradle 文件的路径,
我把 beauty.jks 文件放到了 app/根目录,
app/build.gradle 文件也在 app/ 根目录,所以直接这样写.

如果 beauty.jks 文件放在 app/ 同级目录,则应该这样写:
storeFile file('../beauty.jks')

也可以按照磁盘(windows)目录写:
storeFile file('D:\\xxx\\xxx\\SignedDemo\\app\\beauty.jks')

storePasswordkeyPassword' 保持一致,否则AS编译会报错: Cannot recover key

别忘了在 AndroidManifest.xml 添加 android:sharedUserId="android.uid.system"

至此,配置完成,AS 上编译出来的 app 即是具有系统签名的应用。

四、模拟测试

已经打上系统签名的应用,如何验证是否具有系统权限了呢?

4.1 模拟按键发送

模拟发送 power 键,未打系统签名的应用这样操作是无效的,打了系统签名可以实现关机。

sendKeyCode(KeyEvent.KEYCODE_POWER);

private void sendKeyCode(final int keyCode){
        new Thread() {
            public void run() {
                try {
                    Instrumentation inst = new Instrumentation();
                    inst.sendKeyDownUpSync(keyCode);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }

4.2 发送系统受限广播

尝试发送 frameworks/base/core/res/AndroidManifest.xml 文件里定义的某个广播 <protected-broadcast android:name="xxxxxx" />
未打签名的应用发送该广播,log 可看到禁止发送,功能不能正常实现;
打签名的应用发送该广播,log 不会提示禁止发送,功能也正常。

4.3 使用 SYSTEM_ALERT_WINDOW

安卓 8.0 后,非系统应用无法使用 SYSTEM_ALERT_WINDOW ,如下操作会报错

WindowManager.LayoutParams layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
                                    | WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;

系统应用则可以正常使用。

4.4 新增 persist.sys 开头的属性

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值