0%

自我经验

1、内存泄漏怎么检测?LeakCanary 原理

2、HashMap 源码?为什么要将链表转成红黑树?红黑树特点?

3、消息循环源码、如何做到任务切换线程?想要提交一个任务有几种方式?

4、多个Fragment在销毁后重建之后重叠怎么办

点击看答案

产生重叠的原因

一般是由于我们采用show 和 hide 的方式( 而不是replace )来控制Fragment 的显示和隐藏,当Activity 由于内存不足被回收之后再恢复的时候,如果不做处理,那就会把这些fragment new 出来添加到Activity 中,由于是刚new出来的,并没有以前的show/hide 状态,因此就造成重叠。

解决办法

在第一次进入Activity 初始化Fragment的时候,为添加的fragment 设置tag ,并且 tag 为fragment的全限定名,将这些tag以列表形式tags保存。在 onSaveInstanceState 回调的时候,保存tags。

在恢复的时候,首先恢复出来tags,再依次遍历tags中的tag,使用FragmentManager.findFragmentByTag 查找fragment。如果查找出来的 fragment 不空,则直接使用,否则的话,就使用 savedInstanceState?.classLoader.loadClass(tag) 来反射新建这个fragment (因为我们的tag就是fragment 的全限定名嘛)。

replace 方式切换fragment 与 show/hide 方式切换fragment

replace 固然可以避免很多不必要的问题,但是它不能保存页面状态,对用户体验不友好,频繁切换还会导致卡顿。show/hide 方式只会控制隐藏/展示,所以效率上会好一些。

以上内容参考自简书上的博客披萨大叔

5、设计一个图片缓存框架,缓存算法用什么

点击看答案

缓存算法使用 LRUCache,其原理可以参考Android基础-LruCache原理

6、有个ListView快速滑动 如何优化Bitmap的显示

点击看答案

监听列表的 onScrollChangeListener ,在快速滑动的时候, Fresco.getImagePipeline().pause() ,停下之后又 resume() 操作。

以上内容可以参考:cnblogs上的博客

7、Bitmap的复用听过没有

8、kotlin 协程原理?怎么切换线程的?Kotlin 优点和缺点?

9、调优、怎么瘦身,打包流程,模块化

10、开发者模式中,GPUInfo 中柱状图颜色代表的含义;命令dumpsys meminfo中VSS、PSS、GSS、USS代表什么意思

11、Android绘制三部曲、Canvas是怎么最终显示在屏幕中的、是以什么样子的数据结构传输的

12、物理内存与虚拟内存的关系、Android Heap的结构是怎么样的、如果要进行垃圾回收,会收集那些区域

13、binder源码、其原理是什么,发起一次请求的过程,如何根据文件描述符找到对应的binder实体

14、如何进行内存优化 减少内存消耗

1、try catch finally关于return的执行结果

2、treemap如何对两个元素进行比较? 非compareble对象比较?

点击看答案

如果是非 compareble 对象,则通过构造函数传入自定义的 Comparetor 比较器。

参考java基础第10个知识点

3、object有什么方法

点击看答案

clone、equals、finalize、getClass、hashCode、identityHashCode、identityHashCodeNative、internalClone、notify、notifyAll、toString、wait

以上内容参考自系统源码

4、讲讲Android存在的设计模式

点击看答案
  • Context 的装饰器模式
  • AlertDialog 使用了建造者模式
  • BitmapFactory 的工厂模式
  • View 的layout、measure、draw 就是 责任链模式
  • aidl 代理模式
  • ListView、Gridview 等 使用的适配器模式

以上内容参考自简书上的文章

5、android的事件分发

6、android的消息机制

7、LeakCanary

8、讲个android的源码 自选

9、hashcode 与 equals理解

10、设计模式讲讲有什么认识的,代理模式优缺点

点击看答案

代理模式优点:

  • 协调调用者和被调用者,降低耦合度
  • 增强被调用者的功能。增加和更换代理无需修改被调用者源码,如何开闭原则,具有良好的可扩展性。
  • 保护目标对象

缺点:

  • 增加了类
  • 速度可能慢。在调用者和被调用者之间增加了代理对象,因此请求处理的速度可能会变慢
  • 增加系统复杂度。实现代理模式需要额外的工作,有些可能还比较复杂,比如远程代理。

以上内容参考自简书上的博客

10、图片 缓存机制

11、首屏调优 内存调优

lazada

1、自我介绍一下

2、app网络防劫持 介绍下,出现劫持,解决方案呢?拦截了webview 网络请求后,用什么请求

3、性能优化,做了哪些工作

4、强引用、弱引用和软引用。弱引用和软引用的区别。

5、MVC 和 MVP 的区别。他们各个层次之间交互有什么区别

6、SharedPreference 是线程/进程 安全的吗?apply 和 commit 有什么区别?(提交到哪?是本地的xml 还是 内存的xml?),有什么坑?

7、Handler 机制说一下? 消息延迟是怎么做到的?我有个新消息,在已有的消息队列中我想让他先执行,可以吗。

8、最有挑战的项目?你负责做了什么?给公司带来什么价值?,这个sdk给你们的产品带来什么价值?如何判断你这个sdk是否好用?你们的业务成功率是多少,有统计吗?如果要设计这个监控这个sdk?你们有相关的埋点吗?感觉面试官隐约对app的监控感兴趣。

点击看答案
  1. 被动式,大致就是 APM 监控启动时间、ANR、卡顿、崩溃等,这几种监控手段在灰度以及线上都发挥作用,性能上进行监控主要依赖自动化,自动化测试能发现超过一半的性能问题,业务上进行监控便主要是通过埋点进行统计,加上业务失败率告警,以上都要对各种失败率有一个明确的界定 比如崩溃率不超过万三这样

  2. 主动式,提供反馈渠道,对用户的反馈有一套完整的流程体系,对业务进行分发,反馈能及时与用户沟通,用户也能看到反馈的状态

  3. 防劣化手段, 比如关键api hook 统计耗时, 针对性使用框架 (leakcanary这些)

9、http 和 http2 有什么区别。

10、http 和 https 有什么区别。告诉我它是怎么做到安全的呢?

11、kotlin 语言与java 语言相比有什么优点吗?

12、kotlin 的协程了解吗?它的原理?协程相比线程创建的开销小一些?主线程使用协程是不是不会阻塞?假设我在主线程里面使用协程执行非常耗时的操作,我的主线程会ANR吗?为什么在io操作比较多的时候对协程有利呢?协程有自己的栈空间吗?

BD

1、线程同步方法(关键字,并发包)

2、wait/notify,notify方法和notifyAll方法区别,notifyAll方法唤醒的线程,怎么决定哪一个线程得到运行

3、HashMap(要很熟悉),put过程,get过程

4、现在key为double类型,需要将key的整数部分当成同一个key应该怎么做(提示:重写方法)

5、内存泄露分析

6、进程间通信方式(别忘了BroadcastReceiver)

7、A跳转到B的生命周期调用,如果A的onStop方法方法发生在B的onResume方法之前会发生什么现象,如果B是singleTask又是什么情况?会调用B的哪些方法

8、service运行在什么线程

9、Handler内存泄露原理(message.target = handler,所以真正原因是由于message造成的),解决方法,一个线程可以有多个Handler吗。

10、handler的sendMessage方法和postRunable方法区别

11、HandlerThread

12、设计一个图片加载框架,LRUCache原理

13、看过第三方库的源码吗

14、排序算法,时间复杂度,快排为什么是NlogN

15、完全二叉树高度

16、弱引用和软引用

17、今天面到的题目新的部分有几个 1include merge viewstub区别 2二叉树第n层节点个数 3touchdelegate

BD

1、http状态码

2、onTouch、onTouchEvent、onClick 执行顺序

3、onclick 不响应,如何排查

4、设计一个下载框架(考虑多线程)。

5、单进程中,一个线程下载和用两个线程下载哪个更快?

点击看答案

决定用户下载大文件速度快慢的终极因素,在于用户下载进程实时抢占网络带宽的大小。其它的因素与它相比,可以忽略不计。任意一个与互联网通信的进程,理论上都有一个实时最大可用带宽,这是客观存在,不以用户意志为转移。 如果 用户进程实时抢占的带宽 = 实时网络可用带宽 那是最最理想的,用户进程100%利用网络带宽,无论进程(Process)是单线程(Thread)的还是多线程的,下载速度几乎没有任何区别。

参考: 为什么下载大文件时多线程比单线程速度更快?

6、在主线程要优先执行一个任务咋办?除了消息栅栏外还有其他方法吗?Thread.join,还有吗?如何发送消息栅栏,这是hide方法,自己如何发送异步消息。

点击看答案

可以参考 提高Handler发送消息的优先级
postAtFrontOfQueue、sendMessageAtFrontOfQueue

7、空闲的时候执行某个任务有什么方法?IdleHandler,还有其他方式吗

8、IntentService 与 Service 区别,啥时候用IntentService

9、synchronized 锁优化策略

10、线程安全的集合有哪些?CopyOnWriteList 在什么时候使用?HashTable 与 ConcurrentHashMap 的区别?

11、线程池的拒绝策略有哪些?

12、什么情况下singleTask 在一个进程中会有两个实例? NEW_TASK

13、A启动B,B启动C,C启动D,现在从D启动A,并且启动完成后只保留A,如何做?

14、Okhttp 的 addInteceptor 与 addNetWorkInterceptor 的区别

15、如何保证dns的安全?自己建立dns服务器,httpdns

16、做sdk的话,如何在接入的时候管理第三方依赖

17、设计模式,整体和部分

18、Okhttp 多个host,如何配置

TX

a启动b,b启动c,c再启动d,这时候直接回到a页面,并且只保留a页面,有啥方法?

okhttp多个host,多重配置

异步创建view的原理

如何插桩

哪些地方匿名共享内存:堆,contentprovider,显示的时候

sp原理

事件分发

hashtable concurrentHashMap

TX

1、了解插件化吗?有哪些第三方开源的方案?Tinker的原理

2、行业内性能优化的方案有了解吗?页面如何秒开?

3、串行GC的时候,会锁住堆挂起线程,那么无论线程处于什么状态都能挂起吗?

4、多线程中的同步队列与等待队列(可能问的是 同步队列和条件队列)

5、CAS是啥?AQS是啥可以参考这里?RetraintLock的原理

6、锁的种类,什么是可重入锁

7、如何让多个线程同时启动

8、Java内存空间怎么划分

9、有哪些GC算法,哪些对象可以作为GC Root

10、JNI 中,Env是啥,它能干什么

11、什么情况下本地方法栈会引用Java对象

12、HashMap原理

13、Android系统的启动流程,应用为什么用zygote来fork,有什么好处

14、Apk的签名原理,v1和v2

15、https相比http的优势是什么?除了安全之外呢?证书如何校验

16、Java的堆与栈的区别,除了存储的对象不一样之外,还有其他不一样么?

17、进程间通信为什么用Binder,Binder的原理?空间大小限制(同步调用是1M - 8k ,异步oneway 就要(1M - 8k)/2 )?

18、可重入锁是什么?悲观锁和乐观锁的区别?

19、什么时候用到TCP,什么时候用到UDP?举例

20、https的攻击手段,https的证书是如何发送给客户端的?

21、RecyclerView和ListView的区别

BD

handler,IdleHandler原理,使用

组件化,插件化,热修复

断点续传

用过哪些开源库?retrofit的原理

反转二叉树

做了哪些优化?gpu优化?

hashmap原理,如何hash?为什么8个的时候要红黑树?

a启动b生命周期怎么走

gc算法,哪些可以作为gc root,分代算法是怎样的?

volatile关键字作用?能保证原子性吗?

webview内存泄露的原理,handler内存泄露原理

如何发现内存泄露?LeakCanary的原理是什么?

Activity的启动模式

taskaffinity的作用?

进程间通信方式有哪些?AIDL能传递的数据类型有哪些?AIDL怎么使用?AIDL的方法参数能传接口吗?都跨进程干什么

app崩溃率多少?怎么统计的?能捕捉所有异常吗?如何捕捉native的崩溃?

动态代理

TX

relativelayout与constrantlayout(可以参考链接:https://mp.weixin.qq.com/s/gGR2itbY7hh9fo61SxaMQQ)

如何查看cursor之类的导致内存泄露问题

onclick,onTouch执行顺序

算法:链表的中间元素,判断链表是否有环,快排最好最差时间复杂度,快排是怎么操作的

TX3 面试

近期有做什么优化或者重大技术?
DNS污染是怎么回事
https的证书是怎么起作用的?
用什么检测内存泄漏-LeakCanary
扫码登录是怎么做到的
多线程用过吗,乐观锁与悲观锁说下

TX1

String可以继承吗?为什么?为什么设计成不可变?
快排原理
二分查找原理
Activity的几种启动方式,Service中怎么启动Activity(参考链接:https://blog.csdn.net/fang323619/article/details/74388804),从源码角度来说,ActivityManager 为什么会对4种tag做处理

事件传递的机制(触摸事件)?Activity 的顶级响应视图是啥?onTouchListener 与onClickListener 哪个先执行(onTouchListener)?onTouchListener 返回true 之后,onClickListener 还会执行吗(不会)?onTouchListener 和 onLongClick 哪个先执行?

View的绘制流程?从掉帧的角度来说下 View 的绘制流程?
ScrollView 嵌套滑动冲突怎么去解决?在父view的up里面return 了true,子view会收到down事件吗?
tcp与udp区别,tcp三次握手做了什么
单例模式怎么写,为什么
大图一般是怎么优化的?fresco的源码有看过吗,它有什么缺点?有没有用过其他的图片框架?

点击看答案 1. 将适合 UI 组件展示的图片尺寸加载到内存中,而不是使用原图。 2. 将BitmapFactory.Options 设置 inJustDecodeBounds 属性设置为 true,可以在解码时避免内存的分配,从而避免将原图加载到内存,而是将缩略图直接加载到内存。 3. 在 Android 中,我们常见的一些颜色设置,都是 RGB 色彩模式来描述像素颜色的,并且他们都带有透明度通道,也就是所谓的 ARGB。 4. Android 中的图片在加载时,默认的色彩格式是 ARGB_8888,也就是每个像素占用 4 个字节空间。我们需要针对不同的应用场景做不同的处理,大图和小图可以采用不同的解码率(也就是设置不同的色彩格式)以优化图片内存的使用。 5. 当存应用中存在大量图片时,使用缓存,可以有效的提高内存的使用率以及用户体验。 6. LruCache 类特别适合用来缓存 Bitmap,它使用一个强引用的 LinkedHashMap 保存最近引用的对象,并且在缓存超出设定大小时,删除最近最少使用的对象。 7. 磁盘缓存可以用来保存那些已经处理过的 Bitmap,它还可以减少那些不再内存缓存中的 Bitmap 的加载次数。当然从磁盘读取图片会比从内存要慢,而且由于磁盘读取操作时间是不可预期的,读取操作需要在后台线程中处理。 8. 内存缓存的检查是可以在 UI 线程中进行的,磁盘缓存的检查需要在后台线程中处理。磁盘操作永远都不应该在 UI 线程中发生。当图片处理完成后,Bitmap 需要添加到内存缓存与磁盘缓存中,方便之后的使用。 9. Fragment 具有属性 retainInstance,默认值为 false,当设备旋转时,fragment 会随托管 activity 一起销毁并重建。调用 setRetainInstance(true) 方法可保留 fragment,已保留的 fragment 不会随着 activity 一起被销毁,它会一直保留(进程不消亡的前提下),并在需要时原封不动地传递给新的 Activity。另外,Fragment 中定义了isAdded 接口,用于判断 Fragment 是否已经绑定到某个 Activity。 10. Android 图片使用的对象最终都是用 Bitmap 来创建并存储的。在不同的 Android 版本中,Bitmap 或多或少都存在差异,尤其是在其内存分配上,针对于不同的 Android 版本,Bitmap 的推荐的内存管理策略也会存在一些差异。 11. 在Android 2.3.3 (API level 10)以及之前, 一个 Bitmap 的像素数据是存放在 Native 内存空间中的。这些数据与 Bitmap 对象本身是隔离的,Bitmap 本身被存放在 Dalvik 堆中。并且无法预测在 Native 内存中的像素级数据何时会被释放,这意味着程序容易超过它的内存限制并且崩溃。 12. 自 Android 3.0 (API Level 11)开始,像素数据则是与 Bitmap 本身一起存放在 Dalvik 堆中。 13. Android 8.0(Android O)及之后的版本中,Bitmap 的像素数据的内存分配又回到了 Native 层,它是在 Native 堆空间进行分配的。 14. 尽量减少 PNG 图片的大小是 Android 里面很重要的一条规范。相比起 JPEG,PNG 能够提供更加清晰无损的图片,但是 PNG 格式的图片会更大,占用更多的磁盘空间。推荐使用 Webp 格式的图片。 15. 我们可以利用 inBitmap 这个属性来提升 bitmap 的循环效率。使用 inBitmap 属性可以告知 Bitmap 解码器去尝试使用已经存在的内存区域,新解码的 bitmap 会尝试去使用之前那张 bitmap 在 heap 中所占据的像素数据内存区域,而不是去问内存重新申请一块区域来存放 bitmap。利用这种特性,即使是上千张的图片,也只会仅仅只需要占用屏幕所能够显示的图片数量的内存大小。 16. 使用压缩工具对图片进行二次压缩。 17. 根据最终图片是否需要透明度展示,优先选择不透明的图片格式,例如,我们应该避免使用 png 格式的图片。 18. 对于色彩简单,例如,一些背景之类的图片,可以选择使用布局文件来定义(矢量图),这样就会非常节省内存了。 19. 大图: BitmapRegionDecoder 展示部分

参考: CSDN的博客

Activitymanagerservice 源码
知道哪些app性能优化

lazada

自我介绍
性能优化做了哪些工作
四种引用的含义
mvp 与 mvc 区别
Handler 机制,如何实现消息延迟
最有挑战的项目,负责做了什么
业务监控怎么设计
http与http2的区别
http与https的区别
kotlin语言与java的区别,优点
kotlin的协程原理,有自己的栈空间吗,与线程区别

英语自我介绍下?–妥妥挂了。。

猫总

为什么不用URLConnection而用OKHttp不了解

qq的music

自我介绍下
性能优化的经验
如何设计措施,防止以后新人在主线程添加太多的任务
了解过启动框架吗
如何分阶段启动相关任务,这些任务有相互依赖,或者有向无关图
能达到什么效果,量化下
内存优化的内容
webp 占用内存小一些还是尺寸小一些?
图片框架本来就会做这些裁剪之类的功能,这样自己做是否就重复了
其它内存优化的点(我觉得可以说说大图加载,只加载一部分)
了解ashmem 吗,除了这个作用还能有其他作用吗
优化app的整体内存占用
第一步得分析吧。profile 工具
第二步、分析问题在哪,native 和 Java 层 的内存占用,如果native 和 Java 中图片占用都比较大,如何分析
第三步、是内存泄漏导致的、还是大数组、大对象

用LRU 的话,一般不会引起内存很大占用,所以如果内存大,一般是内存泄漏导致的

Talkingdata 统计些什么

监控dns的成功率,即用户使用你的ip直接请求的成功率了,以前系统直接解析,现在是用户直接打不开

尝试使用https 去解决吗

网络成功率怎么优化

dark 和 art 的 gc 过程有了解吗

非并行 GC 的过程

分配内存,不够,然后做什么操作,最后就会分配成功。分配不够的话,系统会扩容,扩容发生在什么时机

常用设计模式,单例模式怎么写

volatile :

性能优化了解不太多,尤其内存优化总结不多,数据量化

BD

Fresco 架构上说下,MVC模式,说说 Fresco加载gift的流程和原理
4. 一个大的ViewGroup,上面显示两个不一样大小的图片,内容一样,怎么做(利用Fresco的缓存)
5. 一个图片是50 * 50,一个图片是100 * 100,内存大小是怎样的,比如 5050的内存大小是1,100100的内存大小是多少? 两张图片,内存变大了还是不变,内存副本有几份?
6. RecyclerView 滑动的时候,缓存机制
7. RecyclerView 下面一个子item,我手指按在RecylerView上,然后滑动,说出滑动过程
8. 海量数据中找出TOP N(堆)
9. 自定义帧动画机制,一边解压一边加载,用完之后回收,inBitmap进行内存复用。用了哪些数据结构,如何保证按顺序执行。
10. bitmap drawable 区别(互相转化,drawable包含bitmap)Bitmap是Drawable . Drawable不一定是Bitmap Drawable在内存占用和绘制速度这两个非常关键的点上胜过Bitmap

1、 jni 方法调用是怎么实现之类的
2、 java string 和 c++ string 有什么区之类的
3、 自己做的项目上遇到的技术难题和解决方案
4、 消息队列

看点1

React Native了解它的实现原理吗?除了组件映射,还有更深的理解吗?
Android哪一块比较熟比较擅长,聊聊?
可以给子线程创建消息队列吗?看过消息队列的底层原理吗?对,Native层的代码
Android里面什么是ANR?遇到ANR怎么排查?
硬件加速和非硬件加速有什么区别?
HARDWARE_LAYER 与 SOFT_LAYER 分别代表什么意思?
UI性能相关性能的优化有没有做过?比如一个列表滑动很卡顿,怎么优化?如何查看占用内存和cpu?GC怎么会影响性能?有什么手段可以降低布局层级?
Recyclerview与Listview的缓存原理?不同类型的item他们怎样缓存?
Android内存怎么优化?什么是内存泄漏?什么情况会出现内存泄漏?实际中举个例子?Handler为什么会泄漏Activity?
图片展示比较多的App,怎么解决内存占用问题?用了什么图片框架?为什么Fresco 在5.0以下具有优势?Fresco的实现原理,大概流程是怎样的?

内存中未解码图片是啥样?
怎样为图片框架设置内存缓存策略?怎么决定淘汰哪些内存?
还有没有了解其他图片框架吗?
怎样尽量降低位图占用的空间大小?
图片列表,怎么优化性能?
视频播放相关的经验有吗?播放器用的是什么?videoView用的是哪个?TextureView 和 SurfaceView 有什么区别?哪个性能更好?为什么?这两个view和Android中普通的view有什么区别?使用方式有什么区别?

SurfaceTexture,TextureView区别

我们知道,一般Activity 包含多个View,他们组成树状结构,但是只有顶层的 DecorView 才是对 WMS 可见的,它在 WMS 中有一个对应的 WindowState ,相应地,在 SF中对应 Layer。

而SurfaceView 继承自 View,因此本质上是个View,但是它有自己的Surface,这个 Surface 在 WMS 中有对应自己的 WindowState ,在 SF 中也会有自己的 Layer。如下图所示:

SurfaceView示意

这样,虽然SurfaceView 仍然在 View 目录树中,但是其实它与主窗口是分离的,这个的好处就是这个surface的渲染可以放到单独的线程去做,渲染时,而已有自己的GL context,这对于游戏、视频等性能相关的应用非常有益,因为它不会影响主线程的响应。但是同样也有缺点:因为它有自己的Surface ,所以它不受view的属性控制,因此不能进行平移、缩放等变换以及动画

而 TextureView 在View 也继承自View,在目录树中以普通的View存在,因此支持旋转、缩放 以及动画,但是 TextureView 必须只能在支持硬件加速 的窗口中,它对draw方法进行了重载,把收到的数据作为纹理更新到对应的HardwareLayer 中

看不大懂,参考资料CSDN

你觉得视频播放怎么优化视频首帧加载速度?有看过Exoplayer的实现吗?它的解码过程和原理?
FFmpeg有了解过吗?
有做过C/C++之类的开发吗?大概是个多大的代码量?
有用过OpenGL吗?
对Android的组件化有了解多少?了解Android的热修复吗?热修复的原理是什么?
https怎么实现安全的?https的握手比http的握手多了几个RTT ?
http 1.0 、2.0、3.0 之间的区别?http3.0 最大的优势?
其他看过的第三方开源的框架?

TX MUSIC

单例怎么写呢?volatile关键字在这里面的作用。如果我不需要懒加载,什么时候不需要做懒加载?

关于单例的饿汉和懒汉加载模式,目前知道的一个答案就是:类中还有其他静态方法或变量时,饿汉模式才有优势,此时可以通过访问任一静态成员来实例化对象,这缘于首次访问静态成员会引发类的加载,而类加载时会初始化静态变量,具体可以参考别人的提问

用过反射吗?App发布的时候,需要混淆的,混淆对反射有什么影响?有没有用过Gson,有什么功能?知道它的工作原理吗?怎么知道类的成员变量的名字?我是一个泛型,我是一个List,类型是String,反射能不能拿到泛型的数据?泛型你知道有上界和下界这个东西?他们有什么用?

sharedpreference 的apply 和commit有什么区别?apply什么时候同步到磁盘上去(pause和广播,跟广播有啥关系?)?apply是异步的对吧?

有接触过插件化?插件化的原理是什么?怎么欺骗系统。

handler的工作原理?如何移除消息屏障?handler怎么导致的内存泄漏?

防止二次打包,是怎么做的?现在拿到一个包,想二次打包,而如果他做了二次打包的验证,你怎么绕过?我拿了别人的库,别人会校验签名,如果我想用这个库,怎么弄?你们的签名验证怎么做的?

kotlin印象深刻的特性,举例一下?异步的代码写成同步,怎么写?怎么做到异步能写成同步的?正常来讲,我们是从上往下执行的,为毛它可以在中途切线程?怎么做到让出线程使用权限呢?但是如果是使用Java的wait、notify会阻塞,但是kotlin不会啊,咋做的?用kotlin从子线程切换到主线程,怎么做?GlobalScop 有什么不好的点吗?kotlin的空安全了解么?在定义变量的时候,就指定是否可以为空,你觉得这样好不好?lateinit的作用是啥?什么情况比较适合使用 lateinit?

如果 lateinit 和 lazy 对比,lateinit 只用于变量var,而 layzy 只用于常量val,一般用于单例在变量第一次调用时才执行。其次,基于我个人的理解,lateinit 适用的场景是你不想指定一个变量为可空类型,但是又得在稍后(或者得等到满足某个参数时,假如RecyclerView的Adapter对象,可能得等到某个callback 初始化之后,才能作为参数来new 这个Adapter)才能初始化的那种变量。以上参考简书的博客

https怎么做到安全?https的流程?怎么校验证书?你是说自己也计算一遍对吧?服务端发证书给你,中途被我换了,客户端能不能发现被换了?用我自己的私钥签名了,客户端如何发现的?证书链怎么验证?我做了个代理,做了个中间人攻击,一般我能听别人https的内容,为什么我能做到呢?你们本地https的证书校验的证书从哪里来?那你获取证书这部分我是不是可以中间人攻击,你们发的是tcp包还是http包?http包那你们也还是会有明文,就会有漏洞。对称加密的密钥是怎么生成的?为什么需要客户端和服务端一起作用来生成?为什么后面需要使用对称加密来做?

知道DNS会有劫持吗?你们的情况不一定是dns劫持,可能是别人直接把你们的Http包给替换了?httpDNS 有什么好处?-更科学地翻译成ip,深圳访问不会被分配到北京。

数组,找到数组里面第一个重复的数字,怎么做?HashSet去做时间复杂度多少?意思是遍历一次就行了是吧?

如果App出现了频繁的GC,怎么排查?怎么排查有没有内存泄漏的?-leakcanary ,如果在IDE里面使用工具呢?如果我想看哪些对象被频繁申请,怎么搞?

看起来面试官想要说出MAT,可以参考下别人的博客。但是其实目前已经无需MAT就能直接在AS里面操作了

BD

挑一个比较有价值的项目聊聊?500彩票,那聊一聊做了哪些事情?模块化和mvp讲讲,mvp有什么优缺点?-MVP类增加了,寻找逻辑没那么直接。有没有做成组件化的形式吗,打包成aar之类的发布?

插件化讲一讲?打包怎么办?插件用到宿主的资源咋办?怎么识别类,是将dex添加到dexlist中还是自定义 ClassLoader ?启动service、广播、ContentProvider?Activity去hook它的mCallback,但是假如高版本的时候不让你去反射咋办?宿主里面的类更新了,插件版本没有更新,这情况咋办?

讲一下handler吧?

用过哪些第三方组件,开源库?网络库用的啥?用过github上哪些轮子啊?okhttp源码有看过吗?他有很多拦截器,他是怎么弄的输入输出?

注解有用过吗?除了用来替代枚举外还在哪里用过吗?

写个算法题:单向链表,自己去定义结点,他有个值,还有个next指向下一个。我们输入两个这种链表,找到他们第一个公共节点返回,没有的话,返回null 。

BD二

做了哪些非业务的工作?所理解的网络劫持是什么样的?怎么发现网络劫持和预防?https可以解决DNS劫持问题吗?如果要篡改http可以在哪些环节篡改?你觉得谁会来篡改你们的App网络报文?https为什么可以保证不被篡改?介绍下Https的流程?我们要分析https的请求的话,可以怎么做吗?App又怎么去防这种事情呢?服务端拉取证书怎么保证安全呢?-ip直连去拉取证书。量很大的情况下,都通过ip去获取证书的话,服务端会不会扛不住?如果ip挂了,或者运营商给你封了,那你怎么办?-内置证书,防止重打包 。做了一些安全方面的事情,是哪些?为什么App签名本地校验是防君子不能防小人?

sp做加密,出于什么目的?别人怎么读到你的sp存储的内容?哪些存储的内容需要加密?sp写的时候加密以及读的时候需要解密,这个性能会有影响吗?业界有没有好的方案来解决Sp吗?-替代方案是MMKV 。MMKV 是如何解决跨进程问题?为什么SP跨进程是不好的?

性能上做了一些优化,做了哪些事情?App启动优化做了哪些事情?内存优化主要做了什么?hashmap 换成arrayMap 等会有多大的收益?这个内存收益怎么衡量?-启动App进入到彩票购彩页面。防止内存泄漏怎么去做的?线上如果要做一些这样的监控怎么做?-talkingdata 。 它的原理有去了解吗?内存泄漏经常会OOM,这种OOM怎么在线上怎么监控?-发生的时候,dump内存信息上传分析。更详细的没有去了解是吧?

算法题目:给定一个字符串S,返回 反转后的 字符串。反转的规则:其中不是字母的字符都保留在原地,而所有字母的位置发生反转。

例如: 输入:”ab-cd” 输出:”dc-ba”
输入:”a-bC-dEf-ghIj” 输出:”j-Ih-gfE-dCba”

BD

视频播放采用什么播放器?视频播放首帧优化?有其他方式来优化视频播放,比如卡顿等体验?视频播放碰到过什么问题?

选择SurfaceView还是TextureView ?视频有做过加密吗?视频地址是固定的吗?

视频格式了解吗?分辨率、帧率、码率 都是什么含义?

git 的merge 和 rebase 有什么区别?代码从本地到远端是怎么流转的,比如我新建一个文件,怎么到远端的?

性能优化做了哪些内容?

json解析耗时几百毫秒,是怎么统计到的?systrace 用过吗?

不重要的任务是怎么去初始化的?

用过线程池吗?对线程的管控怎么搞?如果有人在代码中直接去new Thread,这个怎么管控?

RxJava里面线程池的线程有限制吗?RxJava的原理有多少?RxJava的线程切换怎么实现的?RxJava是怎么切换的线程,比如他observeOn 和 subScribeOn 这两个操作符?这两个操作符有什么区别?多次调用他们会多次生效吗?为什么不能多次生效?

协程的原理?同样作为操作线程的工具,它和RxJava的本质区别是什么?与RxJava比较还有没有别的优势?kotlin的作用域函数apply、also等,怎么确定什么时候用什么?

图片规范的方式去使用,怎么规范?

fresco 有几级缓存?

组件化怎么弄的?组件化做到什么程度?

module之间怎么通信?除了基础module,其他的module A 想要和 module B 通信,A启动B里面的一个页面?

为什么选择MVP?P层可能会无线膨胀,有没有什么解决办法

最近jetpack的组件有没有了解?

如何设计一个组件化的app
View的绘制流程
activity的启动模式
如何监控启动就crash的问题
如何独立编译单独的组件
对比一下图片加载模块,Glide 和Fresco , AsyncImageView

主要还是通过项目发散开的问题:
1,android开发中常见的两种序列化,serializeble 和 parcelable 的区别
2,recyleview中的常见卡顿问题是如何解决的,如何监控到用户的卡顿(监控UI线程的message 处理逻辑,超过60ms)
3,项目比较大,编译比较慢的解决办法(插件化,组件化)
4,项目中遇到的一个小问题,是如何解决的
5,OOM类型的问题如何解决
6,内存泄漏如何监

Android so如何减包
Android Camera采集渲染流程
如何排序一个比内存大的文件

C++ 父类析构函数的virtual作用,怎么实现防止内存泄漏的
C++ 虚函数表是什么
JNI的attachCurrentThread作用是什么
JNI的LocalRef和GlobalRef new了是否要delete,可以不delete么?
简单介绍下libuv

BD3

http与https的差异有多少?https这个安全层是怎么做的,怎么保证安全的?非对称加密是在哪里使用?数字证书除了公钥之外还有其他的吗?数字证书和数字签名有什么关系?验证双方身份的时候,用了个什么结构,比如说,我发了个信息给你,怎么验证是我发给你的?是在https建立后,使用对称加密之后,如何验证双方的身份?

http与https的区别,参考自己以前写的博客-(要记得同步回博客中)

  • scheme不一样,一个是http,一个是https
  • Https是ssl加密传输,Http是明文传输
  • Https是使用端口443,而Http使用80
  • HttpsSSL+HTTP协议构建的可进行加密传输、身份认证的网络协议要比Http协议安全
  • Https协议需要到CA申请证书

列举下自己所知道的http的状态码?

1开头表示临时响应,还需要继续操作

2开头表示成功

3开头表示重定向,301表示永久移动,302表示临时移动

4开头表示请求错误,比如:400表示服务器不理解请求语法,403表示禁止访问,404未找到

5表示服务端错误,比如:500服务器内部错误、502错误网关、503表示 服务不可用,维护或者超载了

get和post方法之间有多少差异?get不会对后台数据进行修改,post会修改?

按照REST规范来说的话,get就是获取资源,不会有副作用,也就是这个操作是幂等的;post就是创建资源的意思,这个就不是幂等的。此外,put的含义就是replace,就是用来修改元素;delete就是用来删除。

但是如果,纯粹说http的话,这个就很宽泛了,我们说get不能有body、get是幂等、post有body、post不是幂等,这些规则都是可以被打破的,比如,post的参数可以放在queryString里、header里,当然也能放在body里,当然也可以每个部分放一点;get也能做成等非幂等的,甚至于,我们在日常使用的时候,post都能做成幂等,这就要求后台判断重复订单了。

以上文章参考自知乎上的文章(要记得同步回博客中)

TCP 下的流量控制的核心内容?-本质是不要把对方buffer打爆 。 对方已经很拥堵了,怎么控制呢?

java中静态方法能调用非静态方法吗?我从类对象角度讲的,但面试官感觉是要求从类加载的角度讲。

因为静态方法属于类,在类加载的时候,就被加载到方法区了,因此在类没有创建对象的时候后也是可以调用的。而非静态方法则得在类创建对象之后才存在。因此并不能这样调用。内容可以参考csdn的博客

Java中,有多层for循环,有个场景需要在最里面的for循环中跳出多个for循环继续执行下面的代码,怎么搞?

1
2
3
4
5
6
7
8
9
10
11
12
//比较简单的解决方案是:
public static void main(String[] args) {
loop: for(int i =0;i< 5;i++) {
for(int j = 0;j < 4;j++) {
if(j == 1) {
break loop;
}
}
}
}

//可以参考[博客园](https://www.cnblogs.com/fastfn/p/9777067.html)

创建fragment的时候,为什么官方不推荐构造方法,而要通过setArguments的方式?-为了考虑恢复。 了解到什么时候会有这种恢复的场景?-从前一个Activity返回到当前Activity。 Fragment 的两个adapter, 一个是 fragmentpageAdapter ,一个是 fragmentpageStateAdapter,他俩有什么区别?

FragmentPagerAdapter与FragmentStatePagerAdapter的区别:
FragmentPagerAdapter拥有自己的缓存策略,当和ViewPager配合使用的时候,会缓存当前Fragment以及左边一个、右边一个,一共三个Fragment对象;在每次切换页面的时候,是将fragment进行分离(transaction.detach),适合页面较少的fragment使用以保存一些内存,对系统内存不会有多大影响

FragmentStatePagerAdapter是PagerAdapter的子类,这个适配器对实现多个Fragment界面的滑动是非常有用的。当Fragment对用户不可见的时候,整个Fragment会被销毁(transaction.remove),只会保存Fragment的保存状态

参考刘强的博客赵凯强的博客

MeasureSpac 里面有三种模式,解释下?

参考以前写的面试题目第3题

handler的post和sendMessage有什么区别?-post是runnable,send是message,post的runnable最终会封装成 message,并且what默认为1,——面试官看起来不满足这个解释。

使用send时,由于是我们自己创建的Message,所以我们最终在handleMessage 方法中switch-case来处理Message。

使用post的方式时,我们post过去的是一个runnable,在post方法中,会创建一个 Message,并且将这个runnable赋值给Message的callback字段。之后通过 sendMessageDelay(msg,0) 来实现。

而我们知道,在Handler的dispatchMessage方法中,会首先判断msg.callback == null,如果不为null的话,就直接执行 msg.callback.run() 了;如果为null,则会判断 handler的mCallback字段是否为null,不null的话,直接调用 mCallback.handleMessage(msg) 将当前msg给处理了,并且直接return回去了;如果以上条件都不满足,则会调用我们通常覆写的 handleMessage() 方法,交由我们自己处理。

上面内容主要是看系统源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public final boolean post(@NonNull Runnable r) {
return sendMessageDelayed(getPostMessage(r), 0);
}


private static Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
}


public void dispatchMessage(@NonNull Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}

算法:

给出两个有序的整数数组 imgimg,请将数组 img合并到数组 img中,变成一个有序的数组
注意:
可以假设 img数组有足够的空间存放 img数组的元素, imgimg中初始的元素数目分别为 imgimg

TX1

全程参与的项目有哪几个?

项目里面哪个对你成长帮助比较大,收获比较大?

遇到什么问题?为什么想着优化H5?如何优化H5页面的打开速度?是预创建 WebView 是吧?

项目中碰到什么难点,以及是怎么去攻克它的?

如果插件化要做好兼容性,应该怎么做?

如何保证App的安全?

有用 Service 开发吗?

你们的跨进程通信用的什么方式?你知道有哪些跨进程通信方式?这些跨进程通信方式各有什么优势或者特点,他们之间的差异是什么?

介绍下APK的启动过程——描述下进程启动、应用启动?启动过程哪些过程可能产生ANR ?

Apk 中有一些第三方的包 Jar,在应用启动过程中,这些 Jar 是怎么链接起来的 ?——Android会把这些 jar 打包成 dex , 那么这些 dex 是什么时候加载呢?

类似抖音功能遇到了什么难点?怎么解决的?——播放错乱,咋解决?

Android的源码看过多少?有编译过Android的源码吗?

adb命令会吗?我想查看手机的剩余电量,怎么拿? Linux的一些命令呢?root 和 Hook 了解多少?

NDK 开发有吗?

主要开发语言,Java 、Kotlin ?

ART 知道吗?与 Dalvik 的区别?GC有什么不同?

如果让你一个人开发App,能 Cover 住吗?

有做单元测试吗?

ALi

Java集合类有哪些?有什么特点? ArrayList、LinkedList、HashMap?

ConcurrentHashMap是线程安全?它是怎么实现线程安全的?

Java的线程有哪些状态?创建线程,调用它的start() 方法,这时候它处于什么状态?

Java 中处理多线程并发的方法有哪些?Synchronize 在底层是怎么保证加锁成功?Volatile 主要用在什么场景?

是否有用过 ThreadLocal ?看 Handler 源码时看过

线程的集中管理会用到线程池,有哪些比较关键的参数?

Activity声明周期?Activity A 到 Activity B ,二者经历的生命周期是怎样的?启动模式介绍下?日常开发时,有没有碰到要用某种启动模式的?

是否有多进程的场景?——做小程序的时候

Handler 的机制简单说一下?子线程发送消息,如何流转到主线程的?

讲下 View 的主要绘制流程?多层 View 和 Layout,怎么把这些操作传递下去吗?ViewRootImpl 有了解吗?

涉及到多进程的话,如何进行多进程间的通信?Messager 主要用在什么场景? AIDL 主要用在什么场景?Binder 的基本原理?为什么要引入Binder ,不用 Linux 的?

性能优化,页面秒开是从哪些方面做的?发现性能会有问题才做性能优化吧?是怎么分析性能?怎么检测内存泄漏?LeakCanary的原理?后来有没有思考有没有哪些内容可以做得更好?最耗时的点是啥,怎么去优化的?

做过小程序的开发,你们的小程序是自研的吗?有哪些权限限制?

RN的了解?

dayuwuxian

在目前所在公司主要负责什么?

为什么要重构网络框架?重构后有什么亮点?

网关不让用。并发token设计、数据解析 adapter 设计、日志系统设计。

OkHttp 里面有哪些比较关键的设计让你觉得挺好的?线程池为什么要这样设计?它有哪些 intercetor ,分别是什么含义 ?这些 interceptor 执行的顺序是什么?

网络防劫持是怎么做的?

设计一个类,有add、remove、dispatch 这 3 个方法,其中add 表示将 listener 添加进来, remove 表示将 listener 移除,dispatch 方法表示遍历目前的listener ,然后调用每个 listener 的 invoke 方法,请问这个类怎么设计?

设计的APM上线了吗,完成度怎么样?为什么要设计这么个APM ?怎么收集卡顿、ANR 呢?

有用kotlin吗?kotlin的 lazy 是怎么实现的?-有很多中模式。这些模式的原理是什么,比如Synchronize 模式的原理是什么?用过协程吗?

有用过 JetPack 吗?用过哪些?

https证书防抓包的原理是什么?证书是双向验证还是单向验证?破解包了替换掉证书还能不能行?怎么更新从后台下载来的证书?怎么做的?

https的请求过程是什么样的,与http有什么区别?

一大堆无序的数字,取出前k个最小的数字

道通科技

Kotlin的扩展函数的原理是什么?扩展函数 inline ?

了解 WebSocket 吗?自己用过 Socket 吗?

用过 NDK 吗? Android 中的 JNI 是怎么使用的?(使用 CMake)

极鑫科技

OkHttp 自带的那些 interceptor 是否可以换位置?

为什么要用 Builder (参数比较多的情况),那我用 set 不行吗?为什么要 Builder ?

说下 AMS

了解 PKMS 吗?

用过 RxJava 吗?怎么切换线程的?

文件下载实现,切片、断点续传

为什么要使用线程池

小算科技

Surface、Canvas 有了解吗? SurfaceFlinger 呢?

你开发的 SDK 如何防止别人调用你未公开的逻辑?

你们的广告是使用新进程吗?有做过进程保活吗?开启多进程能提升运行效率吗?(能,GC间隔长了,更多对象能在年轻代回收了,年轻代复制算法回收效率高,标记比清除的效率高)

万声音乐

你们的广告系统跨进程怎么通信?有哪些工具可以实现跨进程传递数据(Binder、socket、文件、广播)?除了AIDL 有没有更好的方式?Provider 有用过吗?Provider 的原理

Provider 是什么时候注册的?什么时候创建的?(Application 的 onCreate 之前)那么是在 attachBaseContext 之后吗?(是的)

事件相关的方法有哪几个?dispatchTouchEvent 和 onTouchEvent 的作用?为什么还要 onInterceptTouchEvent ?

卡顿怎么监控?(给Handler 的 Looper 设置日志打印器),这个方法名字叫啥?(忘了,Looper.getMainLooper().setMessageLogging()),这样有什么缺点吗?还有其他方式吗?(忘了每个方法插桩了)

你的 ANR 监控每秒让主线程改标记位,怎么判断ANR ?(5次没有改这个值),但是如果是广播,后台广播的超时时间是多长?那后台广播的 ANR 时长超过 5s 的话 ,你这个 5s 判断 ANR 是否会有误判?ANR 之后,你什么时候 dump 现场信息

Choreographer 了解吗?怎么记录 FPS (每秒绘制的帧数)?(使用 Choreographer.getInstance().postFrameCallback,然后计算每秒多少帧)

你的APM 本身出了问题怎么办? 你APM 会不会监听你自己 APM 本身的代码?

kotlin 中在一个类的内部写一个类,加上 inner 和 不加 inner 有什么区别? inner 类有什么问题吗?(生命周期不一致,可能有内存泄漏风险,因为内部类持有外部类引用)

kotlin inline 的作用是什么?是怎么提高效率的?(减少方法调用,因为方法需要栈帧记录局部变量、操作树栈、方法出口等,还需要切换,所以浪费存储空间和cpu操作)

Kotlin 的协程的挂起是个什么概念?比线程阻塞有什么区别?怎么切换线程的?

有用过 Kotlin 的 Flow 这些吗?

谢谢你的鼓励