Android Gradle实用技巧(一) | 隐藏Android签名文件和密钥信息

Android Gradle必备使用技巧,未完待续,欢迎关注公众号flysnow_org,第一时间看后续技巧

什么是Gradle

Gradle是一款非常优秀的构建系统工具,它使用可以配置的DSL语言描述构建流程,同时允许我们使用原生的Java和Groovy编码的方式进行构建,所以相比Ant、Maven这些非常灵活。

在Gradle中,大部分的构建都是通过Gradle的插件来完成的,插件是Gradle非常好的一个设计,Gradle提供了一个核心可以扩展的平台,然后通过插件来扩展Gradle的能力,灵活方便。

Gradle本身提供了非常多的插件,比如java,war,scala等,可以满足我们的绝大多数需求。如果内置的插件不能满足需求,可以使用第三方开发的插件,甚至自己开发可以满足自己需求的插件。

Gradle官网:https://gradle.org/ Gradle文档:https://gradle.org/docs Gradle插件:https://plugins.gradle.org/

如果没有梯子,下载不了Gradle,我这里有个自己搭建的镜像可以使用 http://mirrors.flysnow.org/

什么是Android Gradle

刚开始我们做Android开发的时候,采用的是Eclipse+Ant的构建方式,后来Android团队打算采用基于IDEA的Android Studio的时候,采用了Gradle进行构建,为了能和Android Studio进行无缝整合,Android团队开发了Android Gradle这个Gradle的第三方插件,用于Android的开发构建。使用Android Gradle,我们可以更好的:

  1. 代码和资源的复用
  2. 很方便的创建App的衍生版本
  3. 可以满足自定义、扩展,而且非常容易
  4. 当然不能少的,可以和Android Studio无缝整合

Android团队开发了三个Android Gradle插件,但是他们都属于一套代码库。这三个插件名字分别为:

  1. com.android.application
  2. com.android.library
  3. com.android.library

从名字上看,其实他们分别对应我们Android的 Android App开发,Android Lib库开发以及Android Test测试工程的开发。

使用这三个插件也非常容易,和Gradle使用其它插件的方式一样,因为这是一个非内置自带的,第三方插件,所以我们首先得声明classpath的依赖,才可以使用,和jdk的classpath很像。

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
    }
}

我们配置里仓库为jcenter,这样当我们配置依赖的时候,gradle就会去这个仓库里寻找我们的依赖。

然后我们在dependencies{}配置里我们需要的是Android Gradle2.2.3版本的插件。

buildscript{}这部分配置可以写到根工程的build.gradle脚本文件中,这样所有的子工程就不用重复配置了。 以上配置好之后,我们就可以应用我们的Android Gradle插件了。

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"
}

android{}是Android插件提供的一个扩展类型,可以让我们自定义Android Gradle工程。compileSdkVersion是编译所依赖的Android SDK的版本,这里是API Level;buildToolsVersion是构建该Android工程所以的构建工具的版本。

以上应用的是一个App工程插件,应用Android Library插件和Android Test插件也类似的,只需要换成相应的id即可。

隐藏Android签名文件和密钥信息

很多团队一开始的成立的时候,十来个人,三五条枪,就开始创业了,每个组基本上就一个人,扛起所有。开始的时候,大家都不知道这款产品是否可以成功,所以也都没想那么多,只能小步快跑,快速迭代,占领市场,抢占用户,这才是最重要的。

随着产品越做越好,团队越来越大,组内成员越来越多,就开始注重团队协作,编码规范,性能安全,团队建设等等,因为只有做到这些,整个团队的工作效率和产出才能更高,才能有团队的威力,越到最后靠的是团队,而不是一个人。

说着说着快跑题了,扯到团队建设和管理上了O(∩_∩)O~,这个以后有时间再交流,大家有想法也可以加微信公公众号flysnow_org一起交流。说以上那么多,就是现在团队大了,人多了,要正规了。

以前我们都是把App的签名证书和相关密钥放在项目中,托管在git上,这样做非常方便,可以直接访问打包,并且借助git这个代码管理平台维护管理。但是签名信息这个是我们应用非常重要的信息,属于公司重要的资源,所以我们要做到分级管理,保证安全,这也是公司保密措施的一部分,所以基于此,签名信息需要隐藏,但是又可以让大家都可以使用这个签名打包。

签名信息既然不能放在项目中,那么就需要有个地方存放他们,既然不能在每个开发者的电脑上,那就只能放到构建的服务器上,所以要实现这个,你还得有自己的专门用于打包发版的服务器,我们把签名文件和密钥信息放到服务器上,在打包的时候去读取即可,下面我们以使用环境变量的方式为例,当然还有更多方式,比如配置文件等等。

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    signingConfigs {
        def appStoreFile = System.getenv("STORE_FILE")
        def appStorePassword = System.getenv("STORE_PASSWORD")
        def appKeyAlias = System.getenv("KEY_ALIAS")
        def appKeyPassword = System.getenv("KEY_PASSWORD")
        release {
            storeFile file(appStoreFile)
            storePassword appStorePassword
            keyAlias appKeyAlias
            keyPassword appKeyPassword
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
            zipAlignEnabled true
        }
    }
}

然后我们在打包的机器上配置以上环境变量即可,window和linux的方式不一样,关于配置环境变量这一块的知识,大家可以自行google一下。

如果你是使用Jenkins这类CI打包,以Jenkins,它的配置里就可以指定Jenkins使用的环境变量,这样我们就不用区分linux和window了,只需要在Jenkins里配置即可。

以上配置好之后,我们就可以进行打包使用了,签名信息也做了隐藏,看到这里,相信大家也意识到了一个问题,那就是每个开发者电脑上并没有如上的环境变量配置,因为签名信息对他们是隐藏的,那么他们如何进行打包测试呢?这就需要我们两个一个debug签名上场了,我们直接使用android自己提供的debug签名即可,因为我们需要的是签名,保证可以生成App测试(非debug调试)即可,比如给测试。

首先我们要从我们自己的电脑目录上提取出来Android自带的debug签名,一般在你的${HOME}/.android/目录下,找到后拷贝到我们的工程目录下,其次找到他们的签名信息,比如密码,key等,这是公开的,我们可以参考Android文档。

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    signingConfigs {
        def appStoreFile = System.getenv("STORE_FILE")
        def appStorePassword = System.getenv("STORE_PASSWORD")
        def appKeyAlias = System.getenv("KEY_ALIAS")
        def appKeyPassword = System.getenv("KEY_PASSWORD")

        //当不能从环境变量里获取到签名信息的时候,就使用项目中带的debug签名
        if(!appStoreFile||!appStorePassword||!appKeyAlias||!appKeyPassword){
            appStoreFile = "debug.keystore"
            appStorePassword = "android"
            appKeyAlias = "androiddebugkey"
            appKeyPassword = "android"
        }
        release {
            storeFile file(appStoreFile)
            storePassword appStorePassword
            keyAlias appKeyAlias
            keyPassword appKeyPassword
        }
    }
}

关键的逻辑就是在signingConfigs中加了判断代码,如果签名信息四要素中的任何一个没有获取到,就使用默认的签名信息,这样当我们在打包服务器进行打包的时候就会使用正式发布的签名,因为我们已经在服务器上配置了签名信息的环境变量;当每个开发者自己生成Release包的时候,因为本机没有配置,就使用默认的签名。

假如有的开发者有时候也需要使用正式发布的签名打正式的包,用于升级测试等目的,也是可以做到的,比如Jenkins,给每个开发者开放一个账号,他们自己新建个Job就可以打正式的包了,打了之后可以在生成的构建里下载。

这里要隐藏我们的签名信息,既能保证签名信息的安全性,又可以进行正式的打包,其中的关键点是一个专有的打包服务器,如果你们公司还没有的话,赶紧试试吧,好处多多,从这个小技巧也可以看到Gradle的灵活性,我们和编写Java代码一样编写我们的构建打包流程。

Android Gradle必备使用技巧,未完待续,欢迎关注公众号flysnow_org,第一时间看后续技巧。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏恰童鞋骚年

Hadoop学习笔记—19.Flume框架学习

START:Flume是Cloudera提供的一个高可用的、高可靠的开源分布式海量日志收集系统,日志数据可以经过Flume流向需要存储终端目的地。这里的日志是一...

692
来自专栏MelonTeam专栏

[译]Android Instant Apps简介

导语 : Google最近发布了Instant Apps,可以帮助开发者进一步的增强Android的原生App体验。Instant Apps旨在通过在需要时只下...

3957
来自专栏向治洪

jni和ndk详解

NDK(Native Development Kit)“原生”也就是二进制 android常用的开发方式是java封装的库,而这些库的底层实现是由C/C++实现...

2029
来自专栏SpringBoot 核心技术

SpringCloud组件:Eureka服务注册中心的失效剔除与自我保护机制

Eureka作为一个成熟的服务注册中心当然也有合理的内部维护服务节点的机制,比如我们本章将要讲解到的服务下线、失效剔除、自我保护,也正是因为内部有这种维护机制才...

2K2
来自专栏张善友的专栏

支持Visual Studio 2008和.NET 3.5的企业类库4.0

企业类库4.0(EntLib 4)发布了,采用的是Microsoft Public License (Ms-PL)协议发布,和之前的版本的相比较更开放,微软的各...

1799
来自专栏Dawnzhang的开发者手册

spring cloud心跳检测自我保护(EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT

默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。但是当网络分区故障...

2684
来自专栏菩提树下的杨过

纯手工搭建JSF开发环境(JSF2.2+maven+weblogic 12c/jboss EAP 6.1+)

JSF 2.X因为种种原因(我个人觉得主要是因为推出太晚),再加上EJB2之前的设计过于复杂,引起很多开发人员对官方解决方案的反感,即使EJB3后来做了大量改进...

1361
来自专栏Linyb极客之路

工作流引擎之Activiti使用总结

在第一家公司工作的时候主要任务就是开发OA系统,当然基本都是有工作流的支持,不过当时使用的工作流引擎是公司一些牛人开发的(据说是用一个开源的引擎修改的),名称叫...

5834
来自专栏xingoo, 一个梦想做发明家的程序员

AngularJS 国际化——Angular-translate

对于一个用户群面向全球的的应用来说,不得不考虑国际化的问题。当然,即便是刚刚起步的小应用,如果有心搞大,也应该提前设计国际化的方案。 本篇讲述使用Angul...

2998
来自专栏Laoqi's Linux运维专列

Kubernetes 1.8.6 集群部署–监控mysql(十四)

1653

扫码关注云+社区

领取腾讯云代金券