Android面试记录(2023.3.21)

189 阅读12分钟

3.18面试总结

问:如何利用自定义拦截器,刷新token

www.shuzhiduo.com/A/kjdwbnDr5…

问:Okhttp的责任链模型

www.dianjilingqu.com/350943.html

blog.csdn.net/qq_48435252…

问:下载进度监听,官方示例

github.com/square/okht…

问:kotlin foreach怎么跳出循环

blog.csdn.net/Nicholas1hz…

问:A页面跳转到B页面发生的生命周期

A页面跳转到B页面发生的生命周期

2023-03-21 14:40:17.264 14112-14112/com.example.shadowhosttest E/TEST: A onPause

2023-03-21 14:40:17.313 14112-14112/com.example.shadowhosttest E/TEST: B onCreate

2023-03-21 14:40:17.316 14112-14112/com.example.shadowhosttest E/TEST: B onStart

2023-03-21 14:40:17.318 14112-14112/com.example.shadowhosttest E/TEST: B onResume

2023-03-21 14:40:17.940 14112-14112/com.example.shadowhosttest E/TEST: A onStop

引申问题:

B再返回A发生了什么

2023-03-21 14:41:25.864 14112-14112/com.example.shadowhosttest E/TEST: A onReCreate

2023-03-21 14:41:25.864 14112-14112/com.example.shadowhosttest E/TEST: A onStart

2023-03-21 14:41:25.867 14112-14112/com.example.shadowhosttest E/TEST: A onResume

2023-03-21 14:41:26.461 14112-14112/com.example.shadowhosttest E/TEST: B onStop

2023-03-21 14:41:26.463 14112-14112/com.example.shadowhosttest E/TEST: B onDestroy

activity跳转对应生命周期变化不受activity启动模式 lanuchMode影响(应该是说的第一次)。

页面旋转会发生什么呢。

2023-03-21 15:10:06.651 16560-16560/com.example.shadowhosttest E/TEST: A onPause

2023-03-21 15:10:06.654 16560-16560/com.example.shadowhosttest E/TEST: A onStop

2023-03-21 15:10:06.660 16560-16560/com.example.shadowhosttest E/TEST: A onDestroy

2023-03-21 15:10:06.867 16560-16560/com.example.shadowhosttest E/TEST: A onCreate

2023-03-21 15:10:06.871 16560-16560/com.example.shadowhosttest E/TEST: A onStart

2023-03-21 15:10:06.872 16560-16560/com.example.shadowhosttest E/TEST: A onRestoreInstanceState

2023-03-21 15:10:06.875 16560-16560/com.example.shadowhosttest E/TEST: A onResume

onSaveInstanceState是什么时候调用的,(注意他有个一两个参数的重载方法)

系统配置发生改变,按home键,锁屏,onPause或者onStop的时候。

————————————

问:Anr问题怎么解决

(chatgpt的答案)

ANR(Application Not Responding)是指在Android应用程序中,当主线程被阻塞时,用户界面无法响应用户操作而发生的异常。通常是由于耗时的操作(如网络请求、数据库操作、耗时计算等)占用了主线程而引起的。为了避免ANR异常,开发者需要将这些操作放在后台线程中执行。

如果出现了ANR异常,可以采取以下措施:

  1. 分析ANR日志:在Android设备的/data/anr/目录下,会存放ANR异常的日志文件。通过分析日志文件,可以确定ANR异常的原因,例如哪个线程阻塞了主线程等。

  2. 优化代码:根据分析结果,进行代码优化。例如,将耗时的操作放在后台线程中执行,或者采用异步执行的方式。

  3. 延迟操作:如果某些操作不能放在后台线程中执行,可以考虑在用户不活跃时执行。例如,可以在屏幕关闭后进行后台同步等操作。

  4. 减少占用资源:尽量避免占用太多的CPU、内存等资源,特别是在主线程中执行。可以通过优化算法、减少对象的创建等方式来减少占用资源。

  5. 使用第三方库:使用一些优秀的第三方库,例如RxJava、Coroutine等,可以简化代码的编写,并且可以避免一些常见的错误,例如线程阻塞等。

总之,要避免ANR异常,就需要保证应用程序在主线程中不阻塞,可以采取上述措施来进行优化和调整。

  1. 使用工具进行分析:Android提供了一些工具,如systrace和traceview,可以帮助开发人员识别和解决ANR问题。

  2. 安装性能监控工具:安装性能监控工具,如Bugly、腾讯移动分析、Firebase等,可以实时监测应用程序的性能,及时发现ANR问题并进行解决



如何使用工具定位ANR问题,请给我一个具体案例

使用工具定位ANR问题的过程可以大致分为以下几步:

  1. 获取ANR日志:在应用程序发生ANR时,Android系统会生成ANR日志文件,该文件记录了ANR的详细信息。可以通过adb命令获取ANR日志,例如:adb pull /data/anr/traces.txt。

  2. 分析ANR日志:使用分析工具(例如Systrace)分析ANR日志,可以找到导致ANR的线程和方法。

  3. 优化代码:根据分析结果,进行代码优化,例如将耗时操作放在后台线程中执行,优化数据库操作等。

下面以一个具体案例来说明如何使用Systrace工具定位ANR问题:

假设我们的应用程序在加载大量数据时出现了ANR。我们可以通过以下步骤来使用Systrace工具定位ANR问题:

  1. 启用Systrace工具:在开发计算机上启动Systrace工具,通过以下命令打开Systrace工具:

python systrace.py -t 10 -o mytrace.html sched freq idle am wm gfx view binder_driver hal

其中,-t指定Systrace工具的采样时间,-o指定输出文件的名称,后面的参数指定要监控的系统进程。

  1. 触发ANR:在模拟器或设备上打开应用程序,并在加载大量数据时故意触发ANR。

  2. 分析Systrace报告:在Systrace工具中,单击“stop”按钮停止采样,并在浏览器中打开输出文件。在输出文件中,找到时间轴上出现ANR的时间点,并查看相应的事件流程。通过查看事件流程,我们可以找到导致ANR的线程和方法。

  3. 优化代码:根据分析结果,进行代码优化。例如,可以将数据加载操作放在后台线程中执行,并使用适当的数据分页策略来提高性能。

以上是使用Systrace工具定位ANR问题的一般步骤,具体方法可能会因不同的情况而有所不同。

请给我一个详细步骤

好的,下面我将给您一个详细步骤,以帮助您使用Systrace工具定位ANR问题。

前提条件:

  1. 安装Android SDK和Python。
  2. 拥有一个设备或模拟器来运行应用程序。

步骤如下:

  1. 打开终端或命令提示符,进入Android SDK目录下的platform-tools文件夹。

  2. 使用以下命令启动Systrace工具:

lua

Copy code

python systrace.py --time=10 -o mytrace.html sched freq idle am wm gfx view binder_driver hal 

其中,--time指定Systrace工具的采样时间,这里设置为10秒;-o指定输出文件的名称,这里设置为mytrace.html;后面的参数指定要监控的系统进程。

  1. 在终端或命令提示符中,按Ctrl+C停止Systrace工具。

  2. 打开输出文件mytrace.html。可以使用以下命令在终端或命令提示符中打开该文件:

open mytrace.html 

  1. 在浏览器中查看Systrace报告。在浏览器中打开mytrace.html文件,可以看到Systrace报告。在报告中,可以找到时间轴上出现ANR的时间点,并查看相应的事件流程。通过查看事件流程,我们可以找到导致ANR的线程和方法。

  2. 根据分析结果,优化代码。根据分析结果,进行代码优化。例如,可以将数据加载操作放在后台线程中执行,并使用适当的数据分页策略来提高性能。

注意事项:

  1. 在使用Systrace工具时,建议仅监控必要的系统进程,以减少Systrace工具对系统性能的影响。

  2. 如果在使用Systrace工具时遇到问题,可以使用python systrace.py --help命令查看帮助文档,或参考Android官方文档。

希望这个详细步骤能够帮助您定位和解决ANR问题。

还有更加形象的图形化工具么

是的,除了命令行工具Systrace,还有一些图形化的工具可以帮助开发者更方便地分析和定位ANR问题。以下是几个常用的图形化工具:

  1. Android Studio Profiler:Android Studio自带的分析工具,可以分析应用程序的CPU、内存、网络和电量等方面的性能问题。在Android Studio中,可以通过运行应用程序并单击“Profiler”选项卡来打开Profiler工具。在Profiler工具中,可以查看应用程序的性能曲线和方法调用层次,并查找导致ANR的问题。

  2. Traceview:Traceview是Android SDK自带的分析工具,可以分析应用程序的方法调用层次和性能。在Android Studio中,可以通过运行应用程序并单击“Profile or Debug APK”选项来打开Traceview工具。在Traceview工具中,可以查看应用程序的方法调用层次和耗时,从而找到导致ANR的问题。

  3. Systrace GUI:Systrace GUI是一个图形化的Systrace工具,可以帮助开发者更方便地分析和定位ANR问题。在Systrace GUI中,可以查看系统进程的时间轴和事件流程,并找到导致ANR的线程和方法。

这些图形化工具具有更加直观、易用的特点,适合初学者和有一定经验的开发者使用。当然,这些工具也有其局限性,可能无法解决某些复杂的ANR问题,需要结合其他工具和方法进行分析和定位。

能分别给我一个具体的使用案例么以图形化的形式展现

好的,我可以给您一个具体的案例,以Android Studio Profiler工具为例。以下是使用Android Studio Profiler工具定位ANR问题的步骤:

  1. 打开Android Studio,打开要调试的应用程序项目。

  2. 单击Android Studio工具栏上的“Profiler”按钮,进入Profiler工具。

  3. 在Profiler工具中,选择要分析的性能指标,例如CPU或内存。

  4. 运行应用程序,并在Profiler工具中观察性能曲线。如果应用程序出现ANR,可以在性能曲线上看到一个突然的平稳期,表示应用程序停止响应了。

  5. 点击平稳期的标记,查看ANR报告。在报告中,可以查看ANR发生的时间、线程信息和方法调用层次。

  6. 根据报告分析ANR的原因。例如,可能是因为某个方法在主线程中执行太长时间,导致UI无法响应。

  7. 优化代码。根据分析结果,进行代码优化。例如,可以将耗时的方法放在后台线程中执行,避免阻塞主线程。

以下是一个示例截图,展示了在Android Studio Profiler工具中查看CPU性能曲线和ANR报告的情况:

在上图中,可以看到CPU性能曲线和ANR报告。在ANR报告中,可以看到导致ANR的线程和方法,以及调用层次和时间信息。通过分析这些信息,可以找到并解决ANR问题。

如果说线上的用户发生了ANR,没法获取到anr文件,那怎么定位问题呢,大公司是怎么解决的

如果线上用户发生了ANR,而且没有办法及时获取到ANR文件,那么定位问题就比较困难了。在这种情况下,大公司通常采取以下一些方法来解决ANR问题:

  1. 监控和日志记录:大公司会在应用程序中内置监控和日志记录机制,用于收集应用程序的性能数据和异常日志。一旦出现ANR,这些监控和日志记录机制就会自动触发,并将数据上传到服务器上。开发人员可以通过这些数据来分析ANR问题,并进行优化。

  2. 前端日志:有些大公司在应用程序中内置了前端日志机制,可以实时收集用户的操作数据和行为数据。当用户发生ANR时,前端日志可以记录下用户的操作行为和界面状态,帮助开发人员分析和复现问题。

  3. 热修复:一些大公司使用热修复技术,可以在不重新发布应用程序的情况下,快速修复ANR问题。当出现ANR问题时,热修复系统可以自动识别问题,并提供相应的补丁来修复问题。

  4. 线上排查:对于特别严重或者无法复现的ANR问题,大公司会派遣专业的技术人员进行线上排查。这些技术人员可以通过远程调试或者其他技术手段,对用户的设备进行诊断和分析,来解决ANR问题。

综上所述,当无法获取ANR文件时,大公司通常会通过监控和日志记录、前端日志、热修复和线上排查等方式来解决ANR问题。这需要开发团队有丰富的经验和技术实力,以快速解决问题并提高应用程序的稳定性和可靠性。






————————

如何获取本地的anr文件

https://blog.csdn.net/weixin_32612347/article/details/117659938

导出之后如何定位

https://blog.csdn.net/Deep_rooted/article/details/127377914

如果使用Systrace工具

https://blog.csdn.net/chuyouyinghe/article/details/120330832

https://blog.csdn.net/vviccc/article/details/124416744


但是我在使用的时候遇到了这个报错,导致什么也没输出

/system/bin/sh: [2]: can't create /sys/kernel/debug/tracing/trace_marker: No such file or directory

可以先忽略这个消息,Mac系统中html中空白。需要通过chrome://tracing/打开

官方文档

https://developer.android.google.cn/topic/performance/tracing/navigate-report?hl=zh-cn


TraceViwe有严重运行时开销

**Android Profile工具使用
**

耗时监控的方案。

https://juejin.cn/post/7117194640826368036



但是线上方案还是不太适合,

线上收集你要考虑日志的大小,建议看一下腾讯的matrix,并且进行二次开发,然后收集线上的堆栈,效果更好。


另外不支持查看消息处理过程中函数整体的耗时情况,

而不是最后的一个堆栈快照

解决方案: https://github.com/Knight-ZXW/BlockCanaryX

https://juejin.cn/post/7107137302043820039


其中提到的Trace的两种使用方法

https://blog.csdn.net/m0_59162559/article/details/122947334

**
**