有时候,我们开发的apk需要用到系统权限,需要在AndroidManifest.xml中添加共享系统进程属性:
android:sharedUserId=”android.uid.system”
android:sharedUserId=”android.uid.shared”
android:sharedUserId=”android.media”
这时候apk的签名就需要是系统签名(platform、shared或media)才能正常使用。
第一种:Android源码环境下签名
1. 按照系统应用的目录排布,将应用上传到源码编译服务器或虚拟机上,一般在vender目录下。或者拷贝App源码到Android源码的packages/apps/目录下,且App源码是普通(Eclipse)格式的。
2. 配置Android.mk,在其中添加
LOCAL_CERTIFICATE := platform 或 shared 或 media
3. 使用 “mmm/mm + 你的应用路径“的命令来编译你的应用;
此时,out/~目录下所生成的 apk 就有系统的权限了。
第二种:手动签名
这种方式比在源码环境下签名简单,App可以在Eclipse或Android Studio下编译,然后手动给apk重新签名即可。
文件位置:
platform.x509.pem、platform.pk8 在 ../builzaid/target/product/security目录下
signapk.jar 在 ../out/host/linux-x86/framework路径下
signapk源码路径 在 ../build/tools/signapk下
签名命令:
java -jar signapk.jar platform.x509.pem platform.pk8 old.apk new.apk
签名步骤:
1、将相关文件及源apk文件置于同一路径下
2、检查源apk包,去掉META-INF/CERT.SF 和 META-INF/CERT.RSA 文件
3、执行签名命令即可
第三种:利用bat脚本签名(只是将第二种签名方式用bat脚本来执行)
第四种:Android Studio一键Run签名实现
1.原理分析简述
就是通过Android studio 直接给 apk 加上开发者签名(jks文件),使用 keytool-importkeypair 对jks文件进行系统签名,在Run的时候,直接使用带有系统签名的 jks 对 apk 进行签名,这样编译生成的 apk 文件就自带系统签名了。
2.所需的文件
keytool-importkeypair工具的下载(这个工具的作用是将系统签名的相关信息导入到已有的签名文件里)。
在工程根目录下创建类似signApk文件夹来专门存放签名相关文件(
platform.x509.pem、platform.pk8、keytool-importkeypair、SigNature.jks、signature.sh)如下图。
3.制作步骤
使用Android studio 生成你自己的 jks 文件
如果,之前没有的就新建,点击Create New … 设置密码(易记,建议123456),如下图:
然后Next –> Finish
编写签名脚本signature.sh,内容如下
#! /bin/bash
#对变量赋值:
a="this file is tested succeesfully "
# 现在打印变量a的内容:
echo $a
# 转换系统签名命令
#./keytool-importkeypair -k SigNature.jks -p 123456 -pk8 platform.pk8 -cert platform.x509.pem -alias SigNature
./keytool-importkeypair -k SigNature.jks -p 123456 -pk8 platform.pk8 -cert platform.x509.pem -alias SigNature
# SignDemo.jks : 签名文件
# 123456 : 签名文件密码
# platform.pk8、platform.x509.pem : 系统签名文件
# SignDemo : 签名文件别名
在cmdx下,定位到signApk文件目录下,执行signature.sh脚本,如下图:
配置builde.gradle
为了使自己发布的apk更具保密性,将签名信息放在项目gradle.property下。
在modle的builde.gradle下配置
如果想直接Run app就是release版且带系统签名的apk,还需修改:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
signingConfig signingConfigs.release
}
}
这样直接Run app就是带系统签名的release版apk了。
android studio apk版本信息不再manifest里面编辑,而是在builde.gradle配置
apk输出版本编写
buildTypes {
debug {
// 显示Log
buildConfigField "boolean", "LOG_DEBUG", "true"
versionNameSuffix "-debug"
minifyEnabled false
zipAlignEnabled false
shrinkResources false
}
release {
// 不显示Log
buildConfigField "boolean", "LOG_DEBUG", "true"
// 混淆
minifyEnabled true
// Zipalign优化
zipAlignEnabled true
// 移除无用的resource文件
shrinkResources true
// 前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
//发布后apk的名称
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
def fileName
if (outputFile != null && outputFile.name.endsWith('.apk')) {
if (variant.buildType.name.equals('release')) {
fileName = "Sky_v${defaultConfig.versionName}-${"_"}-${releaseTime()}.apk"
} else if (variant.buildType.name.equals('debug')) {
fileName = "Sky_v${defaultConfig.versionName}-${"_"}-${releaseTime()}_debug.apk"
}
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
至此,本章内容介绍完毕。请大家多多指点。
转载请注明:http://blog.csdn.net/veryliu