美文网首页
92年的程序员终究没能逃脱掉"全员降薪",整理Android面试

92年的程序员终究没能逃脱掉"全员降薪",整理Android面试

作者: 苏苏说zz | 来源:发表于2024-08-25 15:23 被阅读0次

92年的程序员终究没能逃脱掉"全员降薪",临近35岁,职业生涯比较担忧,是转行呢还是继续干个两三年再说呢???
目前没有前行的方向。。。
如果你也是"被裁员"或"全员降薪"比较多的话 。。。
可以讨论下前行的方向 。。。
先整理刷一些题目记录下来吧。。。

一.如何优化 Android应用的功耗?

优化Android应用的功耗可以从几个方向入手
1.尽量减少后台服务和优化后台服务,减少不必要的后台服务
后台服务对电量消耗比较大,尤其是在设备休眠的状态下。如果必须要使用后台服务,尽量使用JobScheduler或WorkManager来管理后台任务,另外还可以使用JobIntentServiced组件减少功耗
2.减少网络请求的频率和次数,合并小的网络请求
网络操作非常耗电,尤其是在弱网络的情况下,尽量批量的发起网络请求,减少网络的连接次数,这样合并处理可以减少电量的消耗,同时okhttp也是采用HTTP/2协议,再次优化网络性能,网络请求的缓存机制设计得当,可以减少重复请求
3.优化电量消耗高的组件:减少GPS,WIFI,蓝牙等高功耗硬件
当用户不需要定位是,务必关闭定位服务,可以使用Location API来优化定位请求,如使用FusedLocationProviderClient代替传统的位置管理器
4.避免主线程做太多的耗时操作,将耗时操作放在线程池中
主线程应负责UI渲染工作,应避免任何费时操作,可以考虑RxJava做耗时操作

二.Android中 Dalvik 虚拟机 和 ART 虚拟机是什么?两者有什么区别?

他们都是Android系统的运行环境
1.Dalvik 虚拟机 是Android 4.4以前的运行时环境, ART 虚拟机是Android 5.0开始推出的新的运行模式
2.Dalvik 虚拟机 基于JIT编译模式,只有运行时才会编译所需代码 ,每次启动时需要重新编译代码,所以启动速度相对比较慢,ART 虚拟机是AOT的编译模式,应用在安装时,将全部的字节码编译成机器码,启动速度快,减少了内存的使用

三.如何避免Android的内存泄漏

1.使用Application context代替activity context,因为activity context的生命周期与activity绑定,使得大量资源无法及时回收而引起的内存泄漏问题
2.避免持用生命周期长于组件本身的对象引用而造成的内存泄漏,在有可能长时间持用对象引用但又不希望垃圾回收时,可以使用弱引用和软引用来减少内存泄漏的风险
3.使用生命周期的感知组件如LiveData和ViewModel,他们可以在适当的情况下清理资源减少泄漏风险
4.避免非静态内部类持用外部类的引用,可以将内部类声明静态或者将外部类的弱引用来解决
5.Java垃圾回收机制只会回收没有被引用的对象,如果对象占用大量的内存却仍被引用,及时没有用也不会回收这些对象,这就是内存泄漏
6.在activity中的onDestory方法中及时清理被引用的对象,如 bitmap cursor 相机等
7.启用后台线程或异步任务时,如果没有正确处理生命周期管理,将会导致内存泄漏,可以使用handle或ThreadPoolExecutor等来处理这些问题,并结合声明周期进行管理
8.可以使用android studio自带的Memory Profiler或三方开源的LeakCanary检测内存泄漏问题,

四.什么是Hook?怎么使用?有什么风险?

1.Hook是一种技术手段,在运行时可以修改代码的行为,在不修改原始源码的情况下,拦截并替代方法的调用,修改返回结果等
2.常见的Hook就是 Xposed 框架, 如何使用Xposed 框架

  • 安装 Xposed 框架,需要有root权限的设备
  • 创建一个android工程,并在其编写hook代码,通常使用IXposedHookLoadPackage 接口来加载特性的应用或系统的类和方法
  • 将编写的模块打包apk,安装并在Xposed Installer激活
  • 重启设备激活hook模块,生效后就可以看到hook的运行效果

3.Hook技术非常强大,但也存在一定的风险
安全风险:不当的使用会导致敏感信息泄漏,产生安全漏洞风险
兼容性风险:导致应用或系统不稳定,甚至崩溃
法律风险:修改他人应用或系统有可能违反相关使用条款和服务协议

Hook扩展

除了Xposed框架,还有Frida跨平台工具,不仅支持android,还支持ios和windows等
也可以使用反射机制替代Hook的方案,虽然反射可以动态调用方法,但没有修改方法的实现能力

五.在 Android 中什么是 ANR?如何避免?

ANR 是应用在一段时间没有响应用户输入,会弹出应用无响应的提示框
怎么避免 ANR :
1.避免在主线程做耗时操作,将一些耗时操作放入异步中使用
2.Handler和Looper机制:了解 Handler 和 Looper 的机制是避免 ANR 的关键。主线程管理 UI 更新,合理使用 Handler 可以将耗时任务放到子线程执行,然后通过 Handler 将结果传回主线程更新 Ul。Looper 是消息循环,主线程通过它来持续处理消息队列中的消息。
3.ANR日志分析:每当应用发生 ANR 时,系统会生成一个 trace 文件。这个文件记录了与 ANR 相关的线程堆栈信息,可以帮助找到导致 ANR 的根本原因,从而进行针对性的优化。在 Android Studio 中调试时,也可以查看 Logcat 中的相关信息。
4.使用线程池管理线程,有效避免过多线程创建而导致性能问题
5.UI布局优化:复杂布局可能导致U绘制时间过长。优化 XML 布局文件,减少嵌套,使用 ConstraintLayout 之类的高效布局组件,可以减少布局绘制时间,提高 UI 响应速度

六.如何优化Android应用的启动速度

1.减少Application类中的执行量.非必要可以拖延在应用启动之后初始化
2.使用异步初始化:对于不需要在主线程上执行的初始化任务,使用线程异步
3.优化和管理你的启动 Activity 中的布局,减少布局的复杂性来提高启动速度
4.使用启动优化工具Android Profiler、Systrace 等工具找出并优化启动瓶颈
5.优化资源加载:提前加载静态资源,减少非必要资源的加载时间。

扩展

1.延迟初始化:一些服务组件可以延迟到真正需要的时候初始化,不是在启动的时候初始化
2.多进程优化:可以将一些操作放在一个单独的进程中,这样即便比较耗时也不影响主进程的启动速度,如service可以在单独的进程中运行
3.优化布局:使用约束布局代替过多的线性布局和相对布局,减少绘制速度,尽量减少和优化view的数量,减少ui布局的复杂性
4.减少应用的体积:使用ProGuard 或 R8 工具优化代码结构,删除无用的代码和资源,减少apk的体积,有助于减少启动时间
5.使用Android Profiler分析工具,检测cpu的使用率,内存占用等找到需要优化的地方

七.如何优化Android布局

1.减少嵌套层级:使用ConstraintLayout 代替RelativeLayout和LinearLayout ,减少 View 的嵌套层级,有助于提高布局的绘制速度,
2.ViewStub 和 include 标签:通过 include 标签复用布局,使用 Viewstub 延迟加载不频繁出现的 U 元素,提升应用初始加载速度。
3.RecyclerView:对于大数据列表,尽量使用 RecyclerView 代替 Listview 或Gridview,避免常见的性能问题。
4.对布局进行 Profile:开发工具 Android Profiler 提供了性能监视和分析的功能,可以使用 Layout Inspector 检查布局层级,找出冗余或低效的部分。

八.如何避免webview内存泄漏

1.在activity或fragment的onDestroy方法中调用webview.destroy()释放webview资源
2.调用webview.destroy()前现在父容器移除webview,调用removeView(webview)
3.使用全局的applicationcontext作为上下文,减少与activity生命周期的耦合
4.activity避免使用匿名内部类和非静态内部类的引用,减少内存泄漏

九.在Android中实现生产者-消费者模式?

可以使用java的BlockingQueue类,BlockingQueue是一个线程安全的队列,他的put和take方法分别用于生产者和消费者

实现的步骤

1.定义一个BlockingQueue类
2.创建生产者线程,将数据放入队列中
3.创建消费者线程,从队列中取出数据并处理、

扩展

1.BlockingQueue不同实现:

  • ArrayBlockingQueue:这是一个有界队列,内部实现是一个数组
  • LinkedBlockingQueue:可选界限的队列,内部实现是一个链表
  • PriorityBlockingQueue:优先级排序的无界队列

2.线程池
可以使用ExecutorService来更高效地管理创建和销毁线程,

3.线程管理
可以使用HandlerThread管理后台线程,是专门处理后台任务的线程,可以结合Handler和Looper处理任务后并在主线程更新UI

4.Synchronization
BlockingQueue尽量内部处理了同步问题,但是更复杂的情况下我们需要自己来处理同步问题,可以使用Synchronization

十.Handler的工作原理及使用场景

Handler机制是Android中实现线程间通信的框架,
message:消息对象,需要传递数据
Handler:处理消息的工具类,负责将消息放入MessageQueued队列中,
MessageQueue:消息队列,handler负责将放在其中,Looper从中取出消息信息,然后分发
Looper:Looper从消息队列中取出消息信息,然后分发,每个线程只有一个并且只有一个

使用长场景

1.子线程做耗时操作在通过Handler更新UI,
2.通过handler实现延迟操作或周期性任务
3.线程间的通信

刷题更新中。。。

相关文章

网友评论

      本文标题:92年的程序员终究没能逃脱掉"全员降薪",整理Android面试

      本文链接:https://www.haomeiwen.com/subject/wofwkjtx.html