Android最全Android篇:2024初中级Android开发社招面试解答(下),2024年最新给android程序员的一些面试建议有哪些

最后

对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

以下是今天给大家分享的一些独家干货:

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

    *   宿主: 就是当前运行的APP。
    *   插件: 相对于插件化技术来说,就是要加载运行的apk类文件。
*   而**热修复**则是从修复bug的角度出发,强调的是在不需要二次安装应用的前提下修复已知的bug。能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 类加载机制
    • Android中常用的两种类加载器,DexClassLoaderPathClassLoader,它们都继承于BaseDexClassLoader,两者区别在于PathClassLoader只能加载内部存储目录的dex/jar/apk文件。DexClassLoader支持加载指定目录(不限于内部)的dex/jar/apk文件
  • 插件通信:通过给插件apk生成相应的DexClassLoader便可以访问其中的类,可分为单DexClassLoader和多DexClassLoader两种结构。
    • 若使用多ClassLoader机制,主工程引用插件中类需要先通过插件的ClassLoader加载该类再通过反射调用其方法。插件化框架一般会通过统一的入口去管理对各个插件中类的访问,并且做一定的限制。
    • 若使用单ClassLoader机制,主工程则可以直接通过类名去访问插件中的类。该方式有个弊端,若两个不同的插件工程引用了一个库的不同版本,则程序可能会出错。
  • 资源加载
    • 原理在于通过反射将插件apk的路径加入AssetManager中并创建Resource对象加载资源,有两种处理方式:
      • 合并式:addAssetPath时加入所有插件和主工程的路径;由于AssetManager中加入了所有插件和主工程的路径,因此生成的Resource可以同时访问插件和主工程的资源。但是由于主工程和各个插件都是独立编译的,生成的资源id会存在相同的情况,在访问时会产生资源冲突。
      • 独立式:各个插件只添加自己apk路径,各个插件的资源是互相隔离的,不过如果想要实现资源的共享,必须拿到对应的Resource对象。
  • 推荐文章:
6、组件化原理
  • 参考回答:
    • 引入组件化的原因:项目随着需求的增加规模变得越来越大,规模的增大导致了各种业务错中复杂的交织在一起, 每个业务模块之间,代码没有约束,带来了代码边界的模糊,代码冲突时有发生, 更改一个小问题可能引起一些新的问题, 牵一发而动全身,增加一个新需求,需要熟悉相关的代码逻辑,增加开发时间
      • 避免重复造轮子,可以节省开发和维护的成本。
      • 可以通过组件和模块为业务基准合理地安排人力,提高开发效率。
      • 不同的项目可以共用一个组件或模块,确保整体技术方案的统一性。
      • 为未来插件化共用同一套底层模型做准备。
    • 组件化开发流程就是把一个功能完整的App或模块拆分成多个子模块(Module),每个子模块可以独立编译运行,也可以任意组合成另一个新的 App或模块,每个模块即不相互依赖但又可以相互交互,但是最终发布的时候是将这些组件合并统一成一个apk,遇到某些特殊情况甚至可以升级或者降级
    • 举个简单的模型例子

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 App是主application,ModuleA和ModuleB是两个业务模块(相对独立,互不影响),Library是基础模块,包含所有模块需要的依赖库,以及一些工具类:如网络访问、时间工具等

  • 注意:提供给各业务模块的基础组件,需要根据具体情况拆分成 aar 或者 library,像登录,基础网络层这样较为稳定的组件,一般直接打包成 aar,减少编译耗时。而像自定义 View 组件,由于随着版本迭代会有较多变化,就直接以源码形式抽离成 Library
  • 推荐文章:
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端自动采集全部事件并上报埋点数据,在后端数据计算时过滤出有用数据
    • 推荐文章:
9、Hook以及插桩技术
  • 参考回答:
    • Hook是一种用于改变API执行结果的技术,能够将系统的API函数执行重定向(应用的触发事件后台逻辑处理是根据事件流程一步步地向下执行。而Hook的意思,就是在事件传送到终点前截获并监控事件的传输,像个钩子钩上事件一样,并且能够在钩上事件时,处理一些自己特定的事件,例如逆向破解App)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • Android 中的 Hook 机制,大致有两个方式:
    • 要 root 权限,直接 Hook 系统,可以干掉所有的 App。
    • 无 root 权限,但是只能 Hook 自身app,对系统其它 App 无能为力。
  • 插桩是以静态的方式修改第三方的代码,也就是从编译阶段,对源代码(中间代码)进行编译,而后重新打包,是静态的篡改; 而Hook则不需要再编译阶段修改第三方的源码或中间代码,是在运行时通过反射的方式修改调用,是一种动态的篡改
  • 推荐文章:
10、Android的签名机制?
  • 参考回答:
    • Android的签名机制包含有消息摘要数字签名数字证书
      • 消息摘要:在消息数据上,执行一个单向的 Hash 函数,生成一个固定长度的Hash值
      • 数字签名:一种以电子形式存储消息签名的方法,一个完整的数字签名方案应该由两部分组成:签名算法和验证算法
      • 数字证书:一个经证书授权(Certificate Authentication)中心数字签名的包含公钥拥有者信息以及公钥的文件
    • 推荐文章:
11、v3签名key和v2还有v1有什么区别
  • 参考回答:
    • v1版本的签名中,签名以文件的形式存在于apk包中,这个版本的apk包就是一个标准的zip包,V2V1的差别是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的公钥所属于的证书

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

12、Android5.0~10.0之间大的变化
  • 参考回答:
    • Android5.0新特性
      • MaterialDesign设计风格
      • 支持64位ART虚拟机(5.0推出的ART虚拟机,在5.0之前都是Dalvik。他们的区别是:Dalvik,每次运行,字节码都需要通过即时编译器转换成机器码(JIT)。 ART,第一次安装应用的时候,字节码就会预先编译成机器码(AOT))
      • 通知详情可以用户自己设计
    • Android6.0新特性
      • 动态权限管理
      • 支持快速充电的切换
      • 支持文件夹拖拽应用
      • 相机新增专业模式
    • Android7.0新特性
      • 多窗口支持
      • V2签名
      • 增强的Java8语言模式
      • 夜间模式
    • Android8.0(O)新特性
      • 优化通知:通知渠道 (Notification Channel) 通知标志 休眠 通知超时 通知设置 通知清除
      • 画中画模式:清单中Activity设置android:supportsPictureInPicture
      • 后台限制
      • 自动填充框架
      • 系统优化
      • 等等优化很多
    • Android9.0(P)新特性
      • 室内WIFI定位
      • “刘海”屏幕支持
      • 安全增强
      • 等等优化很多
    • Android10.0(Q)新特性
      • 夜间模式:包括手机上的所有应用都可以为其设置暗黑模式。
      • 桌面模式:提供类似于PC的体验,但是远远不能代替PC。
      • 屏幕录制:通过长按“电源”菜单中的"屏幕快照"来开启。
    • 推荐文章:Android Developers 官方文档
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)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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操作
    • 推荐文章:
17、如何绕过9.0限制?
  • 参考回答:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

18、用过哪些网络加载库?OkHttp、Retrofit实现原理?

总结

写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于Flutter的学习思路及方向,从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。
由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的
还有高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。

跨平台开发:Flutter.png

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

5191232846)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值