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

1. Android组件化开发之一:为什么要进行组件化开发

2. Android组件化开发之二:组件化架构

3. Android组件化开发之三:组件化开发手册

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

5. Android组件化开发之五:组件化开发实战Demo

|

序号

|

名称

|

坑深度

|

内容

|

| — | — | — | — |

| 1 |

JPush

| | 极光推送的配置文件不能放在library工程里面,必须放到application工程中。 |

| 2 |

Resource IDs

| |

Resource IDs cannot be used in a switch statement in Android library modules.

Android Studio里面快捷转换方式:选中“switch”,ALt+Enter同时选中,弹出对话框,选择“Replace ‘switch’ with ‘if’”。

|

| 3 |

ButterKnife引用

| |

在library工程中,提示:Attribute value must be constant。

这是因为library中R.id.xxx 取R中变量的时候并非是final类型。

解决方法:

ButterKnife在8.0版本以上支持library内使用视图注入,原先app用的是7.x版本的,所以要先升级到8.x版本。

期间还需要将以前的R用R2代替。

有时候AS识别不了R2,需要多build几次。

|

| 4 |

ButterKnife点击

| |

接上所述,正常情况下,Butterknife的点击事件是这样的:

@OnClick({R2.id.btn_login, R2.id.btn_regist})

public void onClick(View view) {

int i = view.getId();

if (i == R2.id.btn_login) {

但现在的问题是,view.getId()获得的是R类中的id,而不是R2类中的id,特么的巨坑!!!

解决方法:

1、使用RCaster类做一个R到R2的转换。

2、不用ButterKnife响应click事件,就用android原生的onClick。

|

| 5 |

Dagger2

| |

Dagger2在各个组件工程里面有时候不会生成对应的文件,有时候生成了文件AS不能立刻识别,要等一段时间,可能这是dagger2和AS之间的bug吧。

解决方法:

第一步、在build-generated-source-apt-release下找到对应的daggerXXXX文件,然后双击打开。

第二步、点击Build–Make Module XXXX。

第三步、等一会AS就能识别出来。

|

| 6 |

annotationProcessor

| | apt已经停止更新,需要全面切换到annotationProcessor,以防止不必要的坑。 |

| 7 |

versionName、versionCode

| | application项目里面必须得有这两个属性。 |

| 8 |

拆分

| | 建议从原有工程中逐步将功能拆分至各个组件项目,而不是另起一个全新项目。 |

| 9 |

Service

| | service必须放到application项目中,不能放到library项目中,必须注意!!! |

| 10 |

BuildConfig

| |

application工程对library工程的依赖都是release依赖!!!

所以一些根据debug和release来判断的操作,需要放到application工程里面。

还有一种解决方案:publishNonDefault true

参考 http://www.jianshu.com/p/64f57439934b

|

| 11 |

So文件

| |

各个工程的libs里面的so文件,需要在各个工程的build.gradle文件中用如下方式引入,不然打包的时候so文件包含不进去:

sourceSets {

main {

jniLibs.srcDirs = [‘libs’]

}

}

|

| 12 |

AsyncTask

| |

asynctask在组件间调用的时候会出现AsyncTask java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.lang.Void[] 异常。

解决方案:

1、去掉泛型;

2、泛型将Void类型换成非Void类型。

|

| 13 |

ApplicationId

| |

applicaitonId和packageName的区别:

1、如果没有applicationId,则以packageName的值为应用包名;

2、如果有applicationId,则以applicationId的值为应用包名;

应用案例:

Module模块中,如果需要使用到极光推送的,而极光推送跟包名又是强相关的,

可以利用applicationId进行包名控制,而不需要去改动packageName。

|

| 14 |

JPush

|   |

目前项目使用的JPush版本还是1.7.0。

在module作为单个apk独立运行时,会出现如下情况:

提示:

[AndroidUtil] The permissoin is required - android.permission.WRITE_SETTINGS

[AndroidUtil] You should make main activity extends InstrumentedActivity (JPush), otherwise you will not see user click and user active time start on report in Portal.

有两种情况:

(一)原因是这个版本在android api为23及以上使用时,不能够权限更改做判断;

目前解决方案是将targetSdkVersion设为21及以下。

但是在app壳工程里面targetSdkVersion设为23是可以的。

(二)原因是app没有签名。

在buildTypes里面要加上:signingConfig signingConfigs.debugConfig

|

| 15 |

Instant Run

| |

在Android Studio 2.3.3和Gradle 3.3环境下面,开启instant run后,整个项目的编译和单个组件的编译会异常耗时,而且会出现处理R.class时crash现象;

所以在平时调测过程中,需要将instant run关闭后编译。

|

| 16 |

编码问题

| |

org.gradle.jvmargs = -Dfile.encoding=UTF-8

如果jvmargs的设置如上,则会出现项目中png图片不能识别问题:

AAPT err(Facade for 169869688) : No Delegate set : lost message:\\?\xxx\base-core\build\intermediates\bundles\default\res\drawable-xhdpi-v4\query_loding5.png ERROR: Unable to open PNG file

|

| 17 |

resourcePrefix

| |

设置了resourcePrefix值后,所有的资源名必须以指定的字符串做前缀,否则会报错。

但是resourcePrefix这个值只能限定xml里面的资源,并不能限定图片资源,所有图片资源仍然需要手动去修改资源名。

|

| 18 |

引用aar

| |

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

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

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

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

img

img

img

img

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

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

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

尾声

一转眼时间真的过的飞快。我们各奔东西,也各自踏上了自己的旅途,但是即使多年不见,也因为这份情谊我们依旧如从前那般“亲密”。不忘初心方得始终。加油吧,程序员们,在我看来35岁,40岁从来不是危机,只要永远不要忘记自己为何踏上征程!

为了让更多在学习中或者最近要准备面试的朋友们看到这篇文章,希望你们能多多评论,点赞+转发!

再次感谢所有给我提供过题目的朋友们,感谢一路有你!

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

深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!**

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

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

尾声

一转眼时间真的过的飞快。我们各奔东西,也各自踏上了自己的旅途,但是即使多年不见,也因为这份情谊我们依旧如从前那般“亲密”。不忘初心方得始终。加油吧,程序员们,在我看来35岁,40岁从来不是危机,只要永远不要忘记自己为何踏上征程!

为了让更多在学习中或者最近要准备面试的朋友们看到这篇文章,希望你们能多多评论,点赞+转发!

再次感谢所有给我提供过题目的朋友们,感谢一路有你!

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值