• 合并式:addAssetPath时加入所有插件和主工程的路径;由于AssetManager中加入了所有插件和主工程的路径,因此生成的Resource可以同时访问插件和主工程的资源。但是由于主工程和各个插件都是独立编译的,生成的资源id会存在相同的情况,在访问时会产生资源冲突。
  • 独立式:各个插件只添加自己apk路径,各个插件的资源是互相隔离的,不过如果想要实现资源的共享,必须拿到对应的Resource对象。

推荐文章:

Android动态加载技术 简单易懂的介绍方式(https://segmentfault.com/a/1190000004062866)

深入理解Android插件化技术(https://yq.aliyun.com/articles/361233)

为什么要做热更新(https://www.cnblogs.com/baiqiantao/p/9160806.html)

6、组件化原理

参考回答:引入组件化的原因:项目随着需求的增加规模变得越来越大,规模的增大导致了各种业务错综复杂的交织在一起, 每个业务模块之间,代码没有约束,带来了代码边界的模糊,代码冲突时有发生, 更改一个小问题可能引起一些新的问题, 牵一发而动全身,增加一个新需求,需要熟悉相关的代码逻辑,增加开发时间

  • 避免重复造轮子,可以节省开发和维护的成本。
  • 可以通过组件和模块为业务基准合理地安排人力,提高开发效率。
  • 不同的项目可以共用一个组件或模块,确保整体技术方案的统一性。
  • 为未来插件化共用同一套底层模型做准备。

组件化开发流程就是把一个功能完整的App或模块拆分成多个子模块(Module),每个子模块可以独立编译运行,也可以任意组合成另一个新的 App或模块,每个模块即不相互依赖但又可以相互交互,但是最终发布的时候是将这些组件合并统一成一个apk,遇到某些特殊情况甚至可以升级或者降级

举个简单的模型例子:

App是主application,ModuleA和ModuleB是两个业务模块(相对独立,互不影响),Library是基础模块,包含所有模块需要的依赖库,以及一些工具类:如网络访问、时间工具等。

**注意:**提供给各业务模块的基础组件,需要根据具体情况拆分成 aar 或者 library,像登录,基础网络层这样较为稳定的组件,一般直接打包成 aar,减少编译耗时。而像自定义 View 组件,由于随着版本迭代会有较多变化,就直接以源码形式抽离成 Library

推荐文章:干货 | 从智行 Android 项目看组件化架构实践(https://mp.weixin.qq.com/s?__biz=MjM5MDI3MjA5MQ==&mid=2697268363&idx=1&sn=3db2dce36a912936961c671dd1f71c78)

7、跨组件通信

跨组件通信场景

  • 第一种是组件之间的页面跳转 (Activity 到 Activity, Fragment 到 Fragment, Activity 到 Fragment, Fragment 到 Activity) 以及跳转时的数据传递 (基础数据类型和可序列化的自定义类类型)。
  • 第二种是组件之间的自定义类和自定义方法的调用(组件向外提供服务)。

跨组件通信方案分析:第一种组件之间的页面跳转实现简单,跳转时想传递不同类型的数据提供有相应的 API即可。

第二种组件之间的自定义类和自定义方法的调用要稍微复杂点,需要 ARouter 配合架构中的 公共服务(CommonService) 实现:

  • 提供服务的业务模块:
  • 在公共服务(CommonService) 中声明 Service 接口 (含有需要被调用的自定义方法), 然后在自己的模块中实现这个 Service 接口, 再通过 ARouter API 暴露实现类。
  • 使用服务的业务模块:通过 ARouter 的 API 拿到这个 Service 接口(多态持有, 实际持有实现类), 即可调用 Service 接口中声明的自定义方法, 这样就可以达到模块之间的交互。
  • 此外,可以使用 AndroidEventBus 其独有的 Tag, 可以在开发时更容易定位发送事件和接受事件的代码, 如果以组件名来作为 Tag 的前缀进行分组, 也可以更好的统一管理和查看每个组件的事件, 当然也不建议大家过多使用 EventBus。

如何管理过多的路由表?

  • RouterHub 存在于基础库, 可以被看作是所有组件都需要遵守的通讯协议, 里面不仅可以放路由地址常量, 还可以放跨组件传递数据时命名的各种 Key 值, 再配以适当注释, 任何组件开发人员不需要事先沟通只要依赖了这个协议, 就知道了各自该怎样协同工作, 既提高了效率又降低了出错风险, 约定的东西自然要比口头上说强。
  • Tips: 如果您觉得把每个路由地址都写在基础库的 RouterHub 中, 太麻烦了, 也可以在每个组件内部建立一个私有 RouterHub, 将不需要跨组件的路由地址放入私有 RouterHub 中管理, 只将需要跨组件的路由地址放入基础库的公有 RouterHub 中管理, 如果您不需要集中管理所有路由地址的话, 这也是比较推荐的一种方式。

ARouter路由原理:ARouter维护了一个路由表Warehouse,其中保存着全部的模块跳转关系,ARouter路由跳转实际上还是调用了startActivity的跳转,使用了原生的Framework机制,只是通过apt注解的形式制造出跳转规则,并人为地拦截跳转和设置跳转条件。

常见的组件化方案如下:

8、组件化中路由、埋点的实现

参考回答:因为在组件化中,各个业务模块之间是各自独立的, 并不会存在相互依赖的关系, 所以一个业务模块是访问不了其他业务模块的代码的, 如果想从 A 业务模块的 A 页面跳转到 B 业务模块的 B 页面, 光靠模块自身是不能实现的,这就需要一种跨组件通信方案—— 路由(Router)

路由主要有以下两种场景:

  • 第一种是组件之间的页面跳转 (Activity 到 Activity, Fragment 到 Fragment, Activity 到 Fragment, Fragment 到 Activity) 以及跳转时的数据传递 (基础数据类型和可序列化的自定义类类型)
  • 第二种是组件之间的自定义类和自定义方法的调用(组件向外提供服务)

其原理在于将分布在不同组件module中的某些类按照一定规则生成映射表(数据结构通常是Map,Key为一个字符串,Value为类或对象),然后在需要用到的时候从映射表中根据字符串从映射表中取出类或
对象,本质上是类的查找。

埋点则是在应用中特定的流程收集一些信息,用来跟踪应用使用的状况:

  • 代码埋点:在某个事件发生时调用SDK里面相应的接口发送埋点数据,百度统计、友盟、TalkingData、Sensors Analytics等第三方数据统计服务商大都采用这种方案
  • 全埋点:全埋点指的是将Web页面/App内产生的所有的、满足某个条件的行为,全部上报到后台服务器
  • 可视化埋点:通过可视化工具(例如Mixpanel)配置采集节点,在Android端自动解析配置并上报埋点数据,从而实现所谓的自动埋点
  • 无埋点:它并不是真正的不需要埋点,而是Android端自动采集全部事件并上报埋点数据,在后端数据计算时过滤出有用数据

推荐文章:安卓组件化开源方案实现(https://juejin.im/post/5a7ab8846fb9a0634514a2f5)

9、Hook以及插桩技术

参考回答:Hook是一种用于改变API执行结果的技术,能够将系统的API函数执行重定向(应用的触发事件和后台逻辑处理是根据事件流程一步步地向下执行。而Hook的意思,就是在事件传送到终点前截获并监控事件的传输,像个钩子钩上事件一样,并且能够在钩上事件时,处理一些自己特定的事件,例如逆向破解App)

image.gif

Android 中的 Hook 机制,大致有两个方式:

  • 要 root 权限,直接 Hook 系统,可以干掉所有的 App。
  • 无 root 权限,但是只能 Hook 自身app,对系统其它 App 无能为力。

插桩是以静态的方式修改第三方的代码,也就是从编译阶段,对源代码(中间代码)进行编译,而后重新打包,是静态的篡改; 而Hook则不需要在编译阶段修改第三方的源码或中间代码,是在运行时通过反射的方式修改调用,是一种动态的篡改

推荐文章:

Android插件化原理解析——Hook机制之动态代理(http://weishu.me/2016/01/28/understand-plugin-framework-proxy-hook/)

android 插桩基本概念(https://blog.csdn.net/fei20121106/article/details/51879047)

Android逆向之旅(http://www.520monkey.com/)

10、Android的签名机制?

参考回答:Android的签名机制包含有消息摘要、数字签名和数字证书

  • **消息摘要:**在消息数据上,执行一个单向的 Hash 函数,生成一个固定长度的Hash值
  • **数字签名:**一种以电子形式存储消息签名的方法,一个完整的数字签名方案应该由两部分组成:签名算法和验证算法
  • **数字证书:**一个经证书授权(Certificate Authentication)中心数字签名的包含公钥拥有者信息以及公钥的文件

推荐文章:一篇文章看明白 Android v1 & v2 签名机制(https://blog.csdn.net/freekiteyu/article/details/84849651)

11、v3签名key和v2还有v1有什么区别

参考回答:在v1版本的签名中,签名以文件的形式存在于apk包中,这个版本的apk包就是一个标准的zip包,V2和V1的差别是V2是对整个zip包进行签名,而且在zip包中增加了一个apk signature block,里面保存签名信息。

v2版本签名块(APK Signing Block)本身又主要分成三部分:

  • SignerData(签名者数据):主要包括签名者的证书,整个APK完整性校验hash,以及一些必要信息
  • Signature(签名):开发者对SignerData部分数据的签名数据
  • PublicKey(公钥):用于验签的公钥数据

v3版本签名块也分成同样的三部分,与v2不同的是在SignerData部分,v3新增了attr块,其中是由更小的level块组成。每个level块中可以存储一个证书信息。前一个level块证书验证下一个level证书,以此类推。最后一个level块的证书,要符合SignerData中本身的证书,即用来签名整个APK的公钥所属于的证书

推荐文章:

APK 签名方案 v3(https://source.android.google.cn/security/apksigning/v3)

Android P v3签名新特性(https://xuanxuanblingbling.github.io/ctf/android/2018/12/30/signature/)

12、Android5.0~10.0之间大的变化

Android 5.0新特性:

  • MaterialDesign设计风格
  • 支持64位ART虚拟机(5.0推出的ART虚拟机,在5.0之前都是Dalvik。他们的区别是:Dalvik,每次运行,字节码都需要通过即时编译器转换成机器码(JIT)。ART,第一次安装应用的时候,字节码就会预先编译成机器码(AOT))
  • 通知详情可以用户自己设计

Android 6.0新特性

  • 动态权限管理
  • 支持快速充电的切换
  • 支持文件夹拖拽应用
  • 相机新增专业模式

Android 7.0新特性

  • 多窗口支持
  • V2签名
  • 增强的Java8语言模式
  • 夜间模式

Android** 8.0(O)**新特性

  • 优化通知:通知渠道 (Notification Channel) 通知标志 休眠 通知超时 通知设置 通知清除
  • 画中画模式:清单中Activity设置android:supportsPictureInPicture
  • 后台限制
  • 自动填充框架
  • 系统优化等等优化很多

Android **9.0(P)**新特性

  • 室内WIFI定位
  • “刘海”屏幕支持
  • 安全增强等等优化很多

Android **10.0(Q)**新特性

  • 夜间模式:包括手机上的所有应用都可以为其设置暗黑模式。
  • 桌面模式:提供类似于PC的体验,但是远远不能代替PC。
  • 屏幕录制:通过长按“电源”菜单中的"屏幕快照"来开启。

推荐文章:Android Developers 官方文档(https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels)

13、说下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值共同决定。具体规则见下图:

14、请例举Android中常用布局类型,并简述其用法以及排版效率

参考回答:Android中常用布局分为传统布局和新型布局

传统布局(编写XML代码、代码生成):

  • 框架布局(FrameLayout):
  • 线性布局(LinearLayout):
  • 绝对布局(AbsoluteLayout):
  • 相对布局(RelativeLayout):
  • 表格布局(TableLayout):

新型布局(可视化拖拽控件、编写XML代码、代码生成):约束布局(ConstrainLayout):

注:图片出自Carson_Ho的Android:常用布局介绍&属性设置大全(https://blog.csdn.net/carson_ho/article/details/51719519)

对于嵌套多层View而言,其排版效率:LinearLayout = FrameLayout >> RelativeLayout

15、区别Animation和Animator的用法,概述其原理

**动画的种类:**前者只有透明度,旋转,平移,伸缩4种属性,而对于后者,只要是该控件的属性,且有setter该属性的方法就都可以对该属性执行一种动态变化的效果。

**可操作的对象:**前者只能对UI组件执行动画,但属性动画几乎可以对任何对象执行动画(不管它是否显示在屏幕上)。

**动画播放顺序:**在Animator中,AnimatorSet正是通过playTogether()、playSequentially()、animSet.play().with()、before()、after()这些方法来控制多个动画协同工作,从而做到对动画播放顺序的精确控制

16、使用过什么图片加载库?

Glide的源码设计哪里很微妙?

参考回答:图片加载库:Fresco、Glide、Picasso等

Glide的设计微妙在于:

  • Glide的生命周期绑定:可以控制图片的加载状态与当前页面的生命周期同步,使整个加载过程随着页面的状态而启动/恢复,停止,销毁
  • Glide的缓存设计:通过(三级缓存,Lru算法,Bitmap复用)对Resource进行缓存设计
  • Glide的完整加载过程:采用Engine引擎类暴露了一系列方法供Request操作

推荐文章:Glide 源码分析(https://user-gold-cdn.xitu.io/2019/4/24/16a4ec49c3af1f5c)

17、如何绕过9.0限制?

参考回答:

18、用过哪些网络加载库?

OkHttp、Retrofit实现原理?

存设计

  • Glide的完整加载过程:采用Engine引擎类暴露了一系列方法供Request操作

推荐文章:Glide 源码分析(https://user-gold-cdn.xitu.io/2019/4/24/16a4ec49c3af1f5c)

17、如何绕过9.0限制?

参考回答:

[外链图片转存中…(img-vTv0VUeP-1641786523771)]

18、用过哪些网络加载库?

OkHttp、Retrofit实现原理?

2020面试题合集之吊打面试官系列(一),Android中为什么需要Handler相关推荐

  1. 2020面试题合集之吊打面试官系列(一),kotlin数组性能

    参考回答:要测试Android应用程序,通常会创建以下类型自动单元测试: 本地测试:只在本地机器JVM上运行,以最小化执行时间,这种单元测试不依赖于Android框架,或者即使有依赖,也很方便使用模拟 ...

  2. 2020面试题合集之吊打面试官系列(一),农民工看完都会了

    因此,Java提供ReferenceQueue来处理引用对象的回收情况.当SoftReference所引用的对象被GC后,JVM会先将softReference对象添加到ReferenceQueue这 ...

  3. 【面试 - 八股文】Linux 高频面试题,助你吊打面试官系列

    继上次输出[面试-八股文]mysql 万字总结,助你吊打面试官,业界反响还不错 从 linux 基础.三剑客(grep\sed\awk).shell 脚本编程.文件管理命令.磁盘管理命令.网络通讯命令 ...

  4. 【面试-八股文】万字app测试 面试题,助你吊打面试官系列

    大家好,我是温大大. 最近温大大的读者们问我有没有app相关的面试题, 作为「平易近人」的大大怎么能忍心说没有呢, 这不继续爆肝 输出app测试工程师专项面试题, 本篇从:app测试基础.app 测试 ...

  5. 重复订单号校验_吊打面试官系列重复消费、顺序消费、分布式事务

    你知道的越多,你不知道的越多 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难. 作为一个在互联网公司面一次拿一次Of ...

  6. 吊打面试官系列之---吃透MySQL mvcc机制--锁模块

    目录 事务四大特性(ACID) 事务并发访问引起的问题以及如何避免 1.更新丢失--mysql所有事务隔离级别都可以在数据库层面上均可避免 2.脏读--read-committed事务隔离级别以上可避 ...

  7. 【吊打面试官系列】APP测试常见面试题解析

    App测试 1.什么是手机测试?什么是手机软件测试? 手机测试:指对手机硬件.软件和结构等多方面的测试. 手机软件测试:就是对手机上的软件App进行测试的一个过程,他是符合多种网络,不同系统不同分辨率 ...

  8. 2021年最新Android大厂面试题来袭!吊打面试官系列!

    面试经验 自己大大小小投了也有20多家公司,不过经历简历筛选以及笔试淘汰,最终就经历了7家公司的面试.下面我就把自己面试中问到的问题贴出来供大家参考,一些具体项目相关的就不贴了. 阿里巴巴 阿里是3月 ...

  9. Android+音视频 全新面试题,求职/跳槽吊打面试官

    每年的金三银四.金九银十都是程序员狂欢的时刻,众多企业在这个时期也都大规模的进行招聘. 就我身边的很多Android开发都有这么一个习惯:跳槽之前都会遍寻各种面试题进行刷题,不过尽管找了很多面试题,面 ...

最新文章

  1. centos6 安装 mantisbt-1.2.8 —— (2)【linux】VMware安装CentOS 6.4
  2. 前端开发中Cookie那些事儿
  3. my sql Group_concat函数
  4. 收集的yum命令博文
  5. 实现div里的img图片水平垂直居中
  6. Qt在Mac系统下添加alias到IncludePath中
  7. Android页面传值b,android数据传递(一)之activityA传递到activityB
  8. 如何关闭flashhelper的ff新推荐广告弹窗
  9. vs2012 ultimate 密钥
  10. Affinity笔记:渐变工具
  11. php吧输出结果进行分割,[判断题] 呼叫处理程序按照一定的逻辑对呼叫进行处理,对呼叫的处理结果与局数据、用户数据的内容无关。...
  12. TCP自时钟/拥塞控制/带宽利用之脉络半景解析
  13. 2017-07-07 2,3,5,7倍数
  14. 城堡争霸服务器维护,城堡争霸 - 阵营守护神(国际服)无法连接服务器是什么原因...
  15. 复旦大学和中科大 计算机,强基计划遇冷?!复旦大学和中科大都没招满...
  16. 项目开发安全经验总结
  17. 本科计算机找不到工作,中国IT行业缺口突破百万,为什么计算机行业毕业生还是找不到工作...
  18. 斐讯路扫地机器人怎么关机_扫地机器人使用方法,使用教程
  19. YOLOv5模型剪枝压缩
  20. 浅谈静电场的边值问题(包括数学物理方法和数值计算)

热门文章

  1. ico图标在线制作工具以及带步骤(图文教程)
  2. 阿里云研究中心主任田丰: 如何从实体经济走向智能产业
  3. 服务器怎么和本地共享文件夹同步,云服务器如何共享文件夹同步
  4. 四川托普计算机学校官网,四川中等职业技术学院
  5. 《Linux命令行与Shell脚本编程大全第2版.布卢姆》pdf
  6. 薅羊毛的神器,悄悄介绍给你,低调使用!
  7. 33岁想从头学做网页设计_从头开始设计字体-并在24小时内将其提交给Google字体...
  8. Java实现Base64、DES、AES、RSA加解密以及加密方式之间的区别
  9. 2021年10月最新使用selenium爬取裁判文书数据(本文仅供技术交流使用)
  10. 【论文阅读】SyncPerf: Categorizing, Detecting, and Diagnosing Synchronization Performance Bugs