其他分享
首页 > 其他分享> > 安卓未来路在何方?附面试答案

安卓未来路在何方?附面试答案

作者:互联网

**那么在市场紧缩以及大前端的趋势下,我们移动端程序员如何突破职业瓶颈,保持个人的核心竞争力呢?** # 一、硬技能:专业的技术知识 ## 1.Java / Kotlin开发语言 ### Java * 常用数据结构: ArrayList、Vector、 CopyOnWriteArrayList、 HaspMap、ConcurrentHashMap、 HashTable 等使用场景。 * JVM 虚拟机包括 Java 内存管理,GC 垃圾回收机制,类加载机制。推荐书籍:《深入理解 Java 虚拟机 JVM 高级特性与最佳实践》。 * 多线程编程,包括线程池,锁机制,线程同步 。推荐书籍:《Java 并发编程实战》和《Java 多线程编程核心技术》。 * AOP 编程实现,包括 JDK 动态代理实现,ASM 直接操作字节码、CGLIB 实现,其原理封装了 ASM,使用更方便。 * Javassist:在字节码加载前直接修改需要切入的方法,以及注解处理器 APT,这在 Android 中开源的库应用较多,比如 DataBinding , ButterKnife, EventBus3 等等。 * 异常处理 Exception,包括检查性异常、运行时异常处理。 * IO 流相关,包括堵塞型 IO 和非堵塞型 IO。 * Java 的一些高性特级,比如反射、代理、泛型、枚举、正则表达式等等;同时了解一下 jdk1.8,1.9,1.10 等新特性。相关书籍比较多,推荐《Thinking in Java》和《Effective Java》。 ### Kotlin Kotlin 是一个基于 JVM 的新编程语言,在 Google IO 2017 中被 Google 宣布成为 Android 官方开发语言。 Kotlin 有哪些优点? ①简洁性: 提供了很多标准函数,大大减少样板代码的数量。 ②安全性:避免空指针异常等错误。 ③互操作性:充分利用 JVM、Android 和浏览器的现有库。 ④工具友好: 可用任何 Java IDE 或者使用命令行构建。 在 Kotlin 中要树立函数式编程思想。把函数理解为一个值到另一个值的映射关系,以函数作为单元来处理各个业务逻辑,函数既可以做参数,也可以作为返回值。多使用 Kotlin 提供的标准函数,比如 let、run、with、apply、also、 Lambda 表达式。尽量使用闭包和高阶函数。 Kotlin 的另一个突出特点是协程,为设计异步、非阻塞的程序提供了强大的范式。协程是一种轻量级的线程,它提供避免阻塞且更廉价可控的操作: 协程挂起。将复杂异步操作放入底层库中,程序逻辑可顺序表达,以此简化异步编程。 最后简单说下 Kotlin/Native,它的设计初衷是支持在非 JVM 虚拟机平台环境的编程,如 iOS、嵌入式平台等,同时支持与 C 互操作。推荐书籍:《Kotlin 实战》。 ## 2.Android 进阶技术点 **进程相关**,包括 App 进程原理以及 AIDL 原理。 **性能优化**,包括:内存,cpu,耗电量、网络请求、UI 布局、线程、数据库等优化方法以及优化工具的使用。 **Android 源码相关**,包括:Binder 机制,Activity 启动流程,Handler 原理,AMS ,PMS,WMS 原理,View 的绘制流程,Touch 事件传递机制等等。 **编译打包流程**,从 java/kotlin 源码到最终形成 APK 的过程。 **热修复的实现原理**,目前热修复框架的种类繁多,常见的包括底层替换、类加载和 Instant Run 方案。 **逆向工程原理**,主要是为了防止 apk 被反编译破解,以及了解 apk 加固方案。 **插件化**,目前方案同样很多,主流的技术实现是 Hook 方式,注册 Activity 进行占坑,使用占坑 Activity 通过 AMS 验证,还原插件 Activity,其他组件的原理也大致类似。 **NDK 开发**,调用 JNI 以及回调 Java 的方式。 **自定义控件**,需要注意 onMeasure,onLayout,onDraw 的调用时机,以及 Touch 事件分发机制。 **动画 View Animation**,视图动画在很早的 Android 版本系统中就已经提供了,只能被用来设置 View 的动画。 **属性动画 Property Animation**,只对 3.0 以上版本,可以设置给任何 Object,包括还没有渲染到屏幕上的对象。这种动画是可扩展的,可自定义任何类型和属性的动画。 **Webview 中 Native JS 交互**,常用的 JSBridge 等。 **Gradle 的特性以及 DSL 语法**,比如 Gradle Transform API 的使用,它允许第三方插件在 class 文件转为 dex 文件前操作编译好的 class 文件。利用这一特性,我们可以在代码编译阶段实现代码注入或者代码修改,这也是很多埋点技术和热修复技术的基础。 **安全性:**HTTPS 通信原理,数据加密方式,包括 MD5,RSA 等,webview 安全性,代码混淆,数据验签,组件通信安全,服务器通信。 **CI 持续集成**:Jenkins ,Gitlab CI 等搭建持续集成开发工具。 **Sersor 传感器**:包括陀螺仪,加速传感器,方向传感器,重力传感器,光线传感器等。 **Android 开发国际化**。 **ART 和 Dalvik 虚拟机的区别**,主要是 AOT,Ahead-Of-Time 预编译。 **熟悉 DEX 文件结构。** **单元测试**: JUnit4,AndroidJUnitRunner, Mockito 框架的使用。 **自动化测试**:Monkey / Monkey Runner ,Espresso ,UI Automator 等。 **掌握模块化开发方式**:主要注意分好层、模块间跳转通信。 **代码重构能力**,推荐书籍:**《重构改善既有代码的设计》、《重构与模式》** **Google 动态化框架 App Bundles**。 **Jetpack**,Google 推出的新一代组件、工具和架构指导,旨在加快 Android 应用开发速度。Jetpack 主要分为 4 部分: ![](http://www.icode9.com/i/li/?n=2&i=images/20210701/1625151694204284.jpg) **Android开发常用的第三方库:** 响应式编程:RxJava、RxAndroid,Google 的Agera 网络库:包括Retrofit,OkHttp,Volley 图片:Fresco,Gilde,Picasso 依赖注入:Dagger2 数据库:Realm,ORMLite,GreenDAO,ObjectBox 数据总线:EventBus,otto 内存泄漏检测工具 LeakCanary 等 各个技能点如果详细拓展开,会形成相当庞杂的一张知识图谱,建议大家自行梳理总结消化。 ## 3.OOAD 和设计模式 在架构设计方面,首先要掌握的就是面向对象的开发和设计。具体知识点包括: 面向对象三大特性:封装,继承,多态。 五大基本原则(SOLID 原则),单一职责原则,开放封闭原则,里氏替换原则,依赖倒置原则,接口分离原则 23 种设计模式:常用的有工厂、单例、适配器、桥接、组合、代理、命令、观察者、策略、状态模式等等。 ## 4.APP架构设计 包括 MVC、MVP、MVVM、MVI、VIPER、Clean Architecture、Flux。目前除了 MVC 外 MVP 和MVVM 用得比较多,具体的架构设计还要结合业务去考虑。 # 二、软技能 人在职场,行走江湖,想进阶高管光有技术深度是不够的,还需要掌握众多软技能,注意综合职业素养的磨练。有很多人一开始重视程度不足,在职场后半段的上升过程中,容易遇到瓶颈。 下面是我个人总结出的高级程序员必备软技能,供大家参考。 ## 1.快速学习能力 包括技术深度和广度,能够不断探究新技术,不断学习。 ## 2.沟通能力 加强表达、阅读、编写能力,即使在技术发达的今天也绝不会过时。因为任何方式的沟通在企业内部都是非常有必要的。 ## 3.团队协作能力 开发人员很容易陷入孤立的人际交往状态,但开发工作永远都不可能是一个人完成,只有成员真正能融入团队内,顺利与其他同事沟通合作,才能体现出其真正的价值,被列为未来职位晋升候选人的几率也更大。 ## 4.时间管理能力 可以参考时间管理「四象限法则」,有重点地把精力和时间集中用于处理重要但不紧急的工作,这样可以做到未雨绸缪。 ![](http://www.icode9.com/i/li/?n=2&i=images/20210701/1625151694573088.jpg) ## 5.影响力 一方面是业务影响力,另一方面是技术影响力。其中,提高技术影响力的方式包括:多参与技术分享,把积累的知识进行总结和传播;参加技术方案评审,把技术经验分享出去;帮助新同学解决技术问题;在博客、Github、StackOverflow 等平台上对外分享。 ## 6.文档编写能力 **代码注释**。很多程序员很少写注释,或者注释过多,都是不合适的。多参考开源项目的注释规范。 **编写技术设计文档**。包括流程图,类图,功能时序图等等。 此外推荐一本书:**《软技能——代码之外的生存指南》** ![](http://www.icode9.com/i/li/?n=2&i=images/20210701/1625151694358584.jpg) # ### 最后 简历首选内推方式,速度快,效率高啊!然后可以在拉钩,boss,脉脉,大街上看看。简历上写道熟悉什么技术就一定要去熟悉它,不然被问到不会很尴尬!做过什么项目,即使项目体量不大,但也一定要熟悉实现原理!不是你负责的部分,也可以看看同事是怎么实现的,换你来做你会怎么做?做过什么,会什么是广度问题,取决于项目内容。但做过什么,达到怎样一个境界,这是深度问题,和个人学习能力和解决问题的态度有关了。大公司看深度,小公司看广度。大公司面试你会的,小公司面试他们用到的你会不会,也就是岗位匹配度。 选定你想去的几家公司后,先去一些小的公司练练,学习下面试技巧,总结下,也算是熟悉下面试氛围,平时和同事或者产品PK时可以讲得头头是道,思路清晰至极,到了现场真的不一样,怎么描述你所做的一切,这绝对是个学术性问题! 面试过程一定要有礼貌!即使你觉得面试官不尊重你,经常打断你的讲解,或者你觉得他不如你,问的问题缺乏专业水平,你也一定要尊重他,谁叫现在是他选择你,等你拿到offer后就是你选择他了。 金九银十面试季,跳槽季,整理面试题已经成了我多年的习惯!**在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。** 附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。) ![](http://www.icode9.com/i/li/?n=2&i=images/20210701/1625151695897293.jpg) **本文在开源项目:【[GitHub](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md) 】中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…**

标签:Java,##,Kotlin,安卓,编程,技术,面试,路在何方,Android
来源: https://blog.51cto.com/u_15291419/2966463