注:由于实际开发与参考答案会有所不一样,再者怕误导你们,因此这些面试题答案仍是本身去理解!面试官会针对简历中提到的知识点由浅入深提问,因此不要背答案,多理解。
1.组件化中路由、埋点的实现
参考回答:
由于在组件化中,各个业务模块之间是各自独立的, 并不会存在相互依赖的关系, 因此一个业务模块是访问不了其余业务模块的代码的, 若是想从 A 业务模块的 A 页面跳转到 B 业务模块的 B 页面, 光靠模块自身是不能实现的,这就须要一种跨组件通讯方案—— 路由(Router)android
路由主要有如下两种场景:面试
- 第一种是组件之间的页面跳转 (Activity 到 Activity, Fragment 到 Fragment, Activity 到 Fragment, Fragment 到 Activity) 以及跳转时的数据传递 (基础数据类型和可序列化的自定义类类型)
- 第二种是组件之间的自定义类和自定义方法的调用(组件向外提供服务)
其原理在于将分布在不一样组件module中的某些类按照必定规则生成映射表(数据结构一般是Map,Key为一个字符串,Value为类或对象),而后在须要用到的时候从映射表中根据字符串从映射表中取出类或对象,本质上是类的查找算法
埋点则是在应用中特定的流程收集一些信息,用来跟踪应用使用的情况编程
- 代码埋点:在某个事件发生时调用SDK里面相应的接口发送埋点数据,百度统计、友盟、TalkingData、Sensors Analytics等第三方数据统计服务商大都采用这种方案
- 全埋点:全埋点指的是将Web页面/App内产生的全部的、知足某个条件的行为,所有上报到后台服务器
- 可视化埋点:经过可视化工具(例如Mixpanel)配置采集节点,在Android端自动解析配置并上报埋点数据,从而实现所谓的自动埋点
- 无埋点:它并非真正的不须要埋点,而是Android端自动采集所有事件并上报埋点数据,在后端数据计算时过滤出有用数据
2.Hook以及插桩技术后端
参考回答:api
Hook是一种用于改变API执行结果的技术,可以将系统的API函数执行重定向(应用的触发事件和后台逻辑处理是根据事件流程一步步地向下执行。而Hook的意思,就是在事件传送到终点前截获并监控事件的传输,像个钩子钩上事件同样,而且可以在钩上事件时,处理一些本身特定的事件,例如逆向破解App)缓存

Android 中的 Hook 机制,大体有两个方式:安全
- 要 root 权限,直接 Hook 系统,能够干掉全部的 App。
- 无 root 权限,可是只能 Hook 自身app,对系统其它 App 无能为力。
插桩是以静态的方式修改第三方的代码,也就是从编译阶段,对源代码(中间代码)进行编译,然后从新打包,是静态的篡改; 而Hook则不须要再编译阶段修改第三方的源码或中间代码,是在运行时经过反射的方式修改调用,是一种动态的篡改服务器
3.Android的签名机制?数据结构
参考回答:
Android的签名机制包含有消息摘要、数字签名和数字证书
- 消息摘要:在消息数据上,执行一个单向的 Hash 函数,生成一个固定长度的Hash值
- 数字签名:一种以电子形式存储消息签名的方法,一个完整的数字签名方案应该由两部分组成:签名算法和验证算法
- 数字证书:一个经证书受权(Certificate Authentication)中心数字签名的包含公钥拥有者信息以及公钥的文件
4.Android5.0~10.0之间大的变化
参考回答:
4.1.Android5.0新特性
- MaterialDesign设计风格
- 支持64位ART虚拟机(5.0推出的ART虚拟机,在5.0以前都是Dalvik。他们的区别是:Dalvik,每次运行,字节码都须要经过即时编译器转换成机器码(JIT)。 ART,第一次安装应用的时候,字节码就会预先编译成机器码(AOT))
- 通知详情能够用户本身设计
4.2.Android6.0新特性
- 动态权限管理
- 支持快速充电的切换
- 支持文件夹拖拽应用
- 相机新增专业模式
4.3.Android7.0新特性
- 多窗口支持
- V2签名
- 加强的Java8语言模式
- 夜间模式
4.4.Android8.0(O)新特性
- 优化通知:通知渠道 (Notification Channel) 通知标志 休眠 通知超时 通知设置 通知清除
- 画中画模式:清单中Activity设置android:supportsPictureInPicture
- 后台限制
- 自动填充框架
- 系统优化
- 等等优化不少
4.5.Android9.0(P)新特性
- 室内WIFI定位
- “刘海”屏幕支持
- 安全加强
- 等等优化不少
4.6.Android10.0(Q)新特性
- 夜间模式:包括手机上的全部应用均可觉得其设置暗黑模式。
- 桌面模式:提供相似于PC的体验,可是远远不能代替PC。
- 屏幕录制:经过长按“电源”菜单中的"屏幕快照"来开启。
5.说下Measurepec这个类
参考回答:
做用:经过宽测量值widthMeasureSpec和高测量值heightMeasureSpec决定View的大小
组成:一个32位int值,高2位表明SpecMode(测量模式),低30位表明SpecSize( 某种测量模式下的规格大小)。
三种模式:
- UNSPECIFIED:父容器不对View有任何限制,要多大有多大。经常使用于系统内部。
- EXACTLY(精确模式):父视图为子视图指定一个确切的尺寸SpecSize。对应LyaoutParams中的match_parent或具体数值。
- AT_MOST(最大模式):父容器为子视图指定一个最大尺寸SpecSize,View的大小不能大于这个值。对应LayoutParams中的wrap_content。
决定因素:值由子View的布局参数LayoutParams和父容器的MeasureSpec值共同决定。具体规则见下图:

6.请例举Android中经常使用布局类型,并简述其用法以及排版效率
参考回答:
Android中经常使用布局分为传统布局和新型布局

- 对于嵌套多层View而言,其排版效率:LinearLayout = FrameLayout >> RelativeLayout
7.区别Animation和Animator的用法,概述其原理
参考回答:
- 动画的种类:前者只有透明度,旋转,平移,伸缩4种属性,而对于后者,只要是该控件的属性,且有setter该属性的方法就均可以对该属性执行一种动态变化的效果。
- 可操做的对象:前者只能对UI组件执行动画,但属性动画几乎能够对任何对象执行动画(无论它是否显示在屏幕上)。
- 动画播放顺序:在Animator中,AnimatorSet正是经过playTogether()、playSequentially()、animSet.play().with()、before()、after()这些方法来控制多个动画协同工做,从而作到对动画播放顺序的精确控制

8.使用过什么图片加载库?Glide的源码设计哪里很微妙?
参考回答:
图片加载库:Fresco、Glide、Picasso等
Glide的设计微妙在于:
- Glide的生命周期绑定:能够控制图片的加载状态与当前页面的生命周期同步,使整个加载过程随着页面的状态而启动/恢复,中止,销毁
- Glide的缓存设计:经过(三级缓存,Lru算法,Bitmap复用)对Resource进行缓存设计
- Glide的完整加载过程:采用Engine引擎类暴露了一系列方法供Request操做
9.如何绕过9.0限制?
参考回答:

10.对于应用更新这块是如何作的? (灰度,强制更新、分区域更新)
参考回答:
10.1.内部更新:
- 经过接口获取线上版本号,versionCode
- 比较线上的versionCode 和本地的versionCode,弹出更新窗口
- 下载APK文件(文件下载)
- 安装APK
10.2.灰度更新:
- 找单一渠道投放特别版本。
- 作升级平台的改造,容许针对部分用户推送升级通知甚至版本强制升级。
- 开放单独的下载入口。
- 是两个版本的代码都打到app包里,而后在app端植入测试框架,用来控制显示哪一个版本。测试框架负责与服务器端api通讯,由服务器端控制app上A/B版本的分布,能够实现指定的一组用户看到A版本,其它用户看到B版本。服务端会有相应的报表来显示A/B版本的数量和效果对比。最后能够由服务端的后台来控制,所有用户在线切换到A或者B版本~
- 不管哪一种方法都须要作好版本管理工做,分配特别的版本号以示区别。 固然,既然是作灰度,数据监控(常规数据、新特性数据、主要业务数据)仍是要作到位,该打的数据桩要打。 还有,灰度版最好有收回的能力,通常就是强制升级下一个正式版。
10.3.强制更新:
通常的处理就是进入应用就弹窗通知用户有版本更新,弹窗能够没有取消按钮并不能取消。这样用户就只能选择更新或者关闭应用了,固然也能够添加取消按钮,可是若是用户选择取消则直接退出应用。
10.4.增量更新:
二进制差分工具bsdiff是相应的补丁合成工具,根据两个不一样版本的二进制文件,生成补丁文件.patch文件。经过bspatch使旧的apk文件与不定文件合成新的apk。 注意经过apk文件的md5值进行区分版本。
11.会用Kotlin、Fultter吗? 谈谈你的理解
参考回答:
- Kotlin是一种具备类型推断的跨平台,静态类型的通用编程语言。 Kotlin旨在与Java彻底互操做,其标准库的JVM版本依赖于Java类库,但类型推断容许其语法更简洁。
- Flutter是由Google建立的开源移动应用程序开发框架。它用于开发Android和iOS的应用程序,以及为Google Fuchsia建立应用程序的主要方法
- 关于kotlin的重要性,相信你们在平常开发能够体会到,应用到实际开发中,须要避免语法糖(例如单列模式、空值判断、高阶函数等)
- 至于Flutter,目前Google官方文档还不完善,市面上采用此语言编写的项目较少,如须要具体深刻,请参考官方文档
Android中级面试题目汇总解答到此就结束了。想获取更多Android方面的技术知识或者面试资料的能够添加
QQ群:925019412