Android 8.0
Android 9.0
-
利用 Wi-Fi RTT 进行室内定位
-
刘海屏 API 支持
-
多摄像头支持和摄像头更新
-
不允许调用hide api
-
限制明文流量的网络请求 http
Android 10
-
暗黑模式
-
隐私增强(后台能否访问定位)
-
限制程序访问剪贴板
-
应用黑盒
-
权限细分需兼容
-
后台定位单独权限需兼容
-
设备唯一标示符需兼容
-
后台打开Activity 需兼容
-
非 SDK 接口限制 需兼容
2.热修复原理
原理
-
安卓在加载class时会通过双亲委托机制去加载一个类,先让父类去加载,如果找不到再让子类去加载某个类。
-
通过查看ClassLoader源码发现findClass方法是由每个子类自己实现的,比如BootClassLoader或者BaseDexClassLoader。而PathClassLoader是继承自BaseDexClassLoader的,它的findClass也是在BaseDexClassLoader里面实现的。
-
BaseDexClassLoader的findClass里面使用了另一个对象DexPathList去查找对应的class,这是安卓里面特有的实现。在DexPathList对象里面有一个属性dexElements,dexElements是用于存放加载好了的dex数组的,查找class是从这个dexElements数组里面去找的。
…
一句话总结
将修复好的类放在dexElements的最前面,这样在加载类的时候就会被优先加载到而达到修复的目的.
3.MVC,MVP,MVVM
首先需要知道的是为什么要进行技术框架的设计? 肯定是为了低耦合,提高开发效率是吧,所以不要为了设计而设计。
MVC
在Android中View和Controller一般就是被Activity充当了,当逻辑非常多,操作非常复杂时,Activity代码量非常庞大,不易维护。
-
Model : 模型层,业务逻辑+数据存储等
-
View : 用户界面,一般就是xml+Activity
-
Controller : 控制层,一般就是Activity
MVP
我个人角度,现在(2019年10月29日20:02:49)大多是使用这种方式,既不复杂也解耦合了.
-
Model:模型层,业务逻辑+数据存储+网络请求
-
View:视图层,View绘制和用户交互等,一般是Activity
-
Presenter:呈现层,连接V层和M层,完成他们之间的交互
MVVM
为了更加分离M,V层,所以有了MVVM.
-
Model:模型层,业务逻辑+数据存储+网络请求
-
View:视图层,View绘制和用户交互等,一般是Activity
-
ViewModel:其实就是Presenter和View的数据模型的合体.双向绑定,View的变动会反应到ViewModel中,数据的变动也会反应到View上.
4.组件化的好处
-
任意修改都需要编译整个工程,效率低下。
-
解耦,有利于多人团队协作开发
-
功能复用
5.app启动流程
-
Launcher startActivity
-
AMS startActivity
-
Zygote fork进程
-
Activity main()
-
ActivityThread 进程loop循环
-
开启Activity,开始生命周期回调…
6.Activity启动流程
-
Activity startActivityForResult
-
Instrumentation execStartActivity
-
AMS startActivity
-
ApplicationThread scheduleLaunchActivity
-
ActivityThread.H handleMessage -> performLaunchActivity
-
Activity attach
-
Instrumentation callActivityOnCreate
7.app体积优化
-
可以使用lint工具,检测出没有用的文件,同时可以开启资源压缩,自动删除无用的资源。
-
尽量多使用可绘制对象,某些图像不需要静态图像资源,框架可以在运行时动态绘制图像。尽量自己写Drawable,能不用UI切图就不用,占用空间小。
-
重用资源。比如一个三角按钮,点击前三角朝上代表收起的意思,点击后三角朝下,代表展开,一般情况下,我们会用两张图来切换,我们其实完全可以用旋转的形式去改变。
…
8.app启动优化
-
利用提前展示出来的Window,快速展示出来一个节目,给用户快速反馈的体验,障眼法,治标不治本.
-
避免在启动时做密集沉重的初始化(Heavy app initialization)。
-
启动时 避免I/O操作,反序列化,网络操作,布局嵌套等耗时操作
9.app布局优化
-
如果父控件有颜色,也是自己需要的颜色,那么就不必在子控件加背景颜色
-
如果子控件有背景颜色,并且能完全覆盖父控件,那么父控件不用设置背景颜色
-
尽量减少不必要的嵌套
-
能用LinearLayout和FrameLayout,就不要用RelativeLayout,因为RelativeLayout相对比较复杂,测绘也相对耗时.
-
include和merge一起使用,增加复用,减少层级
-
ViewStub按需加载,更加轻便
-
复杂界面选择ConstraintLayout,可有效减少层级
10.app内存优化
-
频繁使用字符串拼接用StringBuilder或者StringBuffer
-
ArrayMap、SparseArray替换HashMap
-
避免内存泄漏
-
集合类泄漏(集合一直引用着被添加进来的元素对象)
-
单例/静态变量造成的内存泄漏(生命周期长的持有了生命周期短的引用)
-
匿名内部类/非静态内部类
-
资源未关闭造成的内存泄漏
-
检测内存泄漏的几个工具:LeakCanary,TraceView,Systrace,Android Lint,Memory Monitor+mat
11.内存泄漏有哪些
-
集合类泄漏(集合一直引用着被添加进来的元素对象)
-
单例/静态变量造成的内存泄漏(生命周期长的持有了生命周期短的引用)
-
匿名内部类/非静态内部类
-
资源未关闭造成的内存泄漏
-
网络,文件等流忘记关闭
-
手动注册广播时,退出时忘记unregisterReceiver()
-
Service执行完成后忘记stopSelf()
-
EventBus等观察者模式的框架忘记手动解除注册
12.app线程优化
线程池 避免存在大量的Thread,重用线程池内部的线程,从而避免了线程的创建和销毁带来的性能开销,同时能有效控制线程池的最大并发数,避免大量线程因互相抢占系统资源而导致阻塞线现象发生。推荐阅读 《Android开发艺术探索》 第11章。
分类
-
FixedThreadPool 数量固定的线程池
-
CachedThreadPool 只有非核心线程,数量不定,空闲线程有超时机制,比较适合执行大量耗时较少的任务
-
ScheduledThreadPool 核心线程数量固定,非核心线程没有限制.主要用于执行定时任务和具有固定中周期的重复任务.
-
SingleThreadPool 只有一个核心线程,确保所有的任务在同一个线程顺序执行,统一外界任务到一个线程中,这使得在这些任务之间不需要处理线程同步 的问题. 优点
-
减少在创建和销毁线程上所花的时间以及系统资源的开销
-
不使用线程池有可能造成系统创建大量的线程而导致消耗完系统内存以及"过度切换" 注意点
13.Android换肤如何实现,原理
重新设置LayoutInflater的Factory2,从而拦截创建View的过程,然后搞成自己的控件,想怎么换肤就怎么换肤.
14.fresco原理,glide原理,两者区别,哪个更省内存
这块暂时不懂,加入todo
15.DialogFragment 黑边
16.Handler原理,Android 消息机制
Handler机制的关键在于对于ThreadLocal原理的理解,线程私有数据,利用ThreadLocal机制将Looper存放到线程内部,perfect !
17.Android 系统架构
应用层,应用框架层,系统运行库层,硬件抽象层和Linux内核层
18.常用布局有哪些
- FrameLayout,LinearLayout,RelativeLayout,ConstraintLayout,CoordinatorLayout等
19.Android数据存储有几种方式
-
SharedPreferences: 小东西,最终是xml文件中,key-value的形式存储的.
-
文件
-
数据库
-
ContentProvider
-
网络
20.View,SurfaceView
-
View是Android中所有控件的基类
-
View适用于主动更新的情况,而SurfaceView则适用于被动更新的情况,比如频繁刷新界面。
-
View在主线程中对页面进行刷新,而SurfaceView则开启一个子线程来对页面进行刷新。
-
View在绘图时没有实现双缓冲机制,SurfaceView在底层机制中就实现了双缓冲机制。
21.jni调用流程
隔壁老李头的系列文章非常棒,地址在这里
22.组件之间相互引用 如何解决
-
调用其他组件的对外提供的方法:之前看到过一种思路,利用"接口+实现"的方式,定义一个ComponentBase 中间层,然后里面有每个组件对外提供方法调用的Interface,每个组件在初始化的时候就把这些Interface给实现了,然后其他组件需要用的时候就从ComponentBase里面取。
-
界面跳转:ARouter
23.自定义View 饼状图,点击事件,画文字
这个大家可以跟着hencoder老师的文章系统学习一下.
24.Android 数字签名
校验用户身份,校验数据的完整性
25.fragment用在哪里,与Activity的区别
-
当Activity需要模块化的时候
-
不同设备上的适配,比如平台和手机
-
Activity相对Fragment而言,非常笨重,一般小界面小模块用Fragment比较合适.或者首页的tab之类的.
26.RxJava原理
观察者模式,链式
27.EventBus原理
不太了解原理,很少使用,好像也是基于观察者模式的一个框架。
28.View绘制原理
主要是分析measure,layout,draw的过程。
29.Retrofit和OkHttp原理,拦截器
-
Retrofit的话,源码写的非常非常棒.主要是通过动态代理+获取方法上面的注解等,然后组装请求网络的参数,最后用OkHttp去请求网络
-
OkHttp的拦截器链设计得非常巧妙,是典型的责任链模式.并最终由最后一个链处理了网络请求,并拿到结果.
30.点击事件传递机制,事件分为哪几种
事件传递大体过程: Activity--> Window-->DecorView --> View树从上往下
,传递过程中谁想拦截就拦截自己处理,MotionEvent是Android中的点击事件。
主要事件类型
-
ACTION_DOWN 手机初次触摸到屏幕事件
-
ACTION_MOVE 手机在屏幕上滑动时触发,会回调多次
-
ACTION_UP 手指离开屏幕时触发
31.anr如何产生,Service触发anr是多长时间(20秒),如何解决anr?如何解决那种莫名其妙的anr?
我觉得anr就是在主线程做了耗时操作,比如io、读写文件、数据库操作等等。 anr发生之后一般会有日志,在/data/anr/traces.txt里面。
2.32 Dialog和Activity是同一个Window?
不是同一个。
-
Activity的attach方法,这里是为Activity实例化了一个PhoneWindow实例
-
Dialog的构造方法里面也是实例化了一个PhoneWindow实例
33.Window,Activity,Dectorview之间的关系
Activity里面实例化了一个Window,Window里面有一个DecorView(根布局)。
34.ConstraintLayout和RelativeLayout在绘制方面有何差别?
todo
35.onClick事件和onTouchListener在哪里回调?
如果一个View需要处理事件,它设置了OnTouchListener,那么OnTouchListener的onTouch方法会被回调。如果onTouch返回false,则onTouchEvent会被调用,反之不会。在onTouchEvent方法中,事件为Action,UP的时候会回调OnClickListener的onClick方法,可见OnClickListener的优先级很低。
36.应用如何保活?
这个确实不怎么了解,主要是不建议保活,提升用户体验,特别是安卓高版本,谷歌是封杀得很严格的,不建议保活。
37.LinearLayout是如何测量(measure)的?如果有weight又是如何测量的?
先做一次测量,做完之后有空间剩余,有weight的View再测量一下,分一下剩余的空间。
38.屏幕适配
先前有鸿神的AndroidAutoLayout,根据宽高进行控件缩放,非常经典,很多项目可能都还在使用,但是已经停止更新了。然后就是有名的今日头条方案,出来还是有点时间了。原理其实就是更改density。
屏幕的宽度=设计稿宽度 * density
然后有AndroidAutoSize库,将今日头条方案融合进去还完善了很多问题,易用,完美。
3. 其他
======
1. Java四种引用
-
强引用,默认就是,宁愿OOM,也不回收
-
弱引用,内存不够会被回收
-
软引用,GC时会被回收
-
虚引用,它的作用在于跟踪垃圾回收过程,在对象被收集器回收时收到一个系统通知。
2.项目中遇到的最困难的事情是什么?如何解决的?
每个人遇到的情况不同,这个提前思考一下自己做过的项目最有挑战的地方。
3.Git基本操作
4.Kotlin优势
-
完全兼容java
-
空安全
-
支持lambda表达式
-
支持扩展函数
-
更少的代码量,更快的开发速度
缺点就是有时候代码阅读性可能会降低。
5.Kotlin 协程是什么?
就是一个线程框架,提供了一套操作线程的api.
6.二叉树,广度优先遍历,深度优先遍历
推荐小灰的漫画算法
7.tcp,http,https,socket
8.敏捷开发
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
最后
这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
相信它会给大家带来很多收获:
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
- 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!
- 我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。
当我们在抱怨环境,抱怨怀才不遇的时候,没有别的原因,一定是你做的还不够好!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
,可以扫码获取!!(备注:Android)**
最后
这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
相信它会给大家带来很多收获:
[外链图片转存中…(img-uFbNHvjm-1713434089529)]
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
- 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!
- 我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。
当我们在抱怨环境,抱怨怀才不遇的时候,没有别的原因,一定是你做的还不够好!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!