2024年最新花椒Android客户端多变体构建实践,2024年最新高级Android开发面试题

最后

希望本文对你有所启发,有任何面试上的建议也欢迎留言分享给大家。

好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。

好了~如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

这里要注意的是productflavors中配置的顺序决定了配置的优先级,如上代码,如果在demo和minApi24中同时配置了minSdkVersion,因为api在flavordimensions中靠前,所以minApi24中的配置会胜出。

那么flavor是如何起作用的呢?我们知道通常的构建都会使用位于src/main目录下的代码,但配置了flavor后我们可以在src下创建以flavor名称命名的文件夹,当构建此flavor时候就会使用此文件夹下的代码。

gradle对代码和配置文件有不同的处理方式:

  1. 对于java代码,不能出现在src/main中,而是需要在每个flavor下的src/main/java下定义。
  2. 对于配置文件,如AndroidMainfest.xml,使用的策略是merge,即每个flavor下只需要配置和src/main下不同的xml节点即可。

在花椒中以上两种配置均有使用,如在配置CTA预装包时,需要对Application代码进行hook跳转特定Activity,就需要分别在ctaEnable目录下创建BaseapplicationHook,在ctaDisable创建BaseapplicationHook,CtaActivity以及AndroidMainfest.xml.目录结构如下图:

image

此处需要注意的是,某些情况下希望在flavor中删除src/main/AndroidMainfest.xml中的某些配置可以使用tools:node="remove"来实现。

android studio variant窗口

在使用flavor后,应用代码就有了多个variant,同时就会有多个sourceset。在android studio中一次只能显示一个variant代码,我们可以通过Build Variants选择需要的variant。需要注意的是对于module依赖,需要注意variant的传递,比如如果主module 的variant是ctaEnableDebug,其依赖的子module如果会优先选择ctaEnable的variant。但是通常情况下子module没有对应的variant,此时会fallback到debug。

使用gradle构建属性

product flavor虽然很强大,但依然存在一些问题:

  1. 配置相对复杂,当构建需求小且多的时候最后的变体名称会特别长
  2. 要求对每个dimension的变化进行枚举。对某些不能枚举情况,如配置启动跳转链接这种情况就难以实现。
  3. flavor分割了代码,如果修改代码必须保证在每个变体上都能编译通过。

针对以上问题,花椒在对某些简单的构建需求使用gradle构建属性来实现。这些需求一般有如下特点:

  1. 不涉及对resource,AndroidMainfest.xml的修改
  2. 通常比较简单,如开关功能,配置跳转链接等

gradle构建属性的主要原理是:

  1. 在构建时候使用-P参数将希望配置的参数加到编译命令上
  2. 使用project.hasProperty()判断是否存在属性,使用project.property(“”)获取参数值
  3. 在build.gradle中直接使用这些值。如果需要在java代码中使用,通过buildConfigField配置到BuildConfig上。

以下代码展示了如何通过构建属性配置apk的appname

groovy String appNameX = “花椒” String appNameXP = “appNameX” def applicationName = “huajiao” if (project.hasProperty(appNameXP)) { appNameX = project.property(appNameX_P) }

defaultConfig{ resValue(“string”, “appNameX”, appNameX) }
xml

通过以上配置我们使用gradlew -PappNameX=花椒直播 assemble打包时候,配置文件中的appNameX的值就会变成花椒直播并通过resValue配置到string.xml中,这样AndroidMainfest.xml中的label名称在最终编译中就会是花椒直播,从而实现了替换应用名称的目的。

除了在xml中使用构建属性外,我们还可以通过buildconfigField将属性传递到Buildconfig类上,这样在java代码中通过引用buildConfig就可以获取构建属性了。

例如在开发中我们可以对某些模块的日志进行开关,下面代码展示了如何通过构建属性打开或关闭统计日志。

groo boolean showStatisticLog = false

if (project.hasProperty(“showStatisticLog”)) { showStatisticLog = true } defaultConfig { versionCode hostVCode versionName “${hostVName}” buildConfigField “boolean”, “SHOWSTATISTICLOG”, String.valueOf(showStatisticLog) }
java if (BuildConfig.SHOW_STATISTIC_LOG) { QHStatAgent.setLoggingEnabled(true); QHConfig.setDebugMode(context, true); QosSdk.enableLog(true); }

这里需要注意gradle的构建属性的配置,如果使用命令行可以直接加上-Pkey=value,如果使用android stuido可以在Settins>Compiler中设置。

构建变体实践

使用setIgnore过滤变体

在实际使用中,某些flavor组合出来的variant可能并不是我们需要的。我们可以在variantFilter配置中过滤掉不需要的variant。

variantFilter { variant -> def name = variant.flavors*.name def buildTypeName = variant.buildType.name if (name.contains(“friendsChannel”)) { setIgnore(!(name.contains(“smEnable”) && name.contains(“loginForceFullScreenEnable”) && name.contains(“googlePlayDisable”) && name.contains(“ctaDisable”))) } }

对变体产生的apk命名

当我们综合使用flavor和构建属性时候,最终可能产生有不同特性的apk,如果不加配置很容易产生重名的apk导致互相覆盖,并且在交付的时候容易出现混乱。在花椒的构建实践中我们尽可能的把本次构建的特性写入apk的文件名称中。在gradle中可以使用applicationVariants的outputFilename来配置。

groo applicationVariants.all { variant -> def buildId = “ a p p l i c a t i o n N a m e " + " {applicationName}" + " applicationName"+"{buildName.length() > 0?”“+buildName:”“}” + "KaTeX parse error: Expected group after '_' at position 30: …Type.name}" + "_̲{defaultConfig.versionName}" + “ l o g i n R e q u e s t X ? " l o g i n R e q u e s t " : " " " + f l a v o r N a m e s + " t a r g e t S D K {loginRequestX?"_loginRequest":""}" + flavorNames + "_targetSDK loginRequestX?"loginRequest":"""+flavorNames+"targetSDK{targetSdk}” + “ h u a w e i P P S ? " h u a w e i p p s " : " " " + " {huaweiPPS?"_huaweipps":""}" + " huaweiPPS?"huaweipps":"""+"{huaweiChannel?”_huaweiChannel":“”}" + “ q u i c k S t a r t ? " q u i c k S t a r t " : " " " + " {quickStart?"_quickStart":""}" + " quickStart?"quickStart":"""+"{usePhone?“usePhone":“”}" + “ o p p o D e e p L i n k ? " o p p o D e e p L i n k " : " " " + " {oppoDeepLink?"_oppoDeepLink":""}" + " oppoDeepLink?"oppoDeepLink":"""+"{desc.length() > 0?””+desc:”“}” + “KaTeX parse error: Expected '}', got 'EOF' at end of input: …putFileName = "{buildId}.apk” } }

最后

本文已收录GitHub:https://github.com/xieyuliang/Note-Android,更有互联网大厂面试真题,面试攻略,高效学习资料等。

最后

在这里小编整理了一份Android大厂常见面试题,和一些Android架构视频解析,都已整理成文档,全部都已打包好了,希望能够对大家有所帮助,在面试中能顺利通过。

image

image

喜欢本文的话,不妨顺手给我点个小赞、评论区留言或者转发支持一下呗

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

s.csdn.net/topics/618156601)**

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值