面试题库Android

1. View 的绘制原理

https://www.cnblogs.com/jycboy/p/6219915.html
https://www.jianshu.com/p/5a71014e7b1b
http://blog.csdn.net/fwt336/article/details/52979876

2. Android 进程间通信方式

http://blog.csdn.net/fiendvip/article/details/50954393

3. Android Binder 机制

http://blog.csdn.net/qq_23191031/article/details/60145022

4. Activity 加载过程

http://blog.csdn.net/yyh352091626/article/details/51086117

5. Activity 启动模式

https://mp.weixin.qq.com/s/GAFRItGiKnrAN76erxpnLw

6. MVP 和 MVC 和MVVM 有什么区别

http://blog.csdn.net/greathfs/article/details/52017155

7. Android 性能优化

https://mp.weixin.qq.com/s/ax6O76RF4VpZ66keEgPABw

8. Service 概况

http://blog.csdn.net/lqb3732842/article/details/54892813

9. Android 最新官方框架

https://mp.weixin.qq.com/s/qN3JvC_BBuPIHU4mNc9UqQ
https://mp.weixin.qq.com/s/4wAcKoHFv4iQH84w2sccew

10. Android 类加载机制

https://www.jianshu.com/p/3afa47e9112e
https://www.jianshu.com/p/a620e368389a

11. Android 消息处理机制(Looper、Handler、MessageQueue,Message)

https://www.jianshu.com/p/02962454adf7
http://blog.csdn.net/qian520ao/article/details/78262289?locationNum=2&fps=1#4-handler-是如何能够线程切换
  1. 说下什么是Android消息处理机制?
  2. Android消息处理机制的工作原理
  3. Looper、Handler、MessageQueue,Message作用和存在的意义?
  4. Looper 死循环为什么不会导致应用卡死,会消耗大量资源吗?
  5. 主线程的消息循环机制是什么(死循环如何处理其它事务)?
  6. ActivityThread 的动力是什么?(ActivityThread执行Looper的线程是什么)
  7. Handler 是如何能够线程切换,发送Message的?(线程间通讯)
  8. 子线程有哪些更新UI的方法。
  9. 子线程中Toast,showDialog,的方法。(和子线程不能更新UI有关吗)
  10. 如何处理Handler 使用不当导致的内存泄露?

12. Android 事件分发机制

https://www.jianshu.com/p/e99b5e8bd67b

13. Retrofit 分析

https://www.jianshu.com/p/45cb536be2f4

14. Android 动画

https://www.jianshu.com/p/420629118c10

15. Rxjava 使用介绍

https://mp.weixin.qq.com/s/2vDZ7h6SL-LR7n3FR6OMrw

16. View 和 SurfaceView 的区别

http://blog.csdn.net/shareus/article/details/51538507

17. LruCache 原理解析

https://www.jianshu.com/p/b49a111147ee

18. 多线程断点续传

http://blog.csdn.net/tianzhaoai/article/details/56673071
https://www.jianshu.com/p/1bb084d282be

19. Android APP 冷启动时间统计及优化

https://www.jianshu.com/p/c967653a9468
http://blog.csdn.net/code_dream_wq/article/details/75012353
http://blog.csdn.net/zhangyongfeiyong/article/details/61925399

20. 热修复原理

https://mp.weixin.qq.com/s/1SYmgZfVKczAGvXcydn0bA

21. 插件化原理

类的加载
    1)替换App的ClassLoader
    2)修改PathList(例如在PathList中加入我们需要加载的Dex的对应项)
资源的加载:安卓资源由AssetManager加载,应用启动时,系统会为其创建一个AssetManager实例,并由addAssetPath方 法添加资源搜索路径
    1. 插件独立使用一个资源管理器
    2. 添加所有资源路径到宿主,为避免资源冲突,需要对资源ID进行分段,不同的插件使用不同分段的资源ID
组件的动态注册

Android架构师

  1. 整体性能如何探测,有哪些方面,什么指标,怎么保证更流畅
  2. 谈谈架构。大项目,逻辑多怎么办,如何应对多App和多终端
  3. android的发展大事件和主要技术发展
  4. avtivity(service)启动流程简述
  5. 动态化的几种方案
  6. 热修复的原理
  7. 网络这块怎么优化
  8. 数据库性能怎么保证
  9. 线程安全怎么保证,异步并发这块你怎么做的

其实不一定面试时才了解这些,并且了解绝对不是重点,而是实践,绝知此事要躬行是真理,这样的问题也似乎没有“最佳答案”,但是可以发表一下自己观点和实践结论。

有些做法或观点一下子想不起来,需要具体做的时候再google一下,或者跟朋友沟通拓展一下,所以先做个简单的回答,请大家补充。

1. App性能如何探测,有哪些方面,什么指标,怎么保证更流畅?

性能可以根据帧率、内存、CPU、GPU等指标的数据和表现辅助判断,可以从/proc文件夹下读取文件获取cpu、内存等信息,也可以用dumpsys命令获取帧率等信息,也可以通过android API获取相关信息。

还有很多性能相关的分析工具很重要,辅助判断和分析,比如Heap Tool、Memory Monitor、Lint、HierarchyView、WireShark、TraceView等。

保证流畅有很多点可以去研究,比如布局、代码、缓存、网络、数据库、异步并发等方面的优化,涉及很多的知识点,可以google下,先简单说下,有时间再细述。

布局充分利用include、viewstub、merge 等标签,控制层级,避免过度渲染(绘制)。

代码上尽量使用final、局部变量、系统函数如arraycopy等、位移操作是否可以代替乘除、for循环是否可以避免size计算和new对象等等。

缓存方面,线程、位图、视图、网络数据是否可以被缓存,IO用缓冲流。 网络方面,如尽量避免轮询,控制节奏和频率,IP直连,采用SPDY方案(或HTTP2.0)来实现压缩header、多路复用、双向通信等,API数据压缩,多个请求是否可以合并,数据压缩和尝试protocol buffer相关序列化方案。

数据库方面,尝试用SQLiteStatement代替SQLiteDatabase完成操作,索引和事务的充分理解和使用,注意SQL语句语法和拼接,采用部分查询和延迟加载。

异步并发方面,全App只有一个线程池,控制核心并发数量,控制超载时排队数量和策略,合理调度任务,优化业务逻辑。

最后关于帧率,你看到的视觉卡顿,直接原因基本是“掉帧”。关于帧率,尽量保证主线程里做的事情,不会超过16毫秒(其实这挺难的),16毫秒大法好,具体可以去理解下CPU、GPU、屏幕三者如何配合完成渲染的,推荐老罗的博客。

2. 谈谈架构。大项目,逻辑多怎么办,如何应对多App和多终端

适当参考我在知乎的一个回答 怎样搭高质量的Android项目框架,框架的结构具体描述? ,结合模块化、组件化思想去做,多实践一下mvp、mvvm等策略。

3. android的发展大事件和主要技术发展

额,挺多的,朋友们补充吧。 这个问题蛮好的 Android 开发有哪些新技术出现?

4. avtivity(service)启动流程简述

可以自己阅读源代码,结合罗老师的博客,研究的非常棒:Android应用程序启动过程源代码分析

5. 动态化的几种方案

早期的H5方案,通过js和java互通增强h5的能力。 还有DexClasssLoader结合反射代理的方案。 还有React Native方案,手淘的Weex框架。 还有Lua等脚本实现动态化方案。

6. 热修复的原理

Github上读一下AndFix这个项目的源码,还有xposed、dexposed。

大致原理就是将java方法通过c/c++修改属性变为public native方法,上下文携带到native层,然后根据上下文指向另一个java方法,从而“偷梁换柱”,如果是支持ART的手机,那么策略不一样,将bug method的关键信息(classloader、theadid等)保留,将修复过的方法的各种信息赋给bug method,完成“移花接木”。

另外,其实有挺多的策略改变运行时行为的,比如: Javasisst:字节码修改类库,依赖字节码修改和DX类库,可以完成动态替换和切面编程。 AspectJ:依赖字节码编织器,需要按照其语法来编写,需要一点“编织”时间。 Xposed方案,简直是一个Bug,神器般的存在,没准以后会被Android系统修复呢,不仅可以改变自己的类行为还可以hook系统的方法,root过的机器还可以hook其他App和系统进程。

7. 网络这块怎么优化

尽量避免轮询,控制节奏和频率。

IP直连节省DNS解析时间。

尝试其他数据序列化方案比如protocol buffer等。

采用SPDY方案(或HTTP2.0)来压缩header、多路复用、双向通信等。

服务器做优化,比如分布式、缓存之类的,减少API涉及的业务操作所需要的时间嘛。

API接口数据精简,多个请求是否可以合并,增量请求啊、GIP压缩啊什么的,等等。

8. 数据库性能怎么保证

尝试使用SQLiteStatement取代SQLiteDatabase对象完成操作,避免直接使用SQLiteDatabase提供的update、inset等方法。

索引和事务的充分理解和使用,批量操作使用事务极大提升速度,这个我是做过试验的,效果惊人。

SQL语句拼接和本身的优化,仅查询部分局部数据,使用延迟加载策略。

10万条数据插入比系统SQLiteDatabase操作快一倍,推荐我的LiteOrm数据库框架 https://github.com/litesuits/android-lite-orm

9. 线程安全怎么保证,异步并发这块你怎么做的

理解并使用ReentrantLock,Synchronized保护对象或过程,final来保护不可变对象,无状态和只读对象是安全的,合理使用一些 concurrent容器,比如concurrenthashmap等,重量级耗时任务考虑是否可以释放锁,多线程下实例化或延迟加载需要保护起来,保护多线程下关键数据访问的原子性,等等还有很多的。。。

推荐研究下Doug Lea主写和设计的java concurrent包,理解CountDownLatch、CyclicBarrier、Semaphore、FutureTask等对象。

我使用自己写的SmartExecutor,直接继承ExecutorService,封装了一个公共线程池,全App保证只有一个线程池。源码在这个开源项目里:https://github.com/litesuits/android-lite-http

在一个 App 中 SmartExecutor 可以有多个实例,每个实例都有独立核心和等待线程数指标,每个实例都有独立的调度和满载处理策略,但它们 共享一个线程池。这种机制既满足不同木块对线程控制和任务调度的独立需求,又共享一个池资源。独立又共享,最大程度上节省资源,提升性能。

控制核心并发数,尽量和CPU核数保持一致(或者多两个)我认为吞吐量是最佳的,线程过多则调度线程消耗CPU和时间,过少则不能充分利用多核的能力。

控制排队策略和排队数量,是否考虑新任务先处理,过度超载丢掉最老的任务。

还有就是业务上,合理调度任务,优化业务逻辑,不要胡搞乱搞,不作恶。

坚持原创技术分享,您的支持将鼓励我继续创作!