framework踩坑:aosp/lineageos系统apk签名导出到as进行使用

背景:

经常做framework开发或者系统应用开发时候,都会有一个很熟悉的名词“系统签名”,因为有了系统签名才可以有比普通第三方应用更高的权限,很多核心函数才可以进行调用成功等。所以在做系统应用开发经常要把自己的apk进行相关的签名,但是具体怎么对系统应用进行签名呢?
一般可以有如下2个情况:
1、本身系统应用的代码源码集成,Android.bp或mk指定platform签名,就是随aosp系统编译出apk,这种情况只需要对系统进行整编,或者对apk进行单独模块编译make xxxx目标既可以。这样out目录出来的apk就自带了系统前面

2、但是很多公司的系统应用,为了开发效率的提高,或者本身代码就是独立于系统的。他们采用集成方式是apk进行集成,这种其实就和我们android studio开发没啥区别,编译apk也是android studio直接编译的。相当于与系统没有任何耦合,这种编译apk时候就需要考虑使用系统签名才可以。

在这里插入图片描述
但是针对android studio编译的apk如何自带系统签名呢?这个具体怎么做呢?

制作系统签名文件

1、导出lineage或者aosp系统自带的签名文件
源码根目录执行如下命令:

cd build/target/product/security/
ls | grep platform
platform.pk8
platform.x509.pem

可以看到在build/target/product/security/有两个platform的两个文件都拷贝到单独目录

在这里插入图片描述

2、执行命令生成platform.pem文件

openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out platform.pem -nocrypt

3、执行命令生成的platform.pk12文件

# 生成platform.pk12,别名为platform,密码是:android
openssl pkcs12 -export -in platform.x509.pem -out platform.p12 -inkey platform.pem -password pass:android -name platform

4、生成对应的platform.jks

test@test:~/disk2/platform-signed$ ~/android-studio/jre/bin/keytool -importkeystore -deststorepass android -destkeystore platform.jks -srckeystore platform.p12 -srcstoretype PKCS12 -srcstorepass android
Importing keystore platform.p12 to platform.jks...
Entry for alias platform successfully imported.
Import command completed:  1 entries successfully imported, 0 entries failed or cancelled

Warning:
<platform> uses the MD5withRSA signature algorithm which is considered a security risk.
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore platform.jks -destkeystore platform.jks -deststoretype pkcs12".


ps:这里最重要就是keytool使用的要和android studio对应的jre目录的一致,一定要注意这里的keytool要注意它对应的java版本,如果java版本不对会导致生成的platform.jks无法被android studio编译,会不断报错Invalid keystore format

Execution failed for task ':app:packageDebug'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
   > com.android.ide.common.signing.KeytoolException: Failed to read key platform from store "/home/test/AndroidStudioProjects/ANRDemo/app/platform.jks": Invalid keystore format

* Try:

具体android studio的jre目录确定:
在这里插入图片描述所以我们这里的没有用默认keytool,而是使用~/android-studio/jre/bin/keytool下面的。

做完上面几步既可以目录下看到关键的签名文件platform.jks:

在这里插入图片描述
使用它导入到android studio既可以编译了.

android studio使用签名文件编译

拷贝platform.jks到as过程的app目录:
在这里插入图片描述
然后修改app下面的build.gradle文件

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

再进行编译:
在这里插入图片描述
编译成果后,进行安装:

test@test:~/AndroidStudioProjects/ANRDemo$ adb install -r app/build/outputs/apk/debug/app-debug.apk
Success

直接可以安装成功了,本身apk属于内置apk

test@test:~/disk2/platform-signed$ adb shell dumpsys package android | grep "signatures:"
    signatures=PackageSignatures{24b8cda version:3, signatures:[b4addb29], past signatures:[]}
test@test:~/disk2/platform-signed$ adb shell dumpsys package com.example.anrdemo| grep signa
    signatures=PackageSignatures{114d882 version:2, signatures:[b4addb29], past signatures:[]}
    signatures=PackageSignatures{114d882 version:2, signatures:[b4addb29], past signatures:[]}

dumpsys可以看到确实属于系统platform签名

本文参考链接:https://mp.weixin.qq.com/s/W6l8ok78SD6gE4e1PD74RA

更多framework干货,请关注公众号“千里马学框架”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值