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

第一部分: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)如下图。
Android Studio apk系统签名和版本描述的实现_第1张图片

3.制作步骤
使用Android studio 生成你自己的 jks 文件
Android Studio apk系统签名和版本描述的实现_第2张图片
如果,之前没有的就新建,点击Create New … 设置密码(易记,建议123456),如下图:
Android Studio apk系统签名和版本描述的实现_第3张图片
然后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脚本,如下图:
Android Studio apk系统签名和版本描述的实现_第4张图片


配置builde.gradle
为了使自己发布的apk更具保密性,将签名信息放在项目gradle.property下。
Android Studio apk系统签名和版本描述的实现_第5张图片
在modle的builde.gradle下配置
Android Studio apk系统签名和版本描述的实现_第6张图片


如果想直接Run app就是release版且带系统签名的apk,还需修改:
Android Studio apk系统签名和版本描述的实现_第7张图片


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配置
Android Studio apk系统签名和版本描述的实现_第8张图片

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

你可能感兴趣的:(android开发类)