Android高级工程师面试题,android 高级面试题

Android高级工程师面试题35、什么情况下会导致内存泄露;
36、如何对Android 应用进行性能分析以及优化;
37、说一款你认为当前比较火的应用并设计(直播APP);
38、OOM的

35、什么情况下会发生内存泄漏?

36.如何对Android应用程序进行性能分析和优化。

37. 命名并设计一个你认为当今流行的应用程序(直播APP)。

38.避免和解决OOM异常。

39、屏幕适配有哪些处理技巧?

40. 在两个Activity 之间移动时应该执行哪个方法?

答:例如,正常情况下有两个活动,分别名为A 和B。当A激活B组件时,A调用onPause()方法,然后B调用onCreate()、onStart()。 onResume() 。

此时,B覆盖了表单,A调用了onStop()方法。如果B是透明的或者对话框风格的,A将不会被调用。

onStop() 方法。

2.网络

网络协议模型

应用层:负责处理具体的应用细节HTTP、FTP、DNS。

传输层:提供两台主机之间端到端的基本通信TCP、UDP。

网络层:控制数据包传输、路由等的IP。

链路层:操作系统设备驱动、网卡相关接口

TCP 和 UDP 区别

适用于TCP 连接、高速、文件传输、浏览器等。

全双工:当A向B发送消息时,B也可以向A发送消息。 半双工:当A向B发送消息时,B无法向A发送消息。

UDP 不太可靠且面向消息,因此适合即时消息和视频通话等。

TCP 三次握手

答:你能听到我说话吗? B:我能听到你说话,你能听到我说话吗? A:我听到了,我们开始吧。

A 和B 双方都需要确保“你能听到我的声音”和“我能听到你的声音”。换句话说,需要三次握手。

TCP 四次挥手

答: 已经完成了。乙:好的。事情可能还没有结束。答:好的。

B收到A的终止消息后,B可能还没有说完,无法立即响应终止信号。你所能做的就是等他们说完,然后告诉他们:“我说完了。”

POST 和 GET 区别

Get参数放在URL中,而Post参数放在URL中,可能不安全。

HTTPS

HTTP是一种超文本传输协议,发送纯文本,而HTTPS则使用SSL协议对HTTP发送的数据进行加密。

HTTP 默认端口80,HTTPS 默认端口443

优点:安全缺点:耗时、SSL证书费用、加密能力仍然有限,但比HTTP强很多

3.Java基础数据结构设计模式

1.集合类和集合框架、HashMap和HashTable实现原理、线程安全、哈希争用、ConcurrentHashMap处理算法。

2.进程和线程的区别。

3.Java并发、多线程和线程模型。

4. 什么是线程池以及如何使用它?

Ans: 线程池是预先定位容器中的多个线程对象,使用时不需要使用新的线程,直接访问线程池即可获取线程,而且耗时较少即可保存。创建子线程以提高代码执行效率。

5、如何保证数据一致性,同步关键字、类锁、方法锁、可重入锁。

6. Java中实现多态性的机制是什么?

7. 如何将Java对象序列化为文件。

8.你对Java反射的理解是怎样的?

Ans:在Java反射中,首先我们得到我们想要在Java中反射的类的字节码。获取字节码的方法有3种。

1.Class.forName(类名)

2.类名.class

3.this.getClass()。

然后将字节码中的方法、变量、构造函数等映射到相应的方法、字段、构造函数和其他类,提供丰富的方法集供使用。

4、同步方式、多进程开发以及多进程应用场景。

5、Java中wait方法和seelp方法的区别。

答:最大的区别是wait在等待时释放锁,而sleep始终持有锁。 wait通常用于线程之间的交互,sleep通常用于暂停执行。

synchronous 和volatile 关键字的作用。

Ans: 1) 保证不同线程操作该变量时的可见性。也就是说,当一个线程更改特定变量的值时,新值立即对其他线程可见。

2) 禁止指令重新排序。

易失性的本质是告诉JVM某个寄存器(工作内存)中当前变量的值是不确定的,应该用同步锁来读取当前变量。其他线程将被阻塞。

1.volatile只能在变量级别使用。同步可以在变量、方法和类级别使用。

2、Volatile只能实现变量变化的可见性,但不能保证原子性。 synchronized可以保证变量变化的可见性和原子性。

3. volatile不会导致线程阻塞,但synchronized可以。

4. 标记为volatile 的变量不会被编译器优化,而标记为Synchronized 的变量可以被编译器优化。

6、服务器端仅提供数据接收接口。如何保证多线程或多进程情况下成功接收数据。

7.ThreadLocal原理、实现以及如何保护Local属性。

8. 比较字符串StringBuilder StringBuffer。

9.你知道哪些设计模式?

答:一般认为Java中有23种设计模式。你不需要什么都知道,但你应该掌握一些常用的设计模式。下面列出了所有设计模式。我们单独列出了您需要掌握的设计模式。当然,你能掌握的越多越好。

设计模式一般分为三类:

有五种创意模式:工厂方法模式、抽象工厂模式、单例模式、构建器模式和原型模式。

共有七种结构模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

总共有11种行为模式:策略模式、模板方法模式、观察者模式、重复子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式和解释器模式。

10. Java如何调用C和C++语言?

11.接口和回调原理;创建回调demo。

12. 一般原则、解析和调度。

13.抽象类和接口的区别。抽象类是否可以没有方法和属性。

14. 静态属性和方法可以继承吗?为什么?

15. 更改对象A的equals方法的签名。更改使用HashMap 保存此对象实例时调用哪个equals 方法。

16.请告诉我们您对仿制药的理解。

17.Java的异常系统。

18. 如何控制特定方法允许的并发访问线程数。

19. 动态代理及其使用场景之间的差异。

数据结构和算法

1、内存中的堆和栈有什么区别(数据结构和实际实现)?

2、最快的排序算法是什么?按照年龄对阿里巴巴20000+员工进行分类应该使用哪种算法?堆和树的区别是链表的逆序,这是关于编写代码的问题。

3.找出1000朵以内的水仙花的数量和40亿朵以内的水仙花的数量。

4.编写代码实现子串包含问题(KMP算法)。

5、给定2万亿个URL文件A和B,如何求A和B之间的差异集C(位映射、哈希分组、读写多个文件的效率、磁盘寻址和应用程序级寻址优化)。

6 蚁群算法和蒙特卡罗算法。

7. 写下你所知道的排序算法,它们的时间和空间复杂度以及稳定性。

8.如何尝试百度POI查找最近商户功能(坐标镜像+R树)。

4.Android性能优化Framwork

Activity 启动模式

标准标准模式单顶栈顶复用模式,推送点击消息界面单任务栈内复用模式,主页单实例单例模式,任务堆栈单独放置在拨号电话界面

详细信息: taskAffinity:任务亲和性,用于指定任务堆栈名称。默认为应用程序包名称。 allowedTaskReparenting:允许任务堆栈传输。

View 工作原理

DecorView (FrameLayout) LinearLayout 标题栏调用setContentView设置的内容视图

调用ViewRoot的PerformTraversals方法会触发View绘制的开始,进而调用:

PerformMeasure:通过遍历视图的度量来测量大小。 PerformLayout:遍历视图的布局以确定其位置。 PerformDraw:遍历视图的绘图。

事件分发机制

当生成MotionEvent 时,它按以下顺序传递:Activity – Window – DecorView – View。视图交付过程依赖于三种主要方法。dispatchTouchEvent:用于调度事件。返回的结果用于在接收到当前事件的OnInterceptTouchEvent时判断是否拦截该事件。对于此ViewGroup:用于处理事件。返回的结果表明当前事件是否被处理,并传递给父容器进行进一步处理。

iew 拦截并消费View。您不能直接调用onTouchEvent 来处理它。 onTouchListener 可以阻止对父容器的onIntercet 方法的调用。

Window 、 WindowManager、WMS、SurfaceFlinger

Window:实际并不存在的抽象,而是以View的形式存在。 WindowManager 被实现为从外部世界到Window 的网关。 WMS提供布局和管理。窗口顺序SurfaceFlinger 是进程内运行的另一个系统级服务,它以特定的顺序在屏幕上显示WMS 维护的窗口。

View 动画、帧动画及属性动画

观看动画:

该对象是一个视图,可以在XML 中定义。我们建议XML 实现易于阅读并支持以下四种效果:平移、缩放、旋转和透明。

帧动画:

通过AnimationDrawable实现,轻松OOM

属性动画:

这可以与任何对象一起使用。这是在Android 3 中引入的。我们建议您使代码实现更加灵活,包括ObjectAnimator、ValuetAnimator和AnimatorSet。系统根据经过时间的百分比预设插值。设备类型估算器:根据当前属性的变化百分比计算变化的属性值。系统预设整数、浮点数。关于使用、颜色值和其他类型估计器的注意事项:避免使用帧动画以避免内存泄漏并启用硬件加速以提高动画流畅度。将CPU的部分工作分配给GPU,由GPU完成绘图工作,从工作共享和绘图机制两方面优化绘图速度。

Handler、MessageQueue、Looper

Handler:开发一个直接联系的类,内部保存MessageQueue和Looper。 Looper:内部维护一个MessageQueue,检查是否有新消息,有则处理。否则阻塞如何实现阻塞: passnativePollOnce 方法基于Linux epoll 事件管理机制。为什么主线程没有因为Looper而被阻塞?系统每16 毫秒发送一条刷新UI 消息进行唤醒。

MVC、MVP、MVVM

MVP:模型:处理数据,视图:控制视图,演示者:活动和模型MVVM:模型:处理数据检索和存储,视图:ViewModel:使用数据容器方便地实现MVVM。

Serializable、Parcelable

Serialized:Java序列化方法。适合存储和网络传输。 SerialVersionUID 用于确定反序列化和类版本是否匹配。 Parcelable:Android序列化方法。适用于组件通信的数据传输。它提高了性能,因为它没有繁重的反射操作或像Serialized 那样频繁的GC。

Binder

mmap 是Android 进程间通信的支柱,用于通过单个数据副本实现IPC。 mmap映射内核和用户B的空间。实现用户A直接传输数据。 Spaces – User B Space BinderPool 可以让您避免创建多个服务

IPC 方式

意图Extra Bundle:传输的数据必须是可序列化、可分片、可序列化并且适合四个主要组件之间的通信。 文件共享:适合实时性要求不高的场景下进行简单的数据交换。 AIDL:AIDL接口本质上是一个系统提供的工具,可以让你轻松实现BInder。 Server:在AIDL文件中声明暴露给客户端的接口。创建一个实现AIDL接口并监控客户端连接请求的服务。 客户端:绑定服务。绑定成功后,获取服务器端Binder对象,转换为AIDL接口,实现跨进程接口监控。同样的Binder对象被用作存储客户端注册的监听器的key。 1. Binder.linkToDeath 设置终止代理。 2. AIDL,基于服务器端串行处理实现。主要用于发送消息,适合低并发的一对多通信ContentProvider:基于Binder实现,适合一对多的进程间数据共享Sockets:TCP、UDP,适合网络数据交换

Android 系统启动流程

按下电源按钮- 将引导加载程序BootLoader 加载到RAM – 运行BootLoader 程序启动内核- 启动init 进程- 启动Zygote 和各种守护进程- 系统服务器服务进程启动AMS、WMS 等- 启动器应用程序进程

App 启动流程

单击启动器中的应用程序图标。通过AMS定位申请流程。如果应用程序进程不存在,则通过Zygote进程fork它。

进程保活

进程优先级:1.前台进程,2.可见进程,4.后台进程,5.空进程。 场景: 1、内存不足导致进程被杀死。 2. 切换到背景制作器。省电机制将被强制终止。 3. 用户主动执行清理和保活方法。 1.提升活动权限:挂起1像素活动并将进程优先级提升至前台进程。升级:启动前台服务(API18有运行通知栏) 3.激活广播4.激活服务5.激活JobScheduler定时任务6.激活双进程

网络优化及检测

速度: 1. GZIP 压缩(okhttp 自动支持); 2. 使用协议缓冲区替换json; 4. IP 直连节省DNS 解析时间: 1. 失败重试策略。 GZIP压缩(okhttp自动支持),2.json替换为protocol buffers,5.文件下载断点重启,6.缓存协议层优化(改进http版本等)。网络监视器监控流量

UI卡顿优化

降低布局层次,控制复杂度避免过度绘制,优化绘制流程,避免Draw中频繁创建对象和耗时操作。

内存泄漏场景及规避

1.静态变量和单例强制引用与生命周期相关的数据或资源,包括EventBus。 2. 游标、IO 流和其他资源没有被积极释放。 3、界面销毁时界面相关动画暂停。 4.内部类持有外部类引用引起的内存泄漏

避免handler内部类内存泄漏: 1.使用静态内部类+弱引用2.接口销毁时清除消息队列检测者:Android Studio Profiler

LeakCanary 原理

监视对象是否通过弱引用和引用队列被回收。比如当activity被销毁的时候就开始监控这个对象,并主动运行gc来继续监控。

OOM 场景及规避

加载大图像:减少图像内存泄漏:避免内存泄漏

5.Android 模块化热修复热更新打包混淆压缩

Dalvik 和 ART

Dalvik是Google专门为Android平台设计的Java虚拟机,可以直接执行.dex文件,适合内存和处理速度有限的系统。 JVM指令集是基于栈的。每次运行ART Dalvik时,字节码都必须转换为机器代码,ART在安装应用程序时会转换为机器代码,提高执行速度。并且用空间来换取时间。

APK 打包流程

1. aapt打包资源文件,生成R.java文件,aidl生成Java文件2. 将Java文件编译为class文件3. 项目和第三方class文件为dex文件转换4. 转换dex文件,将编译后的资源转换为原始资源等打包成apk文件5.标志6.资源文件的放置,减少运行时内存

App 安装过程

首先,解压APK并将资源等放入您的应用程序目录中。 Dalvik将dex处理成ODEX,OAT包含安装时编译的dex和机器代码。

组件化路由实现

ARoute:通过APT解析@Route等注解,并与JavaPoet结合生成路由表,即路由和活动之间的映射关系。

6.音视频FFmpeg播放器

FFmpeg

我实现了一个基于命令模式的音视频编辑应用:https://github.com/yhaolpz/FFmpegCmd

集成编译AAC、MP3、H264编码器

播放器原理

视频播放原理:(mp4、flv)——解封装——(mp3/aac、h264/h265)——解码——(pcm、yuv)——音视频同步——渲染播放

音视频同步:

选择参考时钟源:在音频时间戳、视频时间戳、外部时间之间选择作为参考时钟源(一般选择音频;人们对音频比较敏感,ijk默认为(选择音频)。将视频流与参考进行比较。等待或丢帧调整时钟源以实现同步

IjkPlayer 原理

我们集成了三个实现:MediaPlayer、ExoPlayer 和IjkPlayer。其中IjkPlayer是基于FFmpeg的ffplay

音频输出方式:AudioTrack、OpenSL ES,视频输出方式:NativeWindow、OpenGL ES

7、项目人员

1.您在项目开发中遇到的最大的问题和挑战是如何解决的(95%问)

2.你在发展中最大的优势是什么?(95%问)

最后

多年来,编辑了解到,大多数入门级和中级Android工程师想要提高自己,往往必须自己探索和成长,这是不系统的、短暂的,我了解到这并没有帮助。

因此,我们收集整理了《2024年Android移动开发全套学习资料》册。最初的目的也很简单。换句话说,我们想帮助那些想学习、提高自己,但不知道从哪里开始的朋友。

一个人可以走得快,但一群人可以走得更远。无论是IT行业的资深人士还是对IT行业感兴趣的新人。

欢迎任何人加入我们的圈子(技术交流、学习资源、职场投诉、大公司内部推荐、面试指导),让我们一起学习、成长!

获取信息专栏

问题和挑战以及它们是如何解决的。 (95%询问)

2.你在发展中最大的优势是什么?(95%问)

最后

多年来,编辑了解到,大多数入门级和中级Android工程师想要提高自己,往往必须自己探索和成长,这是不系统的、短暂的,我了解到这并没有帮助。

因此,我们收集整理了《2024年Android移动开发全套学习资料》册。最初的目的也很简单。换句话说,我们想帮助那些想学习、提高自己,但不知道从哪里开始的朋友。

[正在传输外部链接图像.(img-eJLD7cKK-1719022417610)]

一个人可以走得快,但一群人可以走得更远。无论是IT行业的资深人士还是对IT行业感兴趣的新人。

欢迎任何人加入我们的圈子(技术交流、学习资源、职场投诉、大公司内部推荐、面试指导),让我们一起学习、成长!

获取信息专栏

以上#Android高级工程师面试题相关内容摘自网络,仅供参考。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91472.html

(0)
CSDN's avatarCSDN
上一篇 2024年6月22日 上午10:18
下一篇 2024年6月22日 上午10:18

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注