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干货,请关注下面“千里马学框架”