热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android组件化开发之四:组件化填坑之旅

序号名称
序号
名称
坑深度
内容
1

JPush

17

resourcePrefix

(红色星星)

设置了resourcePrefix值后,所有的资源名必须以指定的字符串做前缀,否则会报错。
但是resourcePrefix这个值只能限定xml里面的资源,并不能限定图片资源,所有图片资源仍然需要手动去修改资源名。

18

引用aar

(红色星星)(红色星星)(红色星星)

在Android Studio中创建一个module或者导入一个module的时候,如果这个module中依赖了aar库,当build工程的时候,会出现failed to resolve这个错误。

需要在引用这个module之前的每一个module或app的build.gradle里面,添加如下代码:

 

  1. repositories {  
  2.     flatDir {  
  3.         dirs project(':你的module名称').file('libs')  
  4.     }  
  5. }  


19

手动替换aar

(红色星星) 需要关闭android studio然后重新打开,不然死活识别不出来。
20 Multiple dex files define Lcom/xx/xx/BuildConfig (红色星星)(红色星星)

解决方法一:找到引用的aar包,用压缩软件打开,把里面的BuidConfig给删了,然后引用删除后的包

解决方法二:在library工程的build.gradle中的android范围内加入:packageBuildConfig(false)

21 使用ButterKnife后的混淆  

由于使用了R2这个资源文件,所以在混淆的时候需要增加排除对R2的混淆,如下:

-keep class **.R$* {*;}
-keep class **.R2$* {*;}
22 找不到资源文件:NoSuchFieldError (红色星星)(红色星星)

开发的时候,通过 Ctrl+右键 能够正确找到相应的ResId,但是一旦运行起来,无论是通过ButterKnife还是findViewById都会报此错。此种情况需要检查是否module的layout命名与其他module有冲突,重命名layout文件名称后即可解决。

建议在不同的module之间配置 gradle:resourcePrefix "xxx_" 加以区分格式

23 ButterKnife (红色星星) module工程里面必须引用
annotationProcessor 'com.jakewharton:butterknife-compiler:8.x.x' 

不然会出现控件绑定失效,导致OnClick等这样的事件无法实现

24

APP+Library

+productFlavors+buildTypes

(红色星星)(红色星星)(红色星星)

好处:library工程根据app工程传过来的参数进行个性化配置,比如测试环境or正式环境。

详情参加:http://blog.csdn.net/wenyiqingnianiii/article/details/70183816

打包注意:

developCompile project(path: ':library', configuration: 'developDebug')

1、这样的打包形式,以在app工程的build.gradle脚本为例:

developCompile的develop表示app的Flavors;configuration的developDebug表示library工程的flavors是develop,buildTypes是debug;

所以在library中必须有对应的flavors。

2、app工程向library工程传值

(1)library可以通过libraryVariants.all、variant.buildType.name、variant.flavorName来判断由app传入的值是什么,从而进行个性化处理。

(2)当然,library还可以通过直接在buildTypes、productFlavors脚本里面编写代码进行个性化处理。注:publishNonDefault true

(3)app工程初始化的时候,可以调用library工程的类进行初始化设定。

3、打包的时候,左下角的Build Variants选择Build Variant的时候,需要对应app脚本中xxxCompile的信息。

如按照上述脚本,应该选择app:developDebug,library:developDebug。

同样,在右上角的Gradle脚本里面,也要选择对应的脚本名称,比如这个脚本的名称为:assembleDevelopDebug。

25 library二次引用 (红色星星)

注:一定要以maven的形式compile进来;如果library工程有jar包,app工程要把重复的jar包去掉。

1、比如A工程引用了B库,B库引用了C库,如果A工程引用了C库,那么C库知会被引用一次,并且是最新版本的。

如果B库引用的C库是1.0版本,而A工程引用的C库是1.1版本,那么在A工程里面知会引入C库的1.1版本。

所以不用担心C工程二次引用重复的问题。但如果是jar包则不行。

2、可以用+号表示永远引用最新版本的库工程,比如compile 'com.midea.smart.lib:lib-ui:+',但不建议这样引用。推荐写成固定的版本。

原因:

每次build时会向网络进行检查,国内访问仓库速度很慢;

库更新后可能会更改内部逻辑而带来bug,动态版本无法通过git的diff来规避此问题;

每个开发者都可能会得到不同的最新版本,带来潜在隐患。

3、比如A工程引用了B库,B库引用了C库,如果A工程引用了C库,但是B库引用的C库groupId不一样,

这样会造成的结果就是,A工程知会引入B库所引用的C库的版本,比如B库引用的C库的版本是2.0,而app工程引用的C库的版本是2.1,

这样的情况下,app工程只会引入2.0版本的C库,这是一个坑,不过也不是经常遇到。


26 Android Studio引用版本号 (红色星星)(红色星星)

android studio的坑,compile的版本号如果以前引用过的话,后面修改后,如果保持版本号不变,android studio再次引用进来会导致一些莫名其妙的问题。

解决方案:

按照maven的版本管理规范,后续将maven上面的版本正式管理起来,有变更时版本号往上增加:
1、平时开发版本放到snapshot上面;
2、release只用来上传正式发布版本。

27 Maven上传 (红色星星) library生成的aar或jar要注意只能生成一个,要门debug要么release,不要两个都一起生成,这样都会传到maven上。
28 工程编译速度慢 (红色星星)(红色星星)(红色星星)

工程编译速度慢,主要跟以下两种情况有关,我们可以针对性地做出一些优化措施:

1、Flavors+BuildType组合,编译出来的library工程的aar包很多,导致编译速度慢;

解决措施:确定library是否需要flavors和buildtype,如果不需要,就可以不用用这种组合编译方式编译,可以只选择一个。

2、settings.gradle中包含的library工程太多,这个影响是致命的。

解决措施:将library工程的aar包,放到app工程的libs里面,在app里面引用aar。

29 错误: 找不到符号 (红色星星)

app工程引用library工程的时候,有时候会发现“错误: 找不到符号”这个错误,但是跳转到代码处有没有报错。

实际上这个原因是因为library工程中将混淆开启了,所以需要将library的minifyEnabled设置为false!不能用混淆!


推荐阅读
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 在编写业务代码时,常常会遇到复杂的业务逻辑导致代码冗长混乱的情况。为了解决这个问题,可以利用中间件模式来简化代码逻辑。中间件模式可以帮助我们更好地设计架构和代码,提高代码质量。本文介绍了中间件模式的基本概念和用法。 ... [详细]
  • 本文介绍了腾讯最近开源的BERT推理模型TurboTransformers,该模型在推理速度上比PyTorch快1~4倍。TurboTransformers采用了分层设计的思想,通过简化问题和加速开发,实现了快速推理能力。同时,文章还探讨了PyTorch在中间层延迟和深度神经网络中存在的问题,并提出了合并计算的解决方案。 ... [详细]
  • 本文介绍了一道网络流题目hdu4888 Redraw Beautiful Drawings的解题思路。题目要求以行和列作为结点建图,并通过最大流算法判断是否有解以及是否唯一。文章详细介绍了建图和算法的过程,并强调在dfs过程中要进行回溯。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了一个关于正则的困惑,即为什么一个函数会获取parent下所有的节点。同时提出了问题是否是正则表达式写错了。 ... [详细]
  • 本文介绍了[从头学数学]中第101节关于比例的相关问题的研究和修炼过程。主要内容包括[机器小伟]和[工程师阿伟]一起研究比例的相关问题,并给出了一个求比例的函数scale的实现。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 深入理解线程、进程、多线程、线程池
    本文以QT的方式来走进线程池的应用、线程、进程、线程池、线程锁、互斥量、信号量、线程同步等的详解,一文让你小白变大神!为什么要使用多线程、线程锁、互斥量、信号量?为什么需要线程 ... [详细]
  • “您可以从三个选项中(快速、便宜或好)选择两个”提出这个问题的人可能不是可观测性工程师。但也可能是,在可观测性方面,决定您 ... [详细]
author-avatar
花开不美
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有