Gradle系列(三) Gradle配置构建和渠道包,这份火爆全网的452页Android Framework内核解析

],

kotlin : “org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version”,

leakcanary : [

android : “com.squareup.leakcanary:leakcanary-android:$leakcanary_version”,

android_no_op : “com.squareup.leakcanary:leakcanary-android-no-op:$leakcanary_version”,

support_fragment: “com.squareup.leakcanary:leakcanary-support-fragment:$leakcanary_version”,

],

]

}

在build.gradle中使用

dependencies {

implementation Config.depConfig.support.recyclerview_androidx

}

3. 渠道包


3.1 productFlavors

productFlavors直译为产品风味,Android这边用它来做多渠道.在app的build.gradle中加入如下配置

android {

flavorDimensions “channel”

productFlavors {

free {

dimension “channel”

//程序包名

applicationId “com.xfhy.free”

//替换清单文件中的标签

manifestPlaceholders = [

APP_ICON: “@drawable/ic_launcher”,

APP_NAME: “xx免费版”,

]

//versionName

versionName “2.0.0”

//versionCode

versionCode 2

}

vip {

dimension “channel”

//程序包名

applicationId “com.xfhy.vip”

//替换清单文件中的标签

manifestPlaceholders = [

APP_ICON: “@drawable/ic_launcher”,

APP_NAME: “xxVip版”,

]

//versionName

versionName “3.0.0”

//versionCode

versionCode 3

}

svip {

dimension “channel”

}

}

}

如代码所示,我们配置了3种类型的风味,在productFlavors中可以配置包名(applicationId)、版本号(versionCode)、版本名(versionName)、icon、应用名.并且可以在里面配置各种你之前在defaultConfig里面配置的东西.还可以配置src代码目录,res目录之类的.并且这个时候Build Variants里面有了多种类型,比如:freeDebug,freeRelease,vipDebug,vipRelease等.你在Build Variants里面选择freeDebug,则是使用free风味,并且是debug时使用的配置.

<application

xmlns:tools=“http://schemas.android.com/tools”

android:icon=“${APP_ICON}”

android:label=“${APP_NAME}”

android:theme=“@style/AppTheme”

android:largeHeap=“true”

tools:replace=“android:label”>

3.2 渠道变量

首先来介绍一个关键词扩展:applicationVariants,它是在AppExtension里面的,它的官方文档,它意思是返回应用程序项目包含的构建变体的集合,是用all关键词进行遍历.我们拿到了这些变体之后,可以根据当前是哪个变体来构建出相应变体所特殊的变量.比如内测和外测它们的地址肯定不一样的,那么通过这种方式可以很方便地整出来.构建的变量会存在于相应的BuildConfig中,然后在java代码中直接引用就行,替换地址时也不需要动java代码,只需在gradle中改一下,然后它编译的时候就会自动构建BuildConfig,自动将地址搞成最新的了.说了这些多,show me the code!

android {

applicationVariants.all { variant ->

//构建变体专属变量

switch (variant.flavorName) {

case ‘free’:

buildConfigField(“String”, “BASE_URL”, "“http://31.13.66.23"”)

buildConfigField(“String”, “TOKEN”, ““dhaskufguakfaskfkjasjhbfree””)

break

case ‘vip’:

buildConfigField(“String”, “BASE_URL”, "“http://31.13.66.24"”)

buildConfigField(“String”, “TOKEN”, ““dhaskfagafkjasjhbvip””)

break

case ‘svip’:

buildConfigField(“String”, “BASE_URL”, "“http://31.13.66.25"”)

buildConfigField(“String”, “TOKEN”, ““dhaskufgufgsdagajasjhbsvip””)

break

}

}

}

将上面的代码写在app的build.gradle中,在上面的gradle代码中我们定义了2个变量,不同的变体会构建不同的值,比如上面的BASE_URL我们会在free变体编译的时候就会在BuildConfig生成一个变量,值是http://31.13.66.23.我们来看一下BuildConfig中是些什么内容:

//build\generated\source\buildConfig\free\debug\com\xfhy\gradledemo\BuildConfig.java

public final class BuildConfig {

public static final boolean DEBUG = Boolean.parseBoolean(“true”);

public static final String APPLICATION_ID = “com.xfhy.free”;

public static final String BUILD_TYPE = “debug”;

public static final String FLAVOR = “free”;

public static final int VERSION_CODE = 2;

public static final String VERSION_NAME = “2.0.0”;

// Fields from the variant

public static final String BASE_URL = “http://31.13.66.23”;

public static final String TOKEN = “dhaskufguakfaskfkjasjhbfree”;

}

这个文件是gradle构建时自动为我们创建的,不需要去修改.我们构建的变体变量在最下面,这里面的值确实是我们在gradle代码中写的那样.这个里面已经有一些不是我们搞出来的变量了,比如是否是DEBUG,APPLICATION_ID,VERSION_CODE之类的.我们在java代码中使用的时候,直接BuildConfig.BASE_URL这种方式进行使用即可,它就是一个普通的java类,里面定义了一些变量而已.

当然除了上面的渠道变量之外,还有一些变量是公用的,每个变体都是一样的那种.我们可以写到defaultConfig下面.

android {

defaultConfig {

buildConfigField(“String”, “APP_DESCRIPTION”, ““你没有见过的船新版本””)

buildConfigField(“String[]”, “TAB”, “{“首页”,“排行榜”,“我的”}”)

}

}

3.3 打包文件命名

还是利用上面的applicationVariants,当我们拿到了变体之后,在打包的时候动态的将打包之后的文件名改一下.比如改成下面这种形式

applicationVariants.all { variant ->

variant.outputs.all {

def type = variant.buildType.name

def channel = variant.flavorName

outputFileName = “demo_KaTeX parse error: Expected group after '_' at position 22: …nt.versionName}_̲{channel}_${type}.apk”

}

}

最后它打出来的包是这样的demo_2.0.0_free_debug.apk,写完之后可以使用gradlew assembleFreeDebug命令试一下.命令运行之后会在app\build\outputs\apk\free\debug目录下产生相应的apk文件.

3.4 签名

可以在gradle中指定打包时的签名文件,密码啥的

signingConfigs {

debug {

storeFile file(‘…/keys/xfhy.jks’)

storePassword “qqqqqq”

keyAlias “xfhy”

keyPassword “qqqqqq”

v1SigningEnabled true

v2SigningEnabled true

}

release {

storeFile file(‘…/keys/xfhy.jks’)

storePassword “qqqqqq”

keyAlias “xfhy”

keyPassword “qqqqqq”

v1SigningEnabled true

v2SigningEnabled true

}

}

指定了签名以及密码之后,打包的时候就只需要在命令行执行gradlew assembleVipRelease即可,不用打开Android Studio了.

3.5 资源

Android Studio提供了代码整合功能.只需要创建app/src/xxFlavorName/assets,app/src/xxFlavorName/src,app/src/xxFlavorName/res即可.当在Build Variants中切换切换变体之后,AS就只会编译对应变体的资源+main下面的资源.

Qr9JqP.md.png

可以看到,free下面的文件夹自动变色了,这些是free变体特殊的东西,只有在free编译的时候才会被用到.java代码,res资源等,到时是需要和main下面的一起合并的.

假如我在free变体下创建了Test.java,然后可以在main下面引用到,就和平时使用一样.但是如果相同包名下如果free中有Test.java,main中也有,那么是编译不过的. 还有就是当main里面用到了Test.java的时候,在Build Variants中切换成了vip,而vip中刚好没有Test.java,就会报错的,因为找不到这个文件.

上面这个问题,可以用sourceSets来解决,sourceSets可以指定代码资源文件的位置.虽然上面创建的free,vip等变体文件夹下面也是放这些东西的,但是用sourceSets比他们优先级高.

下面来看它的普通用法,一看就懂.

sourceSets {

main {

manifest.srcFile ‘AndroidManifest.xml’

java.srcDirs = [‘src’]

aidl.srcDirs = [‘src’]

renderscript.srcDirs = [‘src’]

res.srcDirs = [‘res’]

assets.srcDirs = [‘assets’]

}

}

然后我们除了在src/main/java下有java代码,还可以指定在其他地方有java代码.比如下面这样.可以在src下面创建common/java文件夹,用于存放公共的代码.

sourceSets {

sourceSets.main.java.srcDirs = [‘src/main/java’, ‘src/common/java’]

}

上面的Test.java问题,可以用sourceSets解决.在common文件夹创建一个公共的Test.java,然后其他变体可以使用.在free在使用自己特殊的Test.java,只拿给free用.

项目的结果是这样的,这是变体是vip的时候:

QszS5F.md.png

sourceSets {

main {

java.srcDirs = [‘src/main/java’]

}

free {

java.srcDirs = [‘src/free/java’]

}

svip {

java.srcDirs = [‘src/common/java’]

}

vip {

java.srcDirs = [‘src/common/java’]

}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

尾声

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

  • 思维脑图
  • 性能优化学习笔记


  • 性能优化视频

    当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

  • 思维脑图
    [外链图片转存中…(img-6dLipGup-1712540122881)]
  • 性能优化学习笔记
    [外链图片转存中…(img-VNGE81Eq-1712540122881)]
    [外链图片转存中…(img-g4n6wKg8-1712540122881)]

[外链图片转存中…(img-YykvYZMb-1712540122881)]
[外链图片转存中…(img-9B0zo25K-1712540122882)]

  • 性能优化视频
    [外链图片转存中…(img-pfZ5zSXu-1712540122882)]
    当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值