• Android Studio 利用系统签名打包apk


    一、概述

        在开发的时候,如果涉及到需要给apk添加android:sharedUserId="android.uid.system" 属性,变为系统级apk,安装时,需要先进行签名再安装。不然会提示安装失败。
    通过adb install  安装apk的时候,提示应用未签名提示:  INSTALL_PARSE_FAILED_NO_CERTIFICATES 。
    提示内容如下:[INSTALL_PARSE_FAILED_NO_CERTIFICATES: Failed to collect certificates from /data/app/vmdl979122267.tmp/base.apk: Attempt to get length of null array]
    这时候需要对应用进行签名。如何知道应用是否签名成功可以解压apk 查看  META-INF 文件中是否存在 CERT.RSA 文件,如果不存在则说明没签名。需要对其进行签名。

    二、生成系统签名文件

    在安卓系统源码目录:
     build/target/product/security/
    按步骤执行以下操作:
    1. openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem
    2. openssl pkcs12 -export -in  platform.x509.pem -out platform.p12 -inkey  platform.pem -password pass:pwdpwd -name platform
    3. keytool -importkeystore -deststorepass android -destkeystore ./platform.jks -srckeystore ./platform.p12 -srcstoretype PKCS12 -srcstorepass pwdpwd

    执行完以上步骤之后,会生成 platform.jks 文件,如果命名是platform.keystore则 命名为 platform.keystore

    三、在build.gradle 中配置签名 打包apk

    1. signingConfigs {
    2.     platform {
    3.         //将系统签名文件platform.keystore 放在projectName/app/ 目录下
    4.         storeFile file('platform.keystore')
    5.         storePassword 'pwdpwd' // 对应-srcstorepass
    6.         keyAlias 'platform' //对应-name
    7.         keyPassword 'pwdpwd' // 对应-pass
    8.     }
    9. }
    10. buildTypes {
    11.     release {
    12.         minifyEnabled false
    13.         proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    14.         signingConfig signingConfigs.platform
    15.     }
    16.     debug {
    17.         minifyEnabled false
    18.         proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    19.         signingConfig signingConfigs.platform
    20.     }
    21. }
    按以上配置完之后通过[Build--Build Bundle(s)--Build APK(s)]步骤打包出来的apk 仍然没有签名成功。
    小tips:如果不用[Build--Build Bundle(s)--Build APK(s)] 该步骤打包,直接run 运行编译apk也可以得到最新的apk。但直接run到真机和手动双击安装apk之间存在差异。run 可以安装成功不代表双击安装apk也可以成功。
    需要 在build.gradle 中将v1SigningEnabled 设置为true, v2SigningEnabled 设置为false 。
    1. signingConfigs {
    2.     platform {
    3.         storeFile file('platform.keystore')
    4.         storePassword 'android'
    5.         keyAlias 'androiddebugkey'
    6.         keyPassword 'android'
    7.         v1SigningEnabled true
    8.         v2SigningEnabled false
    9.     }
    10. }
    然后再打包apk。解压apk,会发现apk包中  META-INF 目录多了CERT.RSA 等 加密文件。
    以上打包的apk,通过adb install 安装可能会提示 Failure [INSTALL_FAILED_TEST_ONLY: installPackageLI] 
    此时只需在AndroidManifest.xml 中 配置 android:testOnly="false" 即可
    1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    2.     package="com.huawei.hicar"
    3.     android:sharedUserId="android.uid.system"
    4.     android:testOnly="false">
    至此,编译出来的apk,可以adb install 成功,也可以通过手动双击安装成功。注意这里的adb install 没加-r 或者 -t 安装。只是模拟用户双击安装apk的动作。

    四、小结

        安装apk时,提示 INSTALL_PARSE_FAILED_NO_CERTIFICATES ,需要给apk签名才能安装apk成功。本文概要介绍如何通过Android系统源码生成签名文件,然后通过Android Studio 配置build.gradle  打包apk。使得apk可以正常安装。 

    五、附录

    附录一:build.gradle 文件 [路径:projectName/app/src/build.gralde]
    1. plugins {
    2.     id 'com.android.application'
    3. }
    4. android {
    5.     compileSdk 28
    6.     defaultConfig {
    7.         applicationId "xxxx.xxx.xxx" //对应自身应用包名
    8.         minSdk 28
    9.         targetSdk 28
    10.         versionCode 1
    11.         versionName "1.0"
    12.         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    13.     }
    14.     signingConfigs {
    15.         platform {
    16.             storeFile file('platform.keystore')
    17.             storePassword 'pwdpwd'
    18.             keyAlias 'platform'
    19.             keyPassword 'pwdpwd'
    20.             v1SigningEnabled true
    21.             v2SigningEnabled false
    22.         }
    23.     }
    24.     buildTypes {
    25.         release {
    26.             minifyEnabled false
    27.             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    28.             signingConfig signingConfigs.platform
    29.         }
    30.         debug {
    31.             minifyEnabled false
    32.             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    33.             signingConfig signingConfigs.platform
    34.         }
    35.     }
    36.     compileOptions {
    37.         sourceCompatibility JavaVersion.VERSION_1_8
    38.         targetCompatibility JavaVersion.VERSION_1_8
    39.     }
    40. }
    41. dependencies {
    42.     implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
    43.     api 'com.google.zxing:core:3.3.0'
    44. }

    附录二:Manifest.xml
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    3.     package="com.huawei.hicar"
    4.     android:sharedUserId="android.uid.system"
    5.     android:testOnly="false">
    6.  .........
    7. </manifest>

     

  • 相关阅读:
    【JVM故障问题排查心得】「内存诊断系列」JVM内存与Kubernetes中pod的内存、容器的内存不一致所引发的OOMKilled问题总结(下)
    Java 创建多线程
    vue3 吸顶搜索框在页面滚动时改变样式
    html5——CSS基础选择器
    交互设计之五要素
    私有化部署企业IM即时通讯app,群聊多样化管控
    Android studio升级Giraffe | 2022.3.1 Patch 1踩坑
    新建云仓库
    【选型】JAVA生成PPT及选型
    维格云身份认证入门教程
  • 原文地址:https://blog.csdn.net/linhuorongandroid/article/details/126761731