当前位置: 首页 > news >正文

Android Studio 利用系统签名打包apk

目录

一、概述

二、在Android 系统源码目录生成签名文件

三、在build.gradle 中配置签名 打包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/
按步骤执行以下操作:
openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem

openssl pkcs12 -export -in  platform.x509.pem -out platform.p12 -inkey  platform.pem -password pass:pwdpwd -name platform

keytool -importkeystore -deststorepass android -destkeystore ./platform.jks -srckeystore ./platform.p12 -srcstoretype PKCS12 -srcstorepass pwdpwd

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

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

signingConfigs {
    platform {
        //将系统签名文件platform.keystore 放在projectName/app/ 目录下
        storeFile file('platform.keystore')
        storePassword 'pwdpwd' // 对应-srcstorepass
        keyAlias 'platform' //对应-name
        keyPassword 'pwdpwd' // 对应-pass
    }
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.platform
    }
    debug {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.platform
    }
}
按以上配置完之后通过[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 。
signingConfigs {
    platform {
        storeFile file('platform.keystore')
        storePassword 'android'
        keyAlias 'androiddebugkey'
        keyPassword 'android'
        v1SigningEnabled true
        v2SigningEnabled false
    }
}
然后再打包apk。解压apk,会发现apk包中  META-INF 目录多了CERT.RSA 等 加密文件。
以上打包的apk,通过adb install 安装可能会提示 Failure [INSTALL_FAILED_TEST_ONLY: installPackageLI] 
此时只需在AndroidManifest.xml 中 配置 android:testOnly="false" 即可
​
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.huawei.hicar"
    android:sharedUserId="android.uid.system"
    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]
plugins {
    id 'com.android.application'
}

android {
    compileSdk 28

    defaultConfig {
        applicationId "xxxx.xxx.xxx" //对应自身应用包名
        minSdk 28
        targetSdk 28
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    signingConfigs {
        platform {
            storeFile file('platform.keystore')
            storePassword 'pwdpwd'
            keyAlias 'platform'
            keyPassword 'pwdpwd'
            v1SigningEnabled true
            v2SigningEnabled false
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.platform
        }
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.platform
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
    api 'com.google.zxing:core:3.3.0'


}

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

</manifest>

 

相关文章:

  • 升级打怪课堂的题库更新了!
  • Excel·VBA数组排列函数
  • 高级程序员项目经理写好代码必备的三条基本素质;以及代码的现象和本质问题解读;
  • 猿创征文|多模态图像合成和编辑(MISE):Multimodal Image Synthesis and Editing: A Survey
  • 网络与信息安全基础知识-- Internet及应用
  • 中秋邀请共赏图数据库-蚂蚁集团图数据TuGraph 正式开源
  • GD32F303固件库开发(14)----IIC之配置OLED
  • LeetCode 0231. 2 的幂
  • 【LeetCode】螺旋矩阵旋转图像
  • 猿创征文|网络原理——UDP/TCP协议
  • 理论第七课——sort
  • PyCharm利用pydevd-pycharm实现Python远程调试
  • Mysql中DQL(查询类)语句的执行顺序
  • CMake Tutorial 巡礼(2)_添加库
  • java毕业设计蛋糕店会员系统Mybatis+系统+数据库+调试部署
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • jquery ajax学习笔记
  • JS学习笔记——闭包
  • Kibana配置logstash,报表一体化
  • Map集合、散列表、红黑树介绍
  • PHP的Ev教程三(Periodic watcher)
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Web Storage相关
  • 区块链将重新定义世界
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 如何在GitHub上创建个人博客
  • 微服务框架lagom
  • 问题之ssh中Host key verification failed的解决
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • #传输# #传输数据判断#
  • (3)STL算法之搜索
  • (多级缓存)缓存同步
  • (二)PySpark3:SparkSQL编程
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (生成器)yield与(迭代器)generator
  • (一)Thymeleaf用法——Thymeleaf简介
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • ./configure,make,make install的作用(转)
  • .NET Core 成都线下面基会拉开序幕
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET NPOI导出Excel详解
  • .Net 路由处理厉害了
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .NET序列化 serializable,反序列化
  • :=
  • ?php echo ?,?php echo Hello world!;?
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [CLickhouse] 学习小计
  • [cocos2d-x]关于CC_CALLBACK