一直混迹于移动互联网,喜欢并钻研与前端有关的东西:iOS、Android、H5、RN、小程序等等,对移动端的架构有丰富的经验。
我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
本文紧接着前一章Android组件化开发实践(八):组件生命周期如何实现自动注册管理,主要讲解怎么通过自定义插件来实现组件生命周期的自动注册管理。 1. 采用groovy创建插件 新建一个Java Library module,命名为lifecycle...
1. 如何修改打包好的apk名称 Android Studio从2.0升级到3.0之后,要修改打包后的apk名称,必须采用以下配置: android { .
我们在单一工程里开发时代码运行良好,但是在进行组件化开发时,经常会出现一些莫名其妙的问题。 1. ButterKnife无法使用 组件化之后,在library中使用ButterKnife,会发现引用R.id的地方都会飘红报错: 查看错误原因都是:Attribute value must be constant。
比较早期的时候,我们开发APP都是采用单一工程模式,随着业务的发展,APP越来越庞大,开发人员越来越多,所以必然面临着将老项目进行组件化的过程。 在将老项目进行组件化的过程中,会面临很多的问题,以我自己的经验为例,主要有以下点: 代码年久失修,文档缺失,不敢随意修改,否则会牵一发而动全身,引起现有正常业务的运行; 进行组件化重构需要花费比较长的时间,业务不可能停下来等着你去重构; 组件化重构后,需要全量回归测试,测试比较花费时间; 相信每个人都会碰到这些问题,组件化重构势在必行,但是老板不可能专门给你几个月,啥业务都不做就让你进行代码重构。
每个Android应用启动时,都会先创建一个Application。通常在Application里我们会做一些应用初始化的操作,常见的有第三方SDK初始化。
记得第一次实施项目组件化时,遇到的最大困扰就是,组件之间的通信问题。例如: 怎么从这个组件跳转到另一个组件的页面; 组件之间怎么传递数据; 怎么获取其他组件的数据或服务; 组件怎么通知其他组件响应某个事件; 1. 页面跳转统一采用路由 在Android中,页面跳转都是通过startActivity来实现的。
不以规矩,不成方圆。特别是多人协作开发时,如果没有统一的开发规范,势必会造成各种混乱。在实际开发中,常常会碰到的问题有: 引入的某个第三方库版本冲突; 不同组件里同名资源文件被覆盖; APP壳工程打包时AndroidManifest.xml合并发生错误; 往往单独的组件工程运行良好,但是集成到壳工程时就是不行,所以我们必须要严格遵守规范,尽可能减少这种问题的出现。
先说说我自己的组件化架构设计方案,请看下图: 组件化架构设计图 图中可以看到,从上往下分为4层:APP壳工程、常规业务组件层、基础业务组件层、基础功能组件层。
1. 前言 三国演义里开篇就说:天下大势,分久必合,合久必分。我发现这话套在软件开发上,也特别贴切。我记得我刚入门时做java后台开发,以及后来做Android应用程序开发,刚开始都是采用中心化管理的思想,将相同的资源集中进行管理,但是做着做着,发现集中管理的资源太多了,多人开发时牵一发而动全身,进而又要对原本的项目进行拆分,演变出什么SOA架构、什么微服务,以及我这里要讲的Android组件化实践。
最近通过LeakCanary检测内存泄漏,发现一个很莫名其妙的问题,截图如下所示: 内存泄漏 从这里可以看到,InputMethodManager的mNextServedView持有了一个RecyclerView的引用,而RecyclerView则持有了IndexActivity的引用,从而导致了IndexActivity的内存泄漏。
最近有个项目,其中有一个新闻详情页面,在新闻详情下面是一个用户评论列表,最底部有一个评论输入框,有点类似于今日头条的新闻详情页面。评论列表是采用RecyclerView开发的,点击底部评论输入框会弹出软键盘。
最近有个APP中使用了微信授权登录功能,项目中我们采用leakcanary来检测内存泄漏,发现微信登录有内存泄漏的问题。现将解决过程记录如下,不确定与微信SDK版本有没关系,欢迎讨论指正。
1. 冷启动与热启动 通常我们在使用某个应用程序时,都是点击桌面应用图标来启动该程序。你肯定或多或少的碰到过这种情况:应用启动的一刹那,手机会先白屏或者黑屏一段时间,然后再进入应用程序的主页,但是你退出应用后再次打开APP,确又发现白屏时间极短或者压根感觉不出来。
前面已经介绍了Android平台上的几种ClassLoader,这几种ClassLoader都有各自的使用场景,有了这些基础知识之后,才能更好地理解以及探究Android热修复技术。
在Java所编写的应用程序里,实质上都是ClassLoader来负责加载类的。有隐式加载类:如new一个实例对象,会自动触发ClassLoader来加载该类;有显示加载类:如直接调用ClassLoader的loadClass()方法来加载。
1. 为什么需要热修复技术 当我们的Android应用程序发布到各大市场上之后,如果出现了重大bug,大部分情况下只能通过紧急发包升级来解决问题,但是这会带来以下几个问题: 应用升级需要一定的时间,时效性差,如iOS应用发布审核可能需要好几天; 需要...
1. 什么是类加载器? 类加载的实际过程为:通过一个类的全限定名来获取描述此类的二进制字节流。我们把实现这个动作的代码模块成为“类加载器”。 2. 怎么比较两个类"相等"? 我们知道使用关键字instanceof,可以判断某个对象是否是某个Class的实例对象,但是一旦涉及到类加载器ClassLoader之后,就会出现很多令人迷惑的现象。
1.死锁是怎么产生的 类初始化是一个很隐蔽的操作,是由虚拟机主导完成的,开发人员不了解类加载机制的话,可能压根不知道类初始化是个什么东东。类初始化的文章有专门讲过,可参考Java虚拟机类加载机制,里面有详细描述。
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。
Java代码必须要被编译成class文件后,虚拟机才能够加载运行,要搞清楚Java的类加载机制,首先必须要理解Class文件的内部结构。 本文参考了周志明所著《深入理解java虚拟机》一书,并结合自身实践而写。
程序计数器、虚拟机栈、本地方法栈三个内存区域随线程而生,随线程而灭,一般不需要考虑内存回收的问题。但是Java堆和方法区的内存则不一样,它们的分配和回收都是动态的,因此Java垃圾收集主要是针对这部分区域。
在Java运行时数据区中,除了Program Counter Register(程序计数器)之外,其他几个数据区中均可能发生OutOfMemoryError,俗称OOM。
Java虚拟机在执行Java程序的过程中,会把它所管理的内存划分为若干个不同的数据区域,我们称之为运行时数据区域。 这些区域都有各自的用途,以及创建和销毁的时间。
异步无处不在,特别是网络请求,必须在子线程中执行。异步一般用来处理比较耗时的操作,除了网络请求外还有数据库操作、文件读写等等。一个典型的异步方法如下: public class DataManager { public interface O...
前面花了很多篇幅介绍的JUnit和Mockito,它们都是针对Java全平台的一些测试框架。写到这里,咱们开始介绍一个专门针对Android平台的单元测试框架Robolectric。
前面花了很大篇幅来介绍JUnit4,JUnit4是整个单元测试的基础,其他的测试框架都是跑在JUnit4上的。接下来我们将来学习怎么样在Android的单元测试中集成Mockito。
前面一章介绍了JUnit的一些基本用法,本章来介绍关于JUnit更高级的用法,这些功能我们可能并不一定会用到,但是了解它,对JUnit会有更深刻的认识。 5.1 Test runners 大家刚开始使用JUnit的时候,可能会跟我一样有一个疑问,JUnit没有main()方法,那它是怎么开始执行的呢?众所周知,不管是什么程序,都必须有一个程序执行入口,而这个入口通常是main()方法。
JUnit是java开发人员的一个主要的测试工具,做Android开发同样是离不开java的,所以Android单元测试依然可以基于JUnit来写测试。但是JUnit只能运行在纯java环境上,前面我们介绍过MVP架构下,可以将View层隔离开来,单独针对Presenter层、Model层来测试。
3.1 Android单元测试难点 在Android应用程序里写单元测试时,刚开始往往会有无从下手的感觉。他既有处理UI逻辑的代码,也有处理业务逻辑的代码,总感觉一团乱麻。
2.1 什么是单元测试 首先需要弄清楚这个概念,到底什么是单元测试。即便我是计算机专业毕业的,说实话如果不是专门研究了一段时间,我也说不出一个所以然来。以下是百度百科的定义: 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。