一、开始的开始

**Android框架体系架构(高级UI+FrameWork源码)**这块知识是现今使用者最多的,我们称之Android2013~2016年的技术,但是,即使是这样的技术,Android开发者也往往因为网上Copy代码习惯了而导致对这块经常“使用”的代码 **熟悉而又陌生:**熟悉的是几乎天天在和它们打交道,天天在复制这些代码;陌生的是虽然天天和这些代码打交道,但是并没有深入研究过这些代码的原理,代码深处的内涵。

所以我们需要从新的角度去分析这些知识点,深入研究他们,要学习源码,模仿源码,然后再hook源码,这样才能说自己懂这块的知识。这些都是做Android开发,更是做高级工程师的基础。

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

参考回答:

因为在组件化中,各个业务模块之间是各自独立的, 并不会存在相互依赖的关系, 所以一个业务模块是访问不了其他业务模块的代码的, 如果想从 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端自动采集全部事件并上报埋点数据,在后端数据计算时过滤出有用数据

2.Hook以及插桩技术

参考回答:

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中常用布局分为传统布局和新型布局

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

    • 框架布局(FrameLayout):
    • 线性布局(LinearLayout):
    • 绝对布局(AbsoluteLayout):
    • 相对布局(RelativeLayout):
    • 表格布局(TableLayout):
  • 新型布局(可视化拖拽控件、编写XML代码、代码生成):

    • 约束布局(ConstrainLayout)
  • 对于嵌套多层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相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2020-2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节

还有 高级架构技术进阶脑图、Android开发面试专题资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
转存中…(img-xYxbT20F-1650358337090)]

[外链图片转存中…(img-mhpL8oTZ-1650358337090)]

[外链图片转存中…(img-kFDuC9ze-1650358337091)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

Android软件开发面试题,安卓面试题库相关推荐

  1. Android软件开发面试题,Android入门

    前言 首先声明,楼主不是什么大牛,没有多牛逼的技术,只是公司扩招团队,有幸作为技术面试官,面试了这么多人之后的感想,希望对大家有一点点帮助. Java相关 容器(HashMap.HashSet.Lin ...

  2. c++软件开发面试旋极面试题_经典软件开发面试题:浏览器中输入一个网址后发生了什么?...

    经典软件开发面试题:浏览器中输入一个网址后发生了什么? ​ 大家好, 这一期呢,我们来谈一个经典的面试题.这种题目是在浏览器中输入一个网址以后, 会显示一个网页,这期间到底发生了什么? 答案要求说的越 ...

  3. 耗时118天爆肝【1296页】的“Android高级开发面试题”,终于成功上岸字节

    前言 本人16年毕业于一家普通二本,考研裂开了且没有实习经验,只做过两个项目,每天就是不断地投简历.刷面经,感觉自己都要抑郁了,最后勉强进入了一家学校合作的互联网公司,后面陆陆续续也换了几家公司,毕业 ...

  4. c++软件开发面试旋极面试题_腾讯软件开发面试题(有详细解答)

    我大学的时候,就有些博客的习惯.今天翻回去看之前写的博客,觉得有些幼稚,也有些惊喜.比如17 年初写的腾讯软件开发面试题还挺多人阅读评论的,这是我意想不到的,今天也整理一下,发出来给大家看下. 1.已 ...

  5. android软件开发之webView.addJavascriptInterface循环渐进【二】

    说明 文章列表 android软件开发之webView.addJavascriptInterface循环渐进[一]: http://www.sollyu.com/android-software-de ...

  6. Live软件开发面面谈——权限

    第6章  权限 闲人莫入.机关重地,非请勿入.日剧中命案现场的立入禁止.神剧里文件袋上的机密绝密标签.物业小区的来访登记,出入示证.政府大院的警卫.女生宿舍楼下的阿姨.公司办公室的门禁--这些美妙的标 ...

  7. Android软件开发之TextView详解(六)

    Android软件开发之TextView详解 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/ ...

  8. C/C++面经嵌入式面经软件开发面经<28/30>-- 单片机相关(一)

    高级专栏系列: 嵌入式面经解析大全专栏链接 :嵌入式/C++面试题解析大全 嵌入式面经解析大全目录详情 : 嵌入式面经111道面试题全解析C/C++可参考 嵌入式项目交流分享链接:嵌入式项目交流分享( ...

  9. Android-Notes|BottomNavigationView-爱上-Lottie,android高级开发面试题

    } 复制代码 封装个 BasicData,存放 App 内置的一些基本数据,这里主要针对 Lottie 文件: val mNavigationAnimationList = arrayListOf( ...

最新文章

  1. #每天一种设计模式# 观察者模式
  2. 当我们做MVP产品时,我们到底在做什么?
  3. ExtTabMenu 控件
  4. 虚方法的使用 c# 1613719803
  5. json爬虫获取列表数据不全,已解决
  6. Invalidate() UpdateData() OnPaint()与OnDraw
  7. WPF多线程更新UI的一个解决途径
  8. Python-OpenCV训练一个人脸识别器
  9. PDF怎么翻译成中文?这些方法值得收藏
  10. matlab计算方差和平均值,matlab求平均值和方差
  11. vmware 7.0 序列号_更改solidworks序列号及修改安装
  12. MSP430G2553开发板万年历加温湿度
  13. android仿微信的开门效果
  14. 用户访问共享计算机没有权限,Win7家庭版访问共享计算机提示您可能没有权限使用网络资源解决方法...
  15. erp352产品安装手册
  16. Cesium离线地图极简教程
  17. 集合分页展示,补全最后一页
  18. 威海之恋 mv和歌词
  19. redis常用命令收集
  20. react中jsx行内样式(style)的国定写法、jsx双花括号{{}}写法的解释

热门文章

  1. ORACLE 考试的流程
  2. Q_01_04 量子比特
  3. conda create创建虚拟环境失败
  4. Java笔记 - 黑马程序员_08(Lambda表达式,接口组成更新,方法引用,类加载器,反射)
  5. 吴晓波:预见2021(跨年演讲 —— 08 超级城市大赛鸣枪)
  6. “她经济”时代,兜售少女心的乙女游戏将成新风口?
  7. Springboot毕业设计管理系统毕业设计-附源码221032
  8. 图解HTTP+彩色版 pdf版学习(更新中)
  9. Java 101: Java多态及其类型
  10. 纸壳cms支持php坏境吗,如何参与纸壳CMS开发以及贡献代码