Framework | 如何配置系统App在Android Studio下的开发环境?

科技   2024-08-14 05:20   浙江  

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. 1. 提取 APK 的证书文件: APK 文件是一个压缩文件,你可以使用 unzip 命令来解压并提取证书文件。

    unzip -p your-app.apk META-INF/CERT.RSA > CERT.RSA

注意apk签名不一定是rsa算法,也可能使用EC算法,那么证书文件名就是CERT.EC

  1. 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. 1. 编译或下载你需要签名的 APK 文件

  2. 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. 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. 1. 构建你的 AOSP 项目

  2. 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做好备份。


虎哥Lovedroid
Android技术达人 近10年一线开发经验 关注并分享Android、Kotlin新技术,新框架 多年Android底层框架修改经验,对Framework、Server、Binder等架构有深入理解
 最新文章