腾讯实习| 总结(2)

前言

  • Android Gradle
  • 多渠道打包
  • Walle错误汇总

1、Android Gradle

1.1、Gradle概述

Gradle是基于Groovy语言定义的一套DSL,所谓DSL(领域专用语言),就是专门针对某一特定问题的计算机语言。而Gradle我们可以认为是经过“定制”的Groovy,专门用于项目构建的语言。

1.2、Groovy概述

Groovy 是一种动态语言。这种语言比较有特点,它和 Java 一样,也运行于 Java 虚拟机中。简单来说,Groovy 是在 java 平台上的、 具有像 Python, Ruby 和 Smalltalk 语言特性的灵活动态语言, Groovy 保证了这些特性像 Java 语法一样被 Java 开发者使用。

因为Groovy是一门语言,所以完整的学习起来不会比学任一语言要简单。但是作为一名普通的Android开发者,其实只要掌握其基础语法以及它特殊的一点—Closure(闭包),足矣。

推荐阅读: Gradle从入门到实战 - Groovy基础 | 官方文档

1.3、Gradle构成

Gradle里面有三个重要的概念:Project、Task和Plugin。

  • Project
    每个项目的编译至少有一个 Project,一个 build.gradle就代表一个project,在Gradle中,每一个project,Gradle都会创建一个Project对象,并将这个对象与构建脚本相关联。也就是说,Project对象与build.gradle是一对一的关系,所以你在build.gradle写的每一个配置其实就是它对应的Project对象的一个方法或者一个变量值,譬如说我们配置项目依赖:
dependencies {
       classpath 'com.android.tools.build:gradle:1.5.0'
 }

它其实对应Project对象void dependencies(Closure configureClosure);方法。

  • Task
    Task表示一些需要执行的构建任务,定义一个Task可以这样写:
task hello << {
    println "hello"
  }

//或者等价于完整的写法
task("hello").leftShift({
   println "hello"
  })
  1. 定义一个task相当于调用了Project对象的task方法
  2. 任务名是task方法的参数名
  3. <<是Groovy的运算符重载,在Groovy中,其实就是leftShift方法,leftShift方法 等价于 doLastdoLast 是gradle提供访问task任务的一个API,类似的还有 doFirst,当一个task被执行的时候,可以通过 doFirstdoLast 向task中动态添加操作。doFirst /doLast 会在task本身被执行之前/之后才会被执行
  4. leftShift方法接收的参数是一个Closure

简单来说:一个Task其实就是一个标准的Groovy函数调用

  • Plugin
    Gradle是一个框架,作为框架,它负责定义流程和规则。而具体的编译工作则是通过插件的方式来完成的。比如编译Java有Java插件,编译Groovy有Groovy插件,编译Android APP有Android APP插件,编译Android Library有Android Library插件。简单来说,插件就是一系列任务的集合,主要作用是把一些重复利用的逻辑打包,这样就可以在不同的项目中可以重复的使用。要应用插件,可以通过引入依赖的方式添加,举个例子,要引入Android APP插件,就需要在build.gradle引用Android APP插件:
buildscript {
    repositories {
        jcenter()//表示编译过程中依赖的仓库
    }
    dependencies {
      //依赖android开发的gradle插件,groupId:artifactId:version
        classpath 'com.android.tools.build:gradle:1.5.0'
    }
    }
//应用插件
apply plugin: 'com.android.application'
//配置插件属性
android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    defaultConfig {
        applicationId "com.test"
        versionCode 1
        versionName "1.0.0"
    }
    buildTypes {
         release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
 }

1.4、Gradle编译周期

  • 初始化阶段
    创建 Project 对象,如果有多个build.gradle,也会创建多个project。
  • 配置阶段
    在这个阶段,会执行所有的编译脚本,同时还会创建project的所有的task,为后一个阶段做准备。
  • 执行阶段
    在这个阶段,Gradle 会根据传入的参数决定如何执行这些task,真正的执行代码就在这里。

关于Gradle,更多的学习推荐阅读:Gradle完整指南 | 深入理解 Android(一):Gradle 详解 | 抓重点学Gradle

2、多渠道打包

在我的Mentor给我分配我们项目打包需求的时候,一度很迷惑,多渠道打包的意义在哪里,除开一些与厂商定制版的APP,完全不知道为什么要打那么多的渠道包(我们的项目里面甚至要打到3位数的不同的apk包),后来在慢慢的摸索中,大概是了解到了一点多渠道打包的眉目。

2.1、什么是多渠道打包

渠道包就是要在安装包中添加渠道信息,也就是channel,对应不同的渠道,例如:小米市场、360市场、华为市场、应用宝市场等。产品在不同的应用市场可能有不同的统计需求,需要为每个应用市场的Android包设定一个可以区分应用市场的标识,这个为Android包设定应用市场标识的过程就是多渠道打包。

2.2、为什么要多渠道打包

国内存在着有众多的应用市场,产品在不同的渠道可能有不同的统计需求,为此Android开发人员需要为每个应用市场发布一个安装包,这里就引出了Android的多渠道打包。在安装包中添加不同的标识,应用在请求网络的时候携带渠道信息,方便后台做运营统计。

2.3、实现多渠道打包

因为目前Android的签名方式采用的是v2,所以之前使用v1签名的打包方式就被判了“死刑”。这里推荐现在比较主流的两种打包:美团Walle和Gradle productFlavors。

推荐阅读: 美团Walle | Gradle中productFlavors使用详解

3、Walle的错误汇总

在这一周为我们的项目集成Walle时,其实踩了不少的坑,虽然项目代码不能具体的公开,但是踩过的坑还是可以分享出来的。

踩坑1:ERROR: A problem occurred configuring project ':app'.

产生原因:buildTypes中没有配置我们刚刚创建的签名信息。

解决方法:buildTypes中添加我们的签名信息:

添加信息

在这里需要注意,我们在配置signingConfig signingConfigs.xxx时,xxx必须和我们之前创建的签名信息的名字以及buildTypes中的名称对应,如果配置了多个签名信息则需要创建多个小闭包:

对应

踩坑2:Could not initialize class org.codehaus.groovy.runtime.InvokerHelper

产生原因: 是由于jdk版本和gradle版本不匹配。在使用Oracle JDK 14时,所有gradle(6.2.2)任务都会失败。

解决方法: 降低jdk版本或者提高gradle版本到6.3及以上。

踩坑3:Task 'assembleReleaseChannels' not found in root project XXXProject ''.

产生原因: 项目之前的打包方式是采用productFlavors进行多渠道打包。

错误解决方法: 在网上查看相关blog,说是直接将productFlavors中相关配置直接注释掉即可,但是经过实测,光注释掉productFlavors相关配置只是治标不治本,后续产生的错误会更多。

正确解决方法: 查看Walle仓库的issue,发现Walle本身是支持在配置productFlavors时一键生成多个渠道包,所以根本原因并不是productFlavors。解决方法描述如下:

可以检查有没有配置productFlavors,如果有,需要在assemble{$flavor.name}ReleaseChannels.另外还可以在AndroidStudio, Gradle->Project->{your app module name} -> package下面找到你可以使用的命令集合。

gradle指令
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335