Android 面试准备

260 阅读5分钟

什么是AOP?

blog.csdn.net/coo123_/art…

AOP和OOP一样,是一种程序设计思想。

程序设计有六大原则,其中第一原则就是单一职责原则。意思就是一个类只负责一件事情。这与OOP的封装特性相得益彰。在这个条件下,我们的程序会被分散到不同的类、不同的方法中去。这样做的好处是降低了类的复杂性,提高了程序的可维护性。但是同时,它也使代码变得啰嗦了。例如,我们要为方法添加调用日志,那就必须为所有类的所有方法添加日志调用,尽管它们都是相同的。为了解决上述问题,AOP应运而生了。

AOP旨在将横切关注点与业务主体进行分类,从而提高程序代码的模块化程度。横切关注点是一个抽象的概念,它是指那些在项目中贯穿多个模块的业务。上个例子中日志功能就是一个典型的横切关注点。

AOP的几种实现方式:

  • 动态代理(运行期通过接口直接生成代理对象)
  • APT(编译期注解处理技术)
  • AspectJ(一种编译器,它在Java编译器的基础上增加了关键字识别和编译方法)
  • Transform + Javassist/ASM(Transform是Android Gradle提供的,可以操作字节码的一种方式。)

我们可以用来实现什么功能?

利用AOP可以做一些很有意思的事情。一些知名的开源框架,他们都采用了AOP的思想。例如:ButterKnife、Retrofit、Hugo等。另外,AOP在性能检测和埋点技术上出现了百家争鸣的局面。

性能检测与优化。360的ArgusAPM、滴滴的booster、Jake Wharton大神的Hugo。

埋点技术。罗辑思维的DDAutoTracker、神策数据的Sensors Analytics、网易的HubbleData等。

除此之外,借助AOP我们还可以实现以下功能:

通常我们在向服务器请求数据时,会显示一个Loding,等到结果返回后再隐藏它。我们可以通过AOP技术把显示、隐藏Loding的动作和业务主体分离开。

权限管理。推荐一个开源库Aopermission,用AspectJ解决了权限问题。

什么是Hook?

blog.csdn.net/qq_39731011…

在事件执行的过程中截获并监控事件的执行流,将自身的代码融入其执行流中

热修复原理

  • 什么是热修复?

    说的清新脱俗一点,就是线上实时修复bug

  • 为什么要有热修复呢?(优点)

    降低了成本,用户体验也好,不用像原来修复bug(哪怕就是一行代码)还得重新打包再发送新版本到应用市场,再让用户下载,那样成本高不说,用户体验还特别不好,所以就出现了热修复。

  • 热修复的原理?

    热修复主要是通过android的类加载机制来实现的。

    Android中有两个类加载器PathClassLoader和DexClassLoader,准确的来说应该是有三个,还有一个BaseDexClassLoader,BaseDexClassLoader是上面这两个类加载器的父类,在BaseDexClassLoader里面有一个重要的属性DexPathList,DexPathList在BaseDexClassLoader的构造函数中被创建出来,DexPathList里面有两个构造函数SplitDexPath()(将dexPath目录下的所有文件转成一个File集合)和makeDexElments()(将File集合转为Elment数组), 在这个BaseDexClassLoader里面还有一个特别重要的方法,这也是它的核心方法。findClass()从Elemet数组中拿出一个个dex文件,在从dex文件中搜索class,正因为这个特性,我们只需要将Element数组与App原Element数组合并,得到一个新的Element数组,要注意摆放的先后顺序,然后将这个新的Element数组用反射的方式赋值给App当前类加载器的pathList中的Elements数组,因为pathList的 findClass()是采用遍历方式一个个从Element中找class,而修复好的class所在的Element排在有Bug的class的Element的前面,所以,当App再次从类加载器中拿Class时就只会拿到前面的Class,也就是Bug已经修复好的class。这就是热修复的原理。

Android 进程通讯数据为什么要实现序列化?

Android不同的进程都有自己独立的内存空间,且相互之间不能进行访问。如果像我们平常传一个句柄的方式去传值的话肯定是失败的,因为句柄也是指定内存空间的一个区域。现在进程无法访问目标进程的内存空间,所以句柄传过去也是没有用的。 所以我们必须将要传输的数据转换成能够在内存空间流通的形式。这个转化过程就叫做序列化和反序列化。 简单来说是这样的:比如现在我们要将一个对象的数据从客户端传到服务端去,我们就可以在客户端对这个对象进行序列化的操作,将其中包含的数据转化为序列化流,然后将这个序列化流传输到服务端的内存中去,再在服务端对这个数据流进行反序列化的操作,从而还原其中包含的数据。 Android中对数据序列化有两种方法:一种是实现Serializable接口另一种是实现Parcelable接口。

Android中数据序列化之Serializable与Parcelable

Android AIDL进程间通信

UML各种图总结-精华

www.cnblogs.com/jiangds/p/6…

Java静态代理和动态代理理解

www.cnblogs.com/jiangds/p/6…

Java链表

www.cnblogs.com/782687539-n…

  1. 什么是链表?
  2. 链表的特点是什么?
  3. 链表的实现原理?
  4. 如何自己写出一个链表?

Google 最支持的 Android 应用架构到底是什么?

www.jianshu.com/p/c204543ac…

Android开发核心知识点笔记

github.com/BlackZhangJ…

聊聊 MVP 的缺点 与 MVVM 的优点

blog.csdn.net/weixin_4536…

GitHub标星5.6K+Jetpack MVVM 的项目实践

www.jianshu.com/p/d6f8f0d01…