Android Studio apk系统签名和版本描述的实现

来源:互联网 发布:java md5 编辑:程序博客网 时间:2024/06/04 01:06

第一部分:Android Studio apk系统签名

背景描述:

有时候,我们开发的apk需要用到系统权限,需要在AndroidManifest.xml中添加共享系统进程属性:
android:sharedUserId=”android.uid.system”
android:sharedUserId=”android.uid.shared”
android:sharedUserId=”android.media”
这时候apk的签名就需要是系统签名(platform、shared或media)才能正常使用。


常用APK签名方式:

第一种: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了。


第二部分: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

0 0
原创粉丝点击