2024新鲜出炉的Android大厂面试题锦集(BAT-TMD-JD-小米),Github标星5K-建议收藏!

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

  • 3.clinet获取的service信息就是该service的proxy,此时调用proxy的方法,proxy将请求发送到BinderDriver中,此时service的 Binder线程池循环发现有自己的请求,然后用impl就处理这个请求最后返回,这样完成了第二次Binder通讯
    4.中间client可挂起,也可以不挂起,有一个关键字oneway可以解决这个

18.android重要术语解释

  • 1.ActivityManagerServices,简称AMS,服务端对象,负责系统中所有Activity的生命周期
  • 2.ActivityThread,App的真正入口。当开启App之后,会调用main()开始运行,开启消息循环队列,这就是传说中的UI线程或者叫主线程。与ActivityManagerServices配合,一起完成Activity的管理工作
  • 3.ApplicationThread,用来实现ActivityManagerService与ActivityThread之间的交互。在ActivityManagerService需要管理相关Application中的Activity的生命周期时,通过ApplicationThread的代理对象与ActivityThread通讯。
  • 4.ApplicationThreadProxy,是ApplicationThread在服务器端的代理,负责和客户端的ApplicationThread通讯。AMS就是通过该代理与ActivityThread进行通信的。
  • 5.Instrumentation,每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家,ActivityThread要创建或暂停某个Activity时,都需要通过Instrumentation来进行具体的操作。
  • 6.ActivityStack,Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。
  • 7.ActivityRecord,ActivityStack的管理对象,每个Activity在AMS对应一个ActivityRecord,来记录Activity的状态以及其他的管理信息。其实就是服务器端的Activity对象的映像。
  • 8.TaskRecord,AMS抽象出来的一个“任务”的概念,是记录ActivityRecord的栈,一个“Task”包含若干个ActivityRecord。AMS用TaskRecord确保Activity启动和退出的顺序。如果你清楚Activity的4种launchMode,那么对这个概念应该不陌生。

19.理解Window和WindowManager

  • 1.Window用于显示View和接收各种事件,Window有三种类型:应用Window(每个Activity对应一个Window)、子Window(不能单独存在,附属于特定Window)、系统window(Toast和状态栏)
  • 2.Window分层级,应用Window在1-99、子Window在1000-1999、系统Window在2000-2999.WindowManager提供了增删改View三个功能。
  • 3.Window是个抽象概念:每一个Window对应着一个View和ViewRootImpl,Window通过ViewRootImpl来和View建立联系,View是Window存在的实体,只能通过WindowManager来访问Window。
  • 4.WindowManager的实现是WindowManagerImpl其再委托给WindowManagerGlobal来对Window进行操作,其中有四个List分别储存对应的View、ViewRootImpl、WindowManger.LayoutParams和正在被删除的View
  • 5.Window的实体是存在于远端的WindowMangerService中,所以增删改Window在本端是修改上面的几个List然后通过ViewRootImpl重绘View,通过WindowSession(每个应用一个)在远端修改Window。
  • 6.Activity创建Window:Activity会在attach()中创建Window并设置其回调(onAttachedToWindow()、dispatchTouchEvent()),Activity的Window是由Policy类创建PhoneWindow实现的。然后通过Activity#setContentView()调用PhoneWindow的setContentView。

20.Bitmap的处理

  • 1.当使用ImageView的时候,可能图片的像素大于ImageView,此时就可以通过BitmapFactory.Option来对图片进行压缩,inSampleSize表示缩小2^(inSampleSize-1)倍。
  • 2.BitMap的缓存:
  • 1.使用LruCache进行内存缓存。
  • 2.使用DiskLruCache进行硬盘缓存。
  • 3.实现一个ImageLoader的流程:同步异步加载、图片压缩、内存硬盘缓存、网络拉取
  • 1.同步加载只创建一个线程然后按照顺序进行图片加载
  • 2.异步加载使用线程池,让存在的加载任务都处于不同线程
  • 3.为了不开启过多的异步任务,只在列表静止的时候开启图片加载

21.如何实现一个网络框架(参考Volley)

  • 1.缓存队列,以url为key缓存内容可以参考Bitmap的处理方式,这里单独开启一个线程。
  • 2.网络请求队列,使用线程池进行请求。
  • 3.提供各种不同类型的返回值的解析如String,Json,图片等等。

22.ClassLoader的基础知识

  • 1.双亲委托:一个ClassLoader类负责加载这个类所涉及的所有类,在加载的时候会判断该类是否已经被加载过,然后会递归去他父ClassLoader中找。
  • 2.可以动态加载Jar通过URLClassLoader
  • 3.ClassLoader 隔离问题 JVM识别一个类是由:ClassLoader id+PackageName+ClassName。
  • 4.加载不同Jar包中的公共类:
  • 1.让父ClassLoader加载公共的Jar,子ClassLoader加载包含公共Jar的Jar,此时子ClassLoader在加载公共Jar的时候会先去父ClassLoader中找。(只适用Java)
  • 2.重写加载包含公共Jar的Jar的ClassLoader,在loadClass中找到已经加载过公共Jar的ClassLoader,也就是把父ClassLoader替换掉。(只适用Java)
  • 3.在生成包含公共Jar的Jar时候把公共Jar去掉。

23.插件化框架描述:dynamicLoadApk为例子

  • 1.可以通过DexClassLoader来对apk中的dex包进行加载访问
  • 2.如何加载资源是个很大的问题,因为宿主程序中并没有apk中的资源,所以调用R资源会报错,所以这里使用了Activity中的实现ContextImpl的getAssets()和getResources()再加上反射来实现。
  • 3.由于系统启动Activity有很多初始化动作要做,而我们手动反射很难完成,所以可以采用接口机制,将Activity的大部分生命周期提取成接口,然后通过代理Activity去调用插件Activity的生命周期。同时如果像增加一个新生命周期方法的时候,只需要在接口中和代理中声明一下就行。
  • 4.缺点:
  • 1.慎用this,因为在apk中使用this并不代表宿主中的activity,当然如果this只是表示自己的接口还是可以的。除此之外可以使用that代替this。
  • 2.不支持Service和静态注册的Broadcast
  • 3.不支持LaunchMode和Apk中Activity的隐式调用。

24.热修复:Andfix为例子

  • 1.大致原理:apkpatch将两个apk做一次对比,然后找出不同的部分。可以看到生成的apatch了文件,后缀改成zip再解压开,里面有一个dex文件。通过jadx查看一下源码,里面就是被修复的代码所在的类文件,这些更改过的类都加上了一个_CF的后缀,并且变动的方法都被加上了一个叫@MethodReplace的annotation,通过clazz和method指定了需要替换的方法。然后客户端sdk得到补丁文件后就会根据annotation来寻找需要替换的方法。最后由JNI层完成方法的替换。
  • 2.无法添加新类和新的字段、补丁文件很容易被反编译、加固平台可能会使热补丁功能失效

25.线程同步的问题,常用的线程同步

  • 1.sycn:保证了原子性、可见性、有序性
  • 2.锁:保证了原子性、可见性、有序性
  • 1.自旋锁:可以使线程在没有取得锁的时候,不被挂起,而转去执行一个空循环。
  • 1.优点:线程被挂起的几率减少,线程执行的连贯性加强。用于对于锁竞争不是很激烈,锁占用时间很短的并发线程。
  • 2.缺点:过多浪费CPU时间,有一个线程连续两次试图获得自旋锁引起死锁
  • 2.阻塞锁:没得到锁的线程等待或者挂起,Sycn、Lock
  • 3.可重入锁:一个线程可多次获取该锁,Sycn、Lock
  • 4.悲观锁:每次去拿数据的时候都认为别人会修改,所以会阻塞全部其他线程 Sycn、Lock
  • 5.乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。cas
  • 6.显示锁和内置锁:显示锁用Lock来定义、内置锁用synchronized。
  • 7.读-写锁:为了提高性能,Java提供了读
  • 3.volatile
  • 1.只能保证可见性,不能保证原子性
  • 2.自增操作有三步,此时多线程写会出现问题
  • 4.cas
  • 1.操作:内存值V、旧的预期值A、要修改的值B,当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做并返回false。
  • 2.解释:本地副本为A,共享内存为V,线程A要把V修改成B。某个时刻线程A要把V修改成B,如果A和V不同那么就表示有其他线程在修改V,此时就表示修改失败,否则表示没有其他线程修改,那么把V改成B。
  • 3.局限:如果V被修改成V1然后又被改成V,此时cas识别不出变化,还是认为没有其他线程在修改V,此时就会有问题
  • 4.局限解决:将V带上版本。
  • 5.线程不安全到底是怎么回事:
  • 1.一个线程写,多个线程读的时候,会造成写了一半就去读
  • 2.多线程写,会造成脏数据

26.Asynctask和线程池,GC相关(怎么判断哪些内存该GC,GC算法)

  • 1.Asynctask:异步任务类,单线程线程池+Handler
  • 2.线程池:
  • 1.ThreadPoolExecutor:通过Executors可以构造单线程池、固定数目线程池、不固定数目线程池。
  • 2.ScheduledThreadPoolExecutor:可以延时调用线程或者延时重复调度线程。
  • 3.GC相关:重要
  • 1.搜索算法:
  • 1.引用计数
  • 2.图搜索,可达性分析
  • 2.回收算法:
  • 1.标记清除复制:用于青年代
  • 2.标记整理:用于老年代
  • 3.堆分区:
  • 1.青年区eden 80%、survivor1 10%、survivor2 10%
  • 2.老年区
  • 4.虚拟机栈分区:
  • 1.局部变量表
  • 2.操作数栈
  • 3.动态链接
  • 4.方法返回地址
  • 5.GC Roots:
  • 1.虚拟机栈(栈桢中的本地变量表)中的引用的对象
  • 2.方法区中的类静态属性引用的对象
  • 3.方法区中的常量引用的对象
  • 4.本地方法栈中JNI的引用的对象

27.网络

  • 1.ARP协议:在IP以太网中,当一个上层协议要发包时,有了该节点的IP地址,ARP就能提供该节点的MAC地址。
  • 2.HTTP HTTPS的区别:
  • 1.HTTPS使用TLS(SSL)进行加密
  • 2.HTTPS缺省工作在TCP协议443端口
  • 3.它的工作流程一般如以下方式:
  • 1.完成TCP三次同步握手
  • 2.客户端验证服务器数字证书,通过,进入步骤3
  • 3.DH算法协商对称加密算法的密钥、hash算法的密钥
  • 4.SSL安全加密隧道协商完成
  • 5.网页以加密的方式传输,用协商的对称加密算法和密钥加密,保证数据机密性;用协商的hash算法进行数据完整性保护,保证数据不被篡改
  • 3.http请求包结构,http返回码的分类,400和500的区别
  • 1.包结构:
  • 1.请求:请求行、头部、数据
  • 2.返回:状态行、头部、数据
  • 2.http返回码分类:1到5分别是,消息、成功、重定向、客户端错误、服务端错误
  • 4.Tcp
  • 1.可靠连接,三次握手,四次挥手
  • 1.三次握手:防止了服务器端的一直等待而浪费资源,例如只是两次握手,如果s确认之后c就掉线了,那么s就会浪费资源
  • 1.syn-c = x,表示这消息是x序号
  • 2.ack-s = x + 1,表示syn-c这个消息接收成功。syn-s = y,表示这消息是y序号。
  • 3.ack-c = y + 1,表示syn-s这条消息接收成功
  • 2.四次挥手:TCP是全双工模式
  • 1.fin-c = x , 表示现在需要关闭c到s了。ack-c = y,表示上一条s的消息已经接收完毕
  • 2.ack-s = x + 1,表示需要关闭的fin-c消息已经接收到了,同意关闭
  • 3.fin-s = y + 1,表示s已经准备好关闭了,就等c的最后一条命令
  • 4.ack-c = y + 1,表示c已经关闭,让s也关闭
  • 3.滑动窗口,停止等待、后退N、选择重传
  • 4.拥塞控制,慢启动、拥塞避免、加速递减、快重传快恢复

28.数据库性能优化:索引和事务,需要找本专门的书大概了解一下

29.13.APK打包流程和其内容

  • 1.流程
  • 1.aapt生成R文件
  • 2.aidl生成java文件
  • 3.将全部java文件编译成class文件
  • 4.将全部class文件和第三方包合并成dex文件
  • 5.将资源、so文件、dex文件整合成apk
  • 6.apk签名
  • 7.apk字节对齐
  • 2.内容:so、dex、asset、资源文件

30.网络劫持的类型原理:可以百度一下了解一下具体概念

  • 1.DNS劫持、欺骗、污染
  • 2.http劫持:重定向、注入js,http注入、报文扩展

面试结束后,一定要学会总结经验,无论是这次面试有没有成功,对你后面来说都是有帮助的。也是一次好的经历。学习Android入门,并不难但是后面你就会知道,学习不难,学好很难,所以我们需要不断吸取别人的经验,把别人的东西变为自己的东西。需要系统化学系才能学好。一点要学会总结自己的经验。这样才能不断成长。

写在最后:能看到这里的人,我挺佩服你的.这篇文章是我在头条面试之前整理的,最后**80%**的题目都命中了,所以祝你好运.

学习进阶篇

以下是近年来,我和一些朋友面试收集整理了很多大厂的面试真题和资料,还有来自如阿里、小米、爱奇艺等一线大厂的大牛整理的架构进阶资料。在这里分享出来,希望可以帮助到大家。

欢迎加入群聊:875911285(记得备注简书)到管理员处领取资料,或者点击下面链接可以直接领取哦。

Android学习PDF+架构视频+面试文档+源码笔记

百万年薪必刷面试题


最全Android进阶学习视频

Android进阶核心知识点

最强Android进阶学习路线图

最后

代码真的是重质不重量,质量高的代码,是当前代码界提倡的,当然写出高质量的代码肯定需要一个相当高的专业素养,这需要在日常的代码书写中逐渐去吸收掌握,谁不是每天都在学习呀,目的还不是为了一个,为实现某个功能写出高质量的代码。

所以,长征路还长,大家还是好好地做个务实的程序员吧。

最后,小编这里有一系列Android提升学习资料,有兴趣的小伙伴们可以来看下哦~

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-wBJ7ndr8-1713211586636)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值