面试知识点汇总
2017-10-09 15:16:38 0 举报
AI智能生成
Android面试知识点郑磊
作者其他创作
大纲/内容
java
java内存模型
多线程
ThreadLocal
线程的五种状态
初始化状态:新创建了一个线程对象
可运行状态:线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权
运行状态:可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码
阻塞状态:阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,暂时停止运行
死亡状态:线程run()、main() 方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期
volatile
final
Synchronized
作用在类和对象上的不同
Lock,Condition
FutureTask
join(long)后面的代码可能先运行
join的实现原理是用先获取lock,然后wait
线程池(原理:如何实现复用线程)
CachedThreadPoll
FixedThreadPool
ScheduledThreadPool
SingleThreadPool
生产者与消费者
一个生产者与多个消费者
避免饥饿问题
避免因为if条件没处理好,多个消费者多次处理了(使用while判断条件是否成立)
一个生产者与一个消费者
多生产者与一个消费者
注意notifyAll,若是只用notify可能会出现假死(生产者生产完了,又唤醒了另外一个生产者,而没唤醒消费者)
多生产者与多消费者
java四种引用
强引用
软应用
弱引用
虚引用
零碎知识点
数据结构
hashmap、hashtable、concurrenthashmap
hashset
内部有hashmap
String、StringBuilder、StringBuffer
ArrayList和LinkedList
sleep、wait
sleep
没有释放锁
可以在任何地方使用
wait
释放了锁
只能在同步代码段里使用
字节流字符流
字节流
最基本单位为单个字节,它通常用来处理二进制数据
InputStream、OutputStream
不使用缓冲区
字符流
字符流处理的最基本的单元是Unicode码元(大小2字节),它通常用来处理文本数据
Reader、Writer
使用缓冲区
序列化
泛型
泛型擦除
异常
接口和抽象类的区别
jvm
dvm和jvm的区别
dvm基于寄存器,jvm基于栈
jvm运行class文件,dvm运行dex文件(由class压缩而成为一个dex文件)
jvm只有一个,而每启动一个dvm就会生成一个linux对应的进程,相互独立
art和dvm区别
art在apk安装时就翻译成本地机器码
dvm解释字节码成机器码并执行
垃圾回收算法
垃圾回收器
网络
socket(TCP连接过程)
tcp粘包
http、https、http2
android
内存泄漏
非静态内部类的生命周期(Handler)
包括异步回调
单例模式
Thread
static
unregister、没close等
bitmap
性能优化
UI
检测工具
PC
Hierarchy viewer(查看Measure、layout、draw三个过程中的性能)
Systrace
Android Studio
lint
手机
调试GPU过渡绘制(开发者选项)
Profile GPU Rendering
措施
布局
include
merge
ViewStub
View.gone和View.invisible区别
自定义view
canvas.clipRect()识别可见区域
onDraw中避免new对象
没有重叠层可以重写
hasOverlappingRendering,返回false
硬件加速
降低刷新频率:尽量少调用invalidate
图片
点9图片
reuse Bitmap
inBitmap
adapter缓存
快速滑动的时候不加载图片
内存优化
相关概念
进程优先级
前台
用户当前操作所必需的进程
正在交互的Activity
service绑定到正在交互的Activity
设置为前台的Service:必须绑定到Notification
正在执行生命周期的Service
正在接受消息的Broadcast Receiver
可见
没有任何前台组件、但仍会影响用户在屏幕上所见内容的进程
Activity作为对话框(对话框的theme)启动,前一个activity只执行了onPause,没执行onStop
bind到前台或者可见的Activity
服务
通过普通的startService
内存不足以维持前台和可见,就会被销毁
后台
不可见的Activity(调用了onStop)
空
不含任何组件
优化措施
避免内存泄漏
优化数据结构
用SparseArray、ArrayMap代替HashMap
1、都用二分法查找、添加
2、SparseArray的key只能是int,ArrayMap不需要
3、用空间换时间,都只适合在数据量不大(千以内)的时候使用
2、SparseArray的key只能是int,ArrayMap不需要
3、用空间换时间,都只适合在数据量不大(千以内)的时候使用
防止内存抖动
循环中不要new对象(包括onDraw)
循环中用StringBuilder代替String+
减小或者复用资源
图片压缩、换压缩率更好的图片格式,显示的时候不要用RGBA8888,可以用565之类的代替
adapter复用
bitmap的inBitmap复用
在内存低的时候
onLowMemory
在系统内存不足,所有后台程序(优先级为background的进程,不是指后台运行的进程)都被杀死时,系统会调用
onTrimMemory
能监听UI全部隐藏等事件
apk体积优化
代码优化
proguard
minifyEnabled = true
去掉不用的x86、arm等架构代码支持
精简第三方库或者用更小的库
资源优化
图片处理
.9图片
压缩png或者换用jpg、webp等更优化的格式
尽量用drawable或者代码画简单的图片
VectorDrawable
proguard
shrinkResources
去掉不需要的语言等资源
用第三方工具(AndResGuard)混淆压缩(png和resources.arsc默认没有压缩))
混淆资源减少了resources.arsc的体积
用7z压缩减小了整个apk的体积
检测工具
lint
启动优化
检测工具
display time
从Android KitKat版本开始,Logcat中会输出从程序启动到某个Activity显示到画面上所花费的时间
ActivityManager Displayed
ActivityManager Displayed
reportFullyDrawn
Method Tracing
Systrace
加载
懒加载
异步加载
UI
网络优化
正常状态下
减少网络请求频次
打包网络请求,不要频繁请求小数据量,可以分析预加载一些
在充电或者wifi情况下,预加载
减少网络请求数据量
压缩传输数据
gzip压缩
考虑使用Protocol Buffer代替JSON
请求图片时告知服务器所需要的大小、格式、质量,以便服务器压缩
不同设备和不同网络情况下返回不同尺寸的图片
不同设备和不同网络情况下返回不同尺寸的图片
利用缓存
okhttp
弱网状态下
不自动加载图片,只显示文字
界面先反馈,请求延迟
正常状态
其他优化
JobScheduler
Doze模式
基础知识
四大组件+Fragment(生命周期)
Activity
启动模式
Standard
SingleTop
SingleTask
SingleInstance
约束布局
广播的类型
普通广播
系统广播
有序广播
本地广播
粘性广播
Fragment默认构造函数
尽量不要用构造参数传值,用setArgument传递bundle(Fragment在内存不够用被杀掉后还原,反射调用默认的构造参数)
旋转屏幕
生命周期
数据保存
Intent
隐式
显式
进程通信
AIDL(Binder)
支持的传输的数据类型
基本数据类型
String和CharSequence
List
Map
Parcelable
AIDL接口
Messager
ContentProvider
Bundle(通过startActivity隐式intent等)
共享文件
Socket
事件分发机制与滑动冲突
View
自定义view
SurfaceView
widget
remoteview
SurfaceView
View的刷新机制
而当子View需要刷新时,则是通知父View来完成,自底向上回溯的过程,每一层的父View都将自己的显示区域与传入的刷新Rect做交集,一直到viewroot,由ViewRoot对这个最终的刷新区域做刷新
继续深入
invalidate和postinvalidate
invalidate在UI线程调用
postInvalidate在非UI线程调用,内部是用handler实现的
Handler、Looper、Message
创建线程的方法
Thread
HandlerThread
IntentService
Parcelable
设计模式
六大原则
开闭原则
单一职责
里氏替换
依赖倒置
接口隔离
不应该依赖它不需要的接口,最小接口
迪米特原则
一个对象应该对其他对象有最少的了解
综合模式
MVP
MVVM
data binding
常用框架
网络相关
Okhttp
retrofit
UI相关
ImageLoader、Glide等
事件传递
rxjava
EventBus
orm
greendao
内存泄漏
leakcanary
崩溃检测
bugly
架构相关
data binding
dagger
测试框架
单元测试
热更新与插件化
gradle
逆向与反编译
零散原理
apk安装过程
apk结构
(1) classes.dex:classes.dex是java源码编译后生成的java字节码文件.
(2) resources.arsc:编译后的二进制资源映射表文件.
(3) AndroidManifest.xml:它描述了应用的名字、版本、权限、引用的库文件等等信息.
(4) assets:assets目录可以存放一些配置文件及本地资源、图片资源等.
(5) lib:存放的是一些jar, so文件.
(6) META-INF:META-INF目整性和系统的安全。
(7) res:resid 资源id的映射表。
(2) resources.arsc:编译后的二进制资源映射表文件.
(3) AndroidManifest.xml:它描述了应用的名字、版本、权限、引用的库文件等等信息.
(4) assets:assets目录可以存放一些配置文件及本地资源、图片资源等.
(5) lib:存放的是一些jar, so文件.
(6) META-INF:META-INF目整性和系统的安全。
(7) res:resid 资源id的映射表。
apk打包过程
(1). 使用aapt工具将资源文件生成R.java文件, resources.arsc和打包资源文件.
(2). 使用aidl工具将.aidl文件编译成.java文件.
(3). 使用javac工具将.java文件编译成.class文件.
(4). 使用dx脚本将众多.class文件转换成一个.dex文件.
(5). 使用apkbuilder脚本将资源文件和.dex文件生成未签名的apk安装文件.
(6). 使用jdk中的jarsigner对apk安装文件进行签名.
(2). 使用aidl工具将.aidl文件编译成.java文件.
(3). 使用javac工具将.java文件编译成.class文件.
(4). 使用dx脚本将众多.class文件转换成一个.dex文件.
(5). 使用apkbuilder脚本将资源文件和.dex文件生成未签名的apk安装文件.
(6). 使用jdk中的jarsigner对apk安装文件进行签名.
Activity启动过程,两个activity(A和B),A启动B时两个生命周期的顺序
Android整体框架
webview(阿里等)
算法与数据结构
算法
五大常用算法
分治
动态规划
贪心
回溯
分支限界
0 条评论
下一页