近况
23年12月,公司越来越不行了,并且伴随着恶心的操作(主要是不想要赔偿),于是选择了主动离职,并且由于快年末了,于是去旅游了一番(去了长沙、张家界、武汉、南京),后面就回家过年去了,现在也是要开始找工作了,发个帖记录下面试所需要的东西,首先我上家公司不是说做大型APP纯客户端的那种,是跟硬件会打交道的,所以,我的下份目标也是想找到会跟硬件打交道的工作,如果你想说是找纯APP客户端的那种公司,以下的面试资料可能不会太适用
面试准备
Java基础知识
包含Java基础、集合、并发、IO、JVM、计算机网络、Linux、Shell、数据结构等
Http系列(三) Http/Tcp三次握手和四次挥手 - 掘金 (juejin.cn)
Kotlin基础知识
谱写Kotlin面试指南三部曲-基础篇 - 掘金 (juejin.cn)
Android基础知识
Android学习指南 — Android基础知识汇总 - 掘金 (juejin.cn)
自定义View
【Android】自定义 View 系列- 绘制流程 - 掘金 (juejin.cn)
【面试官爸爸】来给我讲讲View绘制? - 掘金 (juejin.cn)
Android 自定义View之Draw过程(上) - 掘金 (juejin.cn)
Android 自定义View之Draw过程(中) - 掘金 (juejin.cn)
Android 自定义View之Draw过程(下) - 掘金 (juejin.cn)
Android触摸事件分发
【面试官爸爸】唠唠Android事件分发? - 掘金 (juejin.cn)
Android核心面试
【建议收藏】106道Android核心面试题及答案汇总(总结最全面的面试题) - 掘金 (juejin.cn)
Android性能优化
app启动优化
针对的是冷启动优化
- Application里面的onCreate初始化进行通用组件的初始化,将一些初始化操作进行延迟加载(即真正用到的时候再进行初始化操作)
- Activity中的onCreate布局嵌套过深,或者在onCreate里面做太多的初始化操作,解决办法是优化布局、减少onCreate里面的工作量
- 第三方依赖由于需要在应用启动的时候就进行初始化操作,于是会通过provider去进行初始化,拖慢应用启动速度,使用startUp库将初始化放到子线程去执行
- 主题切换,设置成我们自己的启动页
探索App性能优化之启动速度优化 - 掘金 (juejin.cn)
app内存优化
通常可以分为3种:内存抖动、内存泄露、内存溢出
意义:降低Crash,减少ANR和卡顿(发生CG时,所有线程都要停止)
- 内存抖动
短时间内有大量的对象被创建或者被回收的现象,主要体现在循环中大量创建、回收对象,内存不足,不断CG内存的时候也会
预防:
- 尽量避免在循环体内创建对象
- 避免在自定义View的onDraw()创建对象
- 能复用的对象,考虑使用对象池把他们缓存起来
例子:常见的是自定义View的时候,在onDraw方法里面创建对象
- 内存泄露
当一个对象不存在了,本应该被垃圾回收器回收,但是由于这个对象被其他正在使用的对象所持有,造成无法回收的现象
例子:Handle的使用,Context的使用(最好是使用Application的Context)
检测方法:
Android内存泄露检测之LeakCanary的使用(转) - 掘金 (juejin.cn)
Android Profiler (二)应用之分析内存泄露 - 掘金 (juejin.cn)
解决方案:
- 避免 Static 成员变量引用资源耗费过多的实例(如Context)
- 单例造成的内存泄露,比如一个单例创建的时候需要传入一个Context,这个Context的生命周期的长短就很重要
- 非静态内部类创建实例造成内存泄露,解决办法是将非静态内部类改为静态内部类(静态内部类默认不持有外部类的引用),或者是内部类抽取出来封装成一个单例
- Handler造成的内存泄漏
mHandler是Handler的非静态匿名内部类的实例,所以它持有外部类Activity的引用,消息队列MessageQueue在一个Looper线程中不断轮询处理消息,那么当这个Activity退出时,消息队列中还有未处理的消息Message或者正在处理消息,而消息队列中的Message持有mHandler实例的引用,mHandler又持有Activity的引用,所以导致该Activity的内存资源无法及时回收,引发内存泄漏。
解决办法:
创建一个静态Handler内部类,然后对Handler持有的对象使用弱引用,这样在回收时也可以回收Handler持有的对象
Looper线程的消息队列中还是可能会有待处理的消息,所以在Activity的Destroy时或者Stop时应该移除消息队列中的消息。
- 对于资源的使用(如 广播BraodcastReceiver、文件流File、数据库游标Cursor、图片资源Bitmap等),若在Activity销毁时无及时关闭或者注销这些资源,则这些资源将不会被回收,从而造成内存泄漏。
- 内存溢出
Android系统给每个应用分配的内存有一个阈值,当应用占用的内存加上申请的内存资源超过了系统分配的最大内存时就会抛出Out Of Memory异常
例子: 白板加载大图的时候通常会内存溢出
app体积优化
第一步:AS自带的Analyze APK进行分析,查看资源占用
- 图片资源过大,图片考虑使用svg,或者删掉不必要的分辨率的图片,图片压缩再或者图片使用网络加载的方式
- so库体积占用过大,比如apk一般不会装在x86的机器上,可以考虑去掉
- 开启混淆,检测未使用的类、方法、字段、冗余代码
- Android Studio自带的 Lint 检测工具无效代码
- resConfig中配置保留哪些资源,减少不必要的资源
一、Android APK 包体积优化 - 掘金 (juejin.cn)
Android逆向
- apk的反编译与回编译,工具使用的是apkTool
- 查看源代码,使用的是jadx
- apk的脱壳知识:
Android 逆向之脱壳实战篇 - 掘金 (juejin.cn)
Android 逆向入门保姆级教程 - 掘金 (juejin.cn)
Android Framework
Android Binder 原理换个姿势就顿悟了(图文版) - 掘金 (juejin.cn)
Android 系统启动到App 界面完全展示终于明白(图文版) - 掘金 (juejin.cn)
每日一题:Zygote 为什么不采用Binder机制进行IPC通信呢? - 掘金 (juejin.cn)
【面试官爸爸】继续给我讲讲Handler? - 掘金 (juejin.cn)
Android 输入事件一撸到底之源头活水(1) - 掘金 (juejin.cn)
Framework源码面试——Android屏幕刷新机制 - 掘金 (juejin.cn)
深入理解Android Framework(七)- Framework重要服务之ActivityManagerService(一) AMS启动流程 - 掘金 (juejin.cn)
【从头到脚】并发编程(二)面试官问我Linux的网络IO模式怎么办? - 掘金 (juejin.cn)
Android IPC 之AIDL应用(上) - 掘金 (juejin.cn)
- 在 Android 开发中如何使用 Binder 来实现跨进程通信
以下是使用 Binder 实现跨进程通信的一般步骤:
1.创建一个 AIDL(Android Interface Definition Language)接口文件,定义需要跨进程调用的接口方法。
2.实现 AIDL 接口定义的接口方法的具体逻辑。
3.在服务端创建一个 Service,该 Service 实现了 AIDL 接口中定义的方法。
4.在客户端绑定到服务端的 Service,并通过 Binder 调用服务端的方法。
- 在什么情况下会选择使用 Binder 这种机制
1.跨应用程序通信:当需要不同应用程序之间进行通信时,可以使用 Binder 实现跨应用程序通信。
2.进程隔离:使用 Binder 可以实现进程间隔离,确保各个进程之间的数据安全性和稳定性。
3.需要高效的通信机制:Binder 是 Android 系统提供的高效 IPC 机制,适合需要频繁通信的场景。
socket知识
JNI
一文带你实战Android JNI编程 - 掘金 (juejin.cn)
一篇文章教你完全掌握jni技术 - 掘金 (juejin.cn)
Android Studio NDK JNI 编程最小白最简单入门Demo - 掘金 (juejin.cn)
SDK相关的知识
从零开始的Android SDK开发 - 掘金 (juejin.cn)
Mqtt
MQTT 协议入门:基础知识和快速教程 - 掘金 (juejin.cn)