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>