您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > Android

秋招Android进阶面经,面试10余家经验分享,拿到offer真不难

时间:2022-10-09 15:07:28  来源:今日头条  作者:Android不是安卓

前言

我们都知道面试大厂主要就是考察程序员技术方向的专业技能,JAVA开发主要考察的就是Java方面的专业技能,而Android岗位的专业技能就是Android程序员面试的重要考察方向。

大厂的招聘条件是明牌的,但技术这一块却难倒了大部分的人。

面试是测试一个人能力最直接的方式,从8月份开始两个月陆陆续续面了10余家公司,下面就放上我遇到的所有面试题以及我的建议,并且提供一些简历的写作和面试技巧给各位即将面试的同志们。

简历

基本信息

  • 简历不要太花哨, 你是应聘的技术, 不是设计
  • 简历把一些基本信息要说清楚(无关的不要写, 比如头像之类的)
  • 有个人博客, 跟 Github 的写上, 若没有内容那就别写
  • 应届毕业生需写上相关证书之类, 有经验的可不写
  • 简历控制在两页以内

项目经验

  • 一般写 2, 3个代表性的项目就好,优先写本职工作相关的
  • 时间顺序建议为倒序
  • 明确说明你在项目当中的职责以及发挥的作用
  • 项目模块需要了解大概逻辑与思路,以及一些关键的技术点,以防面试官问到
  • 没有项目经验的也要模仿一两个小 Demo

面试技巧

**须知**

  • 自己亲自做的东西一定要明白, 如果不是自己亲自做的, 请慎重骗面试官
  • 问的时候会问一些知识点相关的话题,比如你的数据是需要 api 交互的,那可能会问 http 相关, json 数据解析相关,缓存相关,图片加载相关等
  • 对用到的知识点虽用不着一定要看源码的地步,但是最好要懂原理,比如图片加载一定要知道二级缓存,一些常见的缓存算法

工资

不同的城市肯定工资水平不一样的,这里仅以一线城市为例,而且不同的公司、个人能力的高低都会造成工资差异化,这里只是一个大概。

注意事项

  • 去面试前一定要花点时间了解下你面试的这家公司(本身有自己产品的下载体验一下,以防面试过程中问到,或者可以给产品提点意见)
  • 面试的时候态度要谦虚点
  • 学习能力很重要(一定要让面试官感受到你是一个好学的人)
  • 个人兴趣(不要提什么打游戏, 唱歌之类的, 可以说一下业余时间提下自己经常上一些技术社区,看一些技术博客之类的)
  • 除了基本的知识点, 面试官通常都会问一些比较深的领域(可能你没有接触过,但不要气馁, 面试官在考察下你的技术的深度, 这些领域一般包括设计模式, 虚拟机, 插件化, React Native之类的)

面试题目

1.一般什么情况下会导致内存泄漏问题?如何解决

参考答案:

  1. 资源对象没关闭造成的内存泄漏(如: Cursor、File等)
  2. Bitmap 对象不在使用时调用recycle()释放内存
  3. 集合中对象没清理造成的内存泄漏(特别是 static 修饰的集合)
  4. 接收器、监听器注册没取消造成的内存泄漏
  5. Activity 的 Context 造成的泄漏,可以使用 ApplicationContext
  6. Handler 造成的内存泄漏问题(一般由于 Handler 生命周期比其外部类的生命周期长引起的)

2.自定义 Handler 时如何有效地避免内存泄漏问题?

参考答案:

1.自定义的静态handler 2.可以加一个弱引用 3.还有一个主意的就是当你activity被销毁的时候如果还有消息没有发出去 就remove掉吧
4.removecallbacksandmessages去清除Message和Runnable 加null 写在生命周的ondestroy()就行

3.哪些情况下会导致OOM问题?如何解决?

参考答案:

1,过多的内存泄漏会导致内存溢出 2,加载大的图片 3,创建过多的线程

内存优化的解决方法: 1.申请更大的内存,比如多进程、设置manifest中的largeHeap=true等。 2.减少内存使用 ①使用优化后的集合对象,分场景使用SpaseArray和HashMap; ②使用微信的mmkv替代sharedpreference; ③使用StringBuilder替代String拼接 ④统一带有缓存的基础库,特别是图片库,如果用了两套不一样的图片加载库就会出现2个图片各自维护一套图片缓存 ⑤给ImageView设置合适尺寸的图片,列表页显示缩略图,查看大图显示原图 ⑥优化业务架构设计,比如省市区数据分批加载,需要加载省就加载省,需要加载市就加载失去,避免一下子加载所有数据 3.避免内存泄漏

4.ANR 出现的场景以及解决方案?

参考答案:

场景: 1、触摸无响应5s 2、BroadCastReciver 前台处理超过10s 后台超过60s 3、Server 前台处理超过20s 后台超过200s

ANR出现的类型有两种 1、主线程耗时导致 2、CPU、内存、IO 占用过高资源耗尽(其他进程也可以导致)

如何避免: 1、不要在主线程中做耗时的操作 2、避免CPU占用过高,简化方法,减少执行时间 3、避免内存占用过高,防止内存泄漏

5.谈谈 Android 中内存优化的方式?

参考答案:

关于内存泄漏,一般像单例模式的使用不当啊、集合的操作不当啊、资源的缺乏有效的回收机制啊、Handler、线程的使用不当等等都有可能引发内存泄漏。

  1. 单例模式引发的内存泄漏: 原因:单例模式里的静态实例持有对象的引用,导致对象无法被回收,常见为持有Activity的引用 优化:改为持有Application的引用,或者不持有使用的时候传递。
  2. 集合操作不当引发的内存泄漏: 原因:集合只增不减 优化:有对应的删除或卸载操作
  3. 线程的操作不当引发的内存泄漏: 原因:线程持有对象的引用在后台执行,与对象的生命周期不一致 优化:静态实例+弱引用(WeakReference)方式,使其生命周期一致
  4. 匿名内部类/非静态内部类操作不当引发的内存泄漏: 原因:内部类持有对象引用,导致无法释放,比如各种回调 优化:保持生命周期一致,改为静态实例+对象的弱引用方式(WeakReference)
  5. 常用的资源未关闭回收引发的内存泄漏: 原因:BroadcastReceiver,File,Cursor,IO流,Bitmap等资源使用未关闭 优化:使用后有对应的关闭和卸载机制
  6. Handler使用不当造成的内存泄漏: 原因:Handler持有Activity的引用,其发送的Message中持有Handler的引用,当队列处理Message的时间过长会导致Handler无法被回收 优化:静态实例+弱引用(WeakReference)方式 内存溢出: 原因: 1.内存泄漏长时间的积累 2.业务操作使用超大内存 优化: 1.调整图像大小后再放入内存、及时回收 2.不要过多的创建静态变量

 

6.为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?

参考答案:

  • 1)空间冗余:图像相邻像素之间有较强的相关性
  • 2)时间冗余:视频序列的相邻图像之间内容相似
  • 3)编码冗余:不同像素值出现的概率不同
  • 4)视觉冗余:人的视觉系统对某些细节不敏感
  • 5)知识冗余:规律性的结构可由先验知识和背景知识得到

7.怎么做到直播秒开优化?

参考答案:

  • DNS 解析慢 为了有效降低 DNS 解析对首开的影响,我们可以提前完成播放域名->IP 地址的解析, 并缓存起来,播放的时候,直接传入带 IP 地址的播放地址,从而省去了 DNS 解析的耗时。 如果要支持用 IP 地址播放,是需要修改底层 ffmpeg 源码的。
  • 播放策略 很多侧重点播的播放器,为了减少卡顿,会有一些缓冲策略,当缓冲足够多的数据之后 ,再送入解码播放。

而为了加快首开效果,需要对播放的缓冲策略做一些调整,如果第一帧还没有渲染出来的情况下, 不要做任何缓冲,直接送入解码器解码播放,这样就可以保证没有任何因为「主动」缓冲带来的首开延时。

  • 播放参数设置 所有基于 ffmpeg 的播放器,都会遇到avformat_find_stream_info这个函数耗时比较久, 从而增大了首开时间,该函数主要作用是通过读取一定字节的码流数据, 来分析码流的基本信息,如编码信息、时长、码率、帧率等等,它由两个参数来控制其读取的数据量大小和时长, 一个是 probesize,一个是 analyzeduration。

减少 probesize 和 analyzeduration 可以有效地减少avformat_find_stream_info的函数耗时, 从而加快首开,但是需要注意的是,设置地太小可能会导致读取的数据量不足,从而无法解析出码流信息,导致播放失败, 或者出现只有音频没有视频,只有视频没有音频的问题。

  • 服务端优化
  • 服务器关键帧缓冲
  • CDN最近策略

8.直方图在图像处理里面最重要的作用是什么?

参考答案:

  1. 灰度直方图的定义:灰度级的函数,描述图像中该灰度级的像素个数或该灰度级像素出现的频率。反映了图像灰度分布的情况。
  2. 灰度直方图只能反映图像的灰度分布情况,不能反映图像像素的位置,即所有的空间信息全部丢失。
  • 直方图的应用:
  • a.数字化参数:判断一幅图像是否合理的利用了全部被允许的灰度级范围。一般一幅图应该利用全部或几乎全部可能的灰度级,否则等于增加了量化间隔,丢失的信息将不能恢复。
  • b.边界阈值选取(确定图像二值化的阈值):假定某图像的灰度直方图具有二峰性,则表明这个图像的较亮区域和较暗区域可以很好地分离,以这一点为阈值点,可以得到很好地2值处理效果(区分物体与背景)。
  • c.当物体部分的灰度值比其他部分的灰度值大时,可利用直方图统计图像中物体的面积。
  • d.计算图像的信息量H。

9.说一说ffmpeg的数据结构?

参考答案:

ffmpeg的数据结构可以分为以下几类:

 

  • (1)解协议(http,rtsp,rtmp,mms) AVIOContext,URLProtocol,URLContext主要存储视音频使用的协议的类型以及状态。 URLProtocol存储输入音视频使用的封装格式。每种协议都对应一个URLProtocol结构。(注意:FFMPEG中文件也被当做一种协议“file”)
  • (2)解封装(flv,avi,rmvb,mp4) AVFormatContext主要存储视音频封装格式中包含的信息 ffmpeg支持各种各样的音视频输入和输出文件格式(例如FLV, MKV, MP4, AVI),而 AVInputFormat和AVOutputFormat 结构体则保存了这些格式的信息和一些常规设置。
  • (3)解码(h264,mpeg2,aac,mp3) AVStream是存储每一个视频/音频流信息的结构体。 AVCodecContext: 编解码器上下文结构体,存储该视频/音频流使用解码方式的相关数据。 AVCodec: 每种视频(音频)编解码器(例如H.264解码器)对应一 个该结构体。

三者的关系如下图:

 

  • (4)存数据 对于视频,每个结构一般是存一帧;音频可能有好几帧
    • 解码前数据:AVPacket
    • 解码后数据:AVFrame

10.数字图像滤波有哪些方法?

参考答案:

均值滤波(邻域平均法)、中值滤波(消除独立的噪声点)、高斯滤波(线性平滑滤波,消除高斯噪声,对整幅图像进行加权平均,每一个像素点的值都由其本身和邻域内的其他像素值经过加权平均后得到)、KNN滤波、高通滤波、低通滤波等。



Tags:Android   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Android Emulator黑屏怎么办 Android模拟器黑屏解决方法
Android Emulator黑屏问题困扰了非常多的玩家,Android Emulator作为一款安卓模拟器,可以让你在电脑上运行和浏览安卓应用程序,但是程序本身不是很稳定,很容易会出现黑屏,启动不了...【详细内容】
2024-03-04  Search: Android  点击:(37)  评论:(0)  加入收藏
Android 谷歌三件套:解锁谷歌生态!
大家是不是遇到这个情况?当我们需要下载一些国外的游戏或者软件的时候,需要在手机里面安装Google Play商店,然后通过Google Play商店下载国外软件!为了帮助大家使用上各种好用的...【详细内容】
2024-01-02  Search: Android  点击:(113)  评论:(0)  加入收藏
Android开发中常见的Hook技术有哪些?
Hook技术介绍Hook技术是一种在软件开发中常见的技术,它允许开发者在特定的事件发生时插入自定义的代码逻辑。常见的应用场景包括在函数调用前后执行特定的操作,或者在特定的事...【详细内容】
2023-12-25  Search: Android  点击:(86)  评论:(0)  加入收藏
在Android应用开发中使用NFC功能
NFC介绍NFC是指“近场通讯”(Near Field Communication),它是一种短距离无线通信技术,允许设备在非接触或极短距离内进行通信。NFC通常用于移动支付、门禁系统、智能标签和其他...【详细内容】
2023-12-22  Search: Android  点击:(102)  评论:(0)  加入收藏
关于Android图像Bitmap类,你要知道的一切
Bitmap介绍Bitmap是一种图像文件格式,它由像素阵列组成,每个像素都有自己的颜色信息。在计算机图形学中,Bitmap图像可以被描述为一个二维的矩阵,其中每个元素代表一个像素的颜色...【详细内容】
2023-12-19  Search: Android  点击:(99)  评论:(0)  加入收藏
Android开发中如何进行单元测试?
单元测试介绍单元测试是软件开发中的一种测试方法,用于验证代码中的最小可测试单元(通常是函数或方法)是否按预期工作。单元测试通常由开发人员编写,旨在隔离和测试代码的特定部...【详细内容】
2023-12-11  Search: Android  点击:(168)  评论:(0)  加入收藏
我的手机我做主,如何为Android手机应用换图标?
作为一名Android用户,你是否曾经为自己的手机桌面感到单调而乏味?虽然Android系统的桌面定制性已经非常强大,但有时候我们还是希望能够在细节上做出一些改变,尤其是对于那些每天...【详细内容】
2023-12-10  Search: Android  点击:(61)  评论:(0)  加入收藏
了解Android系统架构中的HAL硬件抽象层
在Android系统中,HAL的存在使得不同厂商的硬件可以统一被上层的应用程序调用,从而提高了系统的兼容性和可移植性。HAL还可以帮助开发者更方便地开发应用程序,因为他们不需要为...【详细内容】
2023-12-06  Search: Android  点击:(203)  评论:(0)  加入收藏
谷歌 CEO 皮查伊建议 Android 用户不要侧载应用,称非常危险
iOS和Android的一个显著差异是,Android支持用户从第三方渠道安装应用程序(即“侧载”)。然而,谷歌似乎并不希望用户这样做。最近,在与Epic Store的法律诉讼中,谷歌首席执行官桑达...【详细内容】
2023-11-20  Search: Android  点击:(167)  评论:(0)  加入收藏
Android数据对象序列化原理与应用
序列化与反序列化「序列化」是将对象转换为可以存储或传输的格式的过程。在计算机科学中,对象通常是指内存中的数据结构,如数组、列表、字典等。通过序列化,可以将这些对象转换...【详细内容】
2023-11-14  Search: Android  点击:(273)  评论:(0)  加入收藏
▌简易百科推荐
Android Emulator黑屏怎么办 Android模拟器黑屏解决方法
Android Emulator黑屏问题困扰了非常多的玩家,Android Emulator作为一款安卓模拟器,可以让你在电脑上运行和浏览安卓应用程序,但是程序本身不是很稳定,很容易会出现黑屏,启动不了...【详细内容】
2024-03-04  18183游戏网    Tags:Android Emulator   点击:(37)  评论:(0)  加入收藏
Android开发中常见的Hook技术有哪些?
Hook技术介绍Hook技术是一种在软件开发中常见的技术,它允许开发者在特定的事件发生时插入自定义的代码逻辑。常见的应用场景包括在函数调用前后执行特定的操作,或者在特定的事...【详细内容】
2023-12-25  沐雨花飞蝶  微信公众号  Tags:Android   点击:(86)  评论:(0)  加入收藏
在Android应用开发中使用NFC功能
NFC介绍NFC是指“近场通讯”(Near Field Communication),它是一种短距离无线通信技术,允许设备在非接触或极短距离内进行通信。NFC通常用于移动支付、门禁系统、智能标签和其他...【详细内容】
2023-12-22  沐雨花飞蝶  微信公众号  Tags:Android   点击:(102)  评论:(0)  加入收藏
关于Android图像Bitmap类,你要知道的一切
Bitmap介绍Bitmap是一种图像文件格式,它由像素阵列组成,每个像素都有自己的颜色信息。在计算机图形学中,Bitmap图像可以被描述为一个二维的矩阵,其中每个元素代表一个像素的颜色...【详细内容】
2023-12-19  沐雨花飞蝶  微信公众号  Tags:Android   点击:(99)  评论:(0)  加入收藏
Android开发中如何进行单元测试?
单元测试介绍单元测试是软件开发中的一种测试方法,用于验证代码中的最小可测试单元(通常是函数或方法)是否按预期工作。单元测试通常由开发人员编写,旨在隔离和测试代码的特定部...【详细内容】
2023-12-11  沐雨花飞蝶  微信公众号  Tags:Android   点击:(168)  评论:(0)  加入收藏
一篇聊聊Jetpack Room实现数据存储持久性
Room介绍Room 是 Android Jetpack 组件库中的一部分,它是用于在 Android 应用中进行本地数据库访问和管理的库。Room 提供了一个抽象层,使开发者能够更轻松地访问 SQLite 数据...【详细内容】
2023-12-08  沐雨花飞蝶  微信公众号  Tags:Jetpack   点击:(143)  评论:(0)  加入收藏
了解Android系统架构中的HAL硬件抽象层
在Android系统中,HAL的存在使得不同厂商的硬件可以统一被上层的应用程序调用,从而提高了系统的兼容性和可移植性。HAL还可以帮助开发者更方便地开发应用程序,因为他们不需要为...【详细内容】
2023-12-06  沐雨花飞蝶  微信公众号  Tags:Android   点击:(203)  评论:(0)  加入收藏
我们一起聊聊 IntentService 与 Service 的区别?
Service介绍Service组件是Android应用开发中的四大组件之一,用于在后台执行长时间运行的操作或处理远程请求。它可以在没有用户界面的情况下执行任务,并且可以与其他应用组件...【详细内容】
2023-12-06  沐雨花飞蝶  微信公众号  Tags:IntentService   点击:(171)  评论:(0)  加入收藏
Android数据对象序列化原理与应用
序列化与反序列化「序列化」是将对象转换为可以存储或传输的格式的过程。在计算机科学中,对象通常是指内存中的数据结构,如数组、列表、字典等。通过序列化,可以将这些对象转换...【详细内容】
2023-11-14  沐雨花飞蝶  微信公众号  Tags:Android   点击:(273)  评论:(0)  加入收藏
你了解Android中的SELinux吗?
SELinux介绍SELinux(Security-Enhanced Linux)是一种安全增强的Linux操作系统,它通过强制访问控制(MAC)机制来提供更高级别的系统安全保护。相比于传统的Linux访问控制机制(DAC),SEL...【详细内容】
2023-11-09  沐雨花飞蝶  微信公众号  Tags:Android   点击:(268)  评论:(0)  加入收藏
站内最新
站内热门
站内头条