Mark的私人博客

数风流人物,还看今朝

android开发Duplicate class编译出现类重复问题的定位以及解决方法

Task :app:checkReleaseDuplicateClasses FAILED

Duplicate class com.google.common.util.concurrent.ListenableFuture found in modules jetified-guava-20.0 (com.google.guava:guava:20.0) and jetified-listenablefuture-1.0 (com.google.guava:listenablefuture:1.0)

1
2
3
4
5
6
7

### 解决方法:

1. Navigation -> Search Everywhere,勾选Include non-project items进行全局搜索
2. 比如搜索com.google.guava就可以搜索出所有的有关的依赖库
3. ./gradlew app:dependencies查看找出依赖库之间的关系(在gradle中执行)
4. 找到有关的依赖库xxx:xx:x
    implementation("xxx:xx:x") {
        exclude group: 'com.google.guava'
    }
    或者android配置区域配置全部库排查如下:
    configurations.all {
        exclude group: 'com.google.guava', module:'listenablefuture'
    }
1
2

### zsh: permission denied: ./gradlew

运行: chmod +x gradlew
```

线程与线程池开发核心技术

[TOC]

印象笔记链接

线程与进程

  • 一个进程至少一个线程
  • 进程可以包含多个线程
  • 进程在执行过程中拥有独立的内存空间,而线程运行在进程内
阅读全文 »

案列:Navigation组件和ARouter为例

[TOC]

我的Demo:涵盖了两大路由的基础使用

如何做好技术选型?

什么是路由?

  • 页面间跳转关系映射,可以通过字符串、别名等方式实现跳转

    为什么介入路由?Intent不好吗?

Intent

  • 跳转过程无法控制,一旦调用了startActivity(Intent)便交由系统执行,中间过程无法插手
  • 跳转失败无法捕获、降级,出现问题直接抛出异常
  • 显示Intent
    显示Intent中因为存在直接的类依赖关系,导致耦合严重
  • 隐式Intent
    隐式Intent中会出现规则集中式的管理,导致协作困难,都需要在Manifest中进行配置,导致扩展性比较差

    对比两大路由组件的功能对照表

Navigation ARouter
跳转行为 通过页面的action跳转,支持Activity,Fragment,Dialog 支持标准URL跳转
模块间通信 不支持,需要将所有页面定义在一个资源文件里 @Route注解配置,根据Path获取对应的接口实现
路由节点注册 统一在navigation_mobile.xml中注册 @Route注解
路由节点的生成方式 加载navigation_mobile.xml生成NavGraph导航视图 按照组划分
拦截器 不支持 支持全部定义拦截器,可以自定义拦截顺序
转场动画 支持 支持
降级策略 不支持 支持全局降级和局部降级
参数自动注入 不支持 @Autowired注解实现
外部跳转控制(h5打开app页面) deeplink页面直达 需要配置入口Activity,支持的uri需要在Manifest中配置

总结

ARouter主要是用于Activity路由的框架,采用的是APT技术,可用于组件化改造。而Navigation主要是用于Fragment路由导航的框架。

可以说,这两个虽然都是用于路由导航,但是用途是不一样。如果你的应用主要以Acticity为主的话,建议使用ARouter;如果你的页面主要以Fragment为主,Activity只是作为容器的话,那么建议你使用Navigation。当然,你也可以两个都用,这完全取决于你的项目实际情况,不冲突的。

Android中APT技术介绍

Android中APT技术介绍

[TOC]

APT是什么

APT 全称 Annotation Processing Tool,即注解处理器,是javac的一种处理注释的工具,它对源代码文件进行检测找出其中的Annotation,并根据注解自动生成代码,帮助开发者减少了很多重复代码的编写。

例子

很多著名的框架用到APT的思想,通过注解编译期间自动生成代码,简化使用

  1. Butterknife
  2. Dragger
  3. Room

另外,还有是运行时注解,例如

  1. Retrofit

APT有什么用 (好处)

可以在编译时生成额外的.java文件,在程序运行的时候调用相关方法,可以达到减少重复代码的效果。它的好处:提高开发效率,使得项目更容易维护和扩展,同时几乎不影响性能。

APT原理 (为什么)

通过APT(Annotation Processing Tool)技术,即注解处理器,在编译时扫描并处理注解,注解处理器最终生成处理注解逻辑的.java文件。

APT实践 (怎么做)

  1. 创建自定义注解@interface;
  2. 创建并注册注解处理器AbstractProcesso,生成处理注解逻辑的.java文件;
  3. 封装一个供外部调用的API,用的是反射技术,具体来说就是调用第二步中生成的代码中的方法;
  4. 在业务代码中使用,比如Activity、Fragment、Adapter

参考

  1. Android编译时注解–入门篇(AbstractProcessor、APT)
  2. 你必须知道的APT、annotationProcessor、android-apt、Provided、自定义注解
  3. Android 注解系列之APT工具
  4. Android 利用 APT 技术在编译期生成代码
  5. Android注解处理器APT技术简介

2.x和3.x版本依赖方式比较

2.x 3.x
compile implementation、api
provided compile only
apk runtime only
api api

替代关系:

  • compile依赖关系已被弃⽤,被implementation和api替代;
  • provided被compile only替代;
  • apk被runtime only替代;
  • api:跟2.x版本的 compile完全相同。
阅读全文 »

1
2
3
4
5
6
7
8
9
repositories {
maven {
//解决 gradle.build 仓库更换为阿里云仓库后报错
allowInsecureProtocol = true
//阿里云仓库
url 'http://maven.aliyun.com/nexus/content/groups/public/'
}
。。。。。。
}