Framework | 如何配置系统App在Android Studio下的开发环境?
将system 平台签名引入到Android Studio开发环境
为了系统App开发调试方便,避免权限障碍,我们将平台签名转成.jks格式的签名文件,这样通过gradle编译的apk直接有了系统签名,运行到设备后直接作为平台应用安装。
查看签名
你可以使用 apksigner 或 keytool 工具来查看 APK 文件的签名信息。
方法1 apksigner
apksigner 是 Android SDK 中的一部分,它可以用来检查 APK 文件的签名。
~/Android/Sdk/build-tools/30.0.3/apksigner verify --verbose --print-certs your-app.apk
方法2 keytool
如果你只需要查看 APK 的证书信息,可以使用 keytool
。
1. 提取 APK 的证书文件: APK 文件是一个压缩文件,你可以使用
unzip
命令来解压并提取证书文件。unzip -p your-app.apk META-INF/CERT.RSA > CERT.RSA
注意apk签名不一定是rsa算法,也可能使用EC算法,那么证书文件名就是CERT.EC
1. 使用
keytool
查看证书信息:keytool -printcert -file CERT.RSA
这个命令会输出证书的详细信息,包括颁发者、有效期等。
总结
•
apksigner
: 更适合用于检查 APK 文件的完整签名信息。•
keytool
: 主要用于查看证书的详细信息。
选择合适的工具,根据你的需求来查看 APK 签名信息。
使用平台签名给apk签名
在 Android AOSP(Android Open Source Project)中,如果你想用平台签名来给 APK 签名,通常需要使用 AOSP 提供的密钥进行签名。平台签名允许你的应用具有更高的权限,例如访问系统 API。以下是具体的步骤。
1. 准备签名密钥
在 AOSP 中,平台签名密钥通常位于以下路径下:
<android_source_root>/build/target/product/security/
其中包含了一些默认的密钥对,例如:
•
platform.pk8
•
platform.x509.pem
这些密钥用于签署系统应用。
2. 使用 apksigner
进行签名
Android SDK 中的 apksigner
工具可以用于使用这些密钥对 APK 文件进行签名。例如小编的apksigner路径为Android/sdk/build-tools/34.0.0/apksigner
步骤
1. 编译或下载你需要签名的 APK 文件。
2. 使用
apksigner
签名:
假设你在 AOSP 源代码的根目录下,并且 APK 文件的位置为 path/to/your-app.apk
。
Android/sdk/build-tools/34.0.0/ apksigner sign --key build/target/product/security/platform.pk8 --cert build/target/product/security/platform.x509.pem --out path/to/your-signed-app.apk path/to/your-app.apk
•
--key
指定用于签名的私钥文件(platform.pk8
)。•
--cert
指定用于签名的证书文件(platform.x509.pem
)。•
--out
指定签名后的 APK 输出位置。• 最后一个参数是原始的 APK 文件路径。
1. 验证签名(可选):你可以使用
apksigner
来验证 APK 的签名是否成功:
Android/sdk/build-tools/34.0.0/apksigner verify --verbose path/to/your-signed-app.apk
3. 使用 sign_target_files_apks
工具进行批量签名
如果你正在构建整个 AOSP 项目并希望自动对所有系统应用进行签名,可以使用 sign_target_files_apks
工具。
步骤:
1. 构建你的 AOSP 项目。
2. 运行
sign_target_files_apks
工具:这个工具会对 AOSP 项目中的所有系统应用和框架进行签名。build/tools/releasetools/sign_target_files_apks \
-o path/to/signed_target_files.zip \
-d build/target/product/security \
path/to/unsigned_target_files.zip这里的
path/to/unsigned_target_files.zip
是你构建的 AOSP 项目生成的未签名的目标文件,而path/to/signed_target_files.zip
是生成的已签名的文件。
4. 部署和测试
一旦签名完成,你可以将签名后的 APK 部署到设备上进行测试。
adb install -r path/to/your-signed-app.apk
注意事项
• 签名密钥的安全性:确保平台签名密钥(
platform.pk8
和platform.x509.pem
)的安全性,因为拥有这些密钥的任何人都可以生成具有系统级权限的应用。• 权限:使用平台签名会使你的应用拥有较高权限,必须谨慎管理这些权限,以避免潜在的安全风险。
通过这些步骤,你可以在 Android AOSP 中使用平台签名对 APK 进行签名。
将平台签名转换成.jks文件
在平台签名目录下<android_source_root>/build/target/product/security/
在 Android 开发中,如果你需要将系统签名文件(platform.pk8
和 platform.x509.pem
)转换为 JKS 格式的签名文件(platform.jks
),可以按照以下步骤操作。
1. 准备工作
确保你已经拥有系统签名文件 platform.pk8
和 platform.x509.pem
,并将它们放置在同一个目录下。
2. 生成 platform.pem
首先,需要将 platform.pk8
文件转换为 PEM 格式。使用以下命令:
openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem
• 解释:
•
-inform DER
指定输入格式为 DER。•
-nocrypt
表示不加密 PEM。•
-in platform.pk8
指定输入的私钥文件。•
-out platform.pem
指定输出的 PEM 文件。
3. 生成 platform.p12
接下来,将生成的 platform.pem
和 platform.x509.pem
合并为 PKCS#12 格式的密钥库文件 platform.p12
。使用以下命令:
openssl pkcs12 -export -in platform.x509.pem -out platform.p12 -inkey platform.pem -password pass:123456 -name key0
• 解释:
•
-export
表示将文件导出为 PKCS#12 格式。•
-in platform.x509.pem
指定输入的证书文件。•
-out platform.p12
指定输出的 PKCS#12 文件。•
-inkey platform.pem
指定输入的私钥文件。•
-password pass:123456
设置 PKCS#12 文件的密码为123456
。•
-name key0
指定密钥的别名为key0
。
4. 生成 platform.jks
现在将 platform.p12
文件转换为 JKS 格式的密钥库文件 platform.jks
。使用以下命令:
keytool -importkeystore -deststorepass 123456 -destkeystore platform.jks -srckeystore platform.p12 -srcstoretype PKCS12 -srcstorepass 123456
• 解释:
•
-deststorepass 123456
设置 JKS 密钥库的密码为123456
。•
-destkeystore platform.jks
指定输出的 JKS 文件名为platform.jks
。•
-srckeystore platform.p12
指定输入的 PKCS#12 文件。•
-srcstoretype PKCS12
指定输入文件的格式为 PKCS#12。•
-srcstorepass 123456
输入 PKCS#12 文件的密码。
5. 处理警告信息
在执行上述命令时,你可能会看到以下警告:
Warning:
JKS 密钥库使用专用格式。建议使用 “keytool -importkeystore -srckeystore ./platform.jks -destkeystore ./platform.jks -deststoretype pkcs12” 迁移到行业标准格式 PKCS12。
该警告提示你将 JKS 密钥库转换为行业标准的 PKCS#12 格式。可以根据需要忽略它,或者使用提示的命令将密钥库格式转换为 PKCS#12:
keytool -importkeystore -srckeystore platform.jks -destkeystore platform.jks -deststoretype pkcs12
6. 结果
经过以上步骤,你将得到一个 platform.jks
文件,这个文件就是系统签名的 JKS 格式密钥库文件。以后你可以像平常一样使用这个文件来签名你的 APK。
7. 应用 platform.jks
进行签名
将 platform.jks
文件配置到你的 Android 项目中,可以使用它来签名 Release 版本和 Debug 版本的 APK,确保在开发和调试过程中都使用相同的签名。
android {
signingConfigs {
create("release") {
keyAlias = "key0"
keyPassword = "123456"
storeFile = file("platform.jks")
storePassword = "123456"
}
}
buildTypes {
getByName("release") {
signingConfig = signingConfigs.getByName("release")
}
getByName("debug") {
signingConfig = signingConfigs.getByName("release")
}
}
}
通过这些步骤,你就可以成功将系统签名文件转换为 JKS 签名文件,并在你的 Android 项目中使用它来签名 APK。
查看jks证书信息
要查看 JKS 文件的详细信息,可以使用 keytool
工具。keytool
是 Java 开发工具包 (JDK) 中的一个命令行实用程序,专门用于管理密钥库和证书。以下是一些常见的命令,用于查看 JKS 文件中的信息。
1. 查看密钥库内容
使用以下命令查看 JKS 文件中包含的所有条目(密钥对和证书):
keytool -list -v -keystore platform.jks
• 解释:
•
-list
:列出密钥库中的所有条目。•
-v
:启用详细模式,显示每个条目的详细信息。•
-keystore platform.jks
:指定要查看的密钥库文件。
执行该命令后,系统将提示你输入密钥库的密码。如果密码正确,你将看到密钥库中的所有条目及其详细信息。
2. 查看特定别名的条目信息
如果你只想查看 JKS 文件中某个特定别名(alias)的条目信息,可以使用以下命令:
keytool -list -v -keystore platform.jks -alias key0
• 解释:
•
-alias key0
:指定要查看的别名为key0
。
3. 查看密钥库中的证书信息
如果你只想查看 JKS 文件中的证书信息,可以使用以下命令:
keytool -list -rfc -keystore platform.jks
• 解释:
•
-rfc
:以 RFC 格式显示证书(通常是 PEM 格式)。
4. 查看证书指纹
要查看证书的指纹(例如 SHA-256 指纹),可以使用以下命令:
keytool -list -keystore platform.jks -alias key0 -storepass 123456 -v | grep "SHA256:"
• 解释:
•
-storepass 123456
:指定密钥库的密码为123456
。•
grep "SHA256:"
:过滤输出,显示 SHA-256 指纹。
5. 查看证书的有效期
如果你想检查 JKS 文件中证书的有效期,可以使用以下命令:
keytool -list -v -keystore platform.jks -alias key0 | grep "Valid from:"
• 解释:
•
grep "Valid from:"
:过滤输出,显示证书的有效期信息。
示例输出
当你运行 keytool -list -v -keystore platform.jks
命令时,你可能会看到类似以下的输出:
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 1 entry
Alias name: key0
Creation date: Aug 13, 2024
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Your Name, OU=Your Unit, O=Your Organization, L=Your City, ST=Your State, C=Your Country
Issuer: CN=Your Name, OU=Your Unit, O=Your Organization, L=Your City, ST=Your State, C=Your Country
Serial number: 1234567890abcdef
Valid from: Mon Aug 13 15:00:00 UTC 2024 until: Tue Aug 13 15:00:00 UTC 2025
Certificate fingerprints:
SHA1: AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD
SHA256: AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3
通过这些命令,你可以查看 JKS 文件中的各种信息,包括密钥对、证书链、证书指纹、有效期等详细内容。这对于管理和验证你的签名证书非常有用。
使用system SDK替换android sdk
由于官方发布的android sdk是面向普通应用开发者的,相关的api都是public级别的,所以对于一些hide及System级别的API,普通应用开发者是看不到,所以开发者导入的应用代码如果调用到了hide及System级别的API,则会报红,点击也无法跳转。所以作为系统app开发者需要导入system sdk。
假设系统应用开发者已经拥有了一套完整的AOSP源码,并且已经实现了完整编译,那么你需要将public SDK替换为 system SDK。
例如你新建了一个App,默认引用的是API为34的sdk, 那么android.jar路径为 Android/sdk/platforms/android-34/android.jar
需将下面路径的classes.jar重命名为android.jar,并替换掉上面public级别的android.jar out/target/common/obj/JAVA_LIBRARIES/sdk_system_current_android_intermediates/classes.jar
注意:为了后期能够恢复public sdk环境,你可以将public android.jar做好备份。