热门标签 | 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!不能用混淆!


推荐阅读
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 在编写业务代码时,常常会遇到复杂的业务逻辑导致代码冗长混乱的情况。为了解决这个问题,可以利用中间件模式来简化代码逻辑。中间件模式可以帮助我们更好地设计架构和代码,提高代码质量。本文介绍了中间件模式的基本概念和用法。 ... [详细]
  • 本文介绍了腾讯最近开源的BERT推理模型TurboTransformers,该模型在推理速度上比PyTorch快1~4倍。TurboTransformers采用了分层设计的思想,通过简化问题和加速开发,实现了快速推理能力。同时,文章还探讨了PyTorch在中间层延迟和深度神经网络中存在的问题,并提出了合并计算的解决方案。 ... [详细]
  • 本文介绍了一道网络流题目hdu4888 Redraw Beautiful Drawings的解题思路。题目要求以行和列作为结点建图,并通过最大流算法判断是否有解以及是否唯一。文章详细介绍了建图和算法的过程,并强调在dfs过程中要进行回溯。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文介绍了在git中如何对指定的commit id打标签,并解决了忘记打标签的问题。通过查找历史提交的commit id,可以在任意时间点打上标签。同时,还介绍了git中的一些常用命令和操作。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
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社区 版权所有