0%

他山之石

GUOBIN

GUOBIN-1

  1. 项目,做了什么优化
  2. 如果有一个首页 横向有很多东西、纵向也有很多东西 你怎么处理?(ViewPager2 + RecyclerView) 我讲了500的首页动态化方案给他听
  3. 浏览器输入地址到显示干了什么
  4. https
  5. 项目网络框架(视频传输用什么?我说udp,并且给出了原因跟说了下http3)
  6. 二叉搜索树的删除
  7. 背书 死锁、多线程访问临界资源问题
  8. 有一个Button有ABC三种样式 然后屏蔽View的其他方法怎么做(我说了三种方法1. 编译时发现访问了View方法报错 2. 继承并且复写方法为空实现,内部提供super访问方法 3.面向对象思想 返回一个只有ABC三个方法的接口)
  9. 逻辑题 烧绳子 1小时得出45分钟 有桶里有3种无限的球 一次拿两个 问至少拿多少次才能出现重复的方案 排列组合共6种 所以至少7次

GUOBIN-2

  1. voliate关键字的作用,加上是否能保证原子操作的原子性?如何保证原子性
  2. recyclerview缓存机制
  3. tcp三次握手、项目网络库实现,为什么要用上udp?
  4. hashmap插入操作、什么时候转红黑树,为什么要转?线程安全么?ConcurrentHashMap如何保证安全
  5. binder优点、对比其他IPC机制,为什么要引入binder?
  6. OSI模型,每层作用跟有什么协议
  7. 概率题:一个家庭有三个孩子,已知其中一个为男,求另外两个至少有一个女的概率
  8. 算法:旋转链表LeetCode 61

GUOBIN-3

https相关
项目的mvvm,redux等、为什么不用databinding?(难找问题、编译慢)
jni如何获取JNIEnv、Jvm结构体、native如何保持jobject的引用 local reference需要每次都delete么?
项目网络库的实现 为何不用http?对比优缺点、除了C2S 有S2C功能么(push功能)怎么实现的。 保活链接呢,断了怎么办?(我们项目是自研的网络库,使用一个tcp socket、两个udp socket链接,tcp socket使用类似http2
的方式发送请求)
有没搞过windows开发?
有没搞过音频开发?
kotlin特点、优缺点、协程怎么实现?为什么不在java实现?协程的含义?dart的协程大致是怎么实现的(跟kotlin差不多)?(java原本是用在服务上的,不是搞移动的)

GUOBIN-4

(1)自我介绍
(2)你主要负责什么模块、奖金优化是什么东西(奖金优化的前提是如果能中奖,中奖金额要怎么样)、如何将所有组合列出来、如何将注数分配出去、奖金范围怎么算的
(3)APP的架构是怎么样的,为什么要这样子架构?MVP每块你们是怎么分工的
(3)首屏怎么调优的、加快启动速度的,内存泄漏怎么检测,LeakCanary原理是什么
(4)HashMap源码相关、为什么要将链转红黑树?红黑树特点、插入删除
(5)消息循环源码、如何做到任务切换线程、想要提交一个任务有几种方式
(6)Kotlin协程原理,怎么切换线程的,为什么要换Kotlin及其优缺点
(6)一个无序、实际上是逆序的数组排序用什么算法好 我说的是快排、实际上应该用归并排序能获得最好的时间复杂度

GUOBIN-5

(1)还是奖金优化
(2)还是性能调优、怎么瘦身、打包流程、模块化
(3)开发者GPUInfo中的每条柱状图颜色代表含义、命令dumpsys meminfo中VSS、PSS、GSS、USS代表什么意思
(4)Android绘制三部曲、Canvas是怎么最终显示在屏幕中的、是以什么样子的数据结构传输的
(5)物理内存与虚拟内存的关系、Android Heap的结构是怎么样的、如果要进行垃圾回收,会收集那些区域
(6)binder源码、其原理是什么,发起一次请求的过程,如何根据文件描述符找到对应的binder实体
(7)广度、深度搜索,拓朴排序、最短路径算法
(8)ELF文件格式、反编译器原理
(9)Kotlin优缺点

GUOBIN-6

(1)项目架构是怎么样的
(2)画一下结构图
(3)为什么要迁移项目到Kotlin
(4)线程 协程 为什么需要线程池 他的状态变化是怎么样的 在Android中的应用
(5)如何设计一个App的架构 该考虑什么
(6)Flutter怎么从平台到Dart的 如何渲染的
(7)你觉得面得怎么样

GUOBIN-7

讲个项目你负责的模块
多个Fragment在销毁后重建之后重叠怎么办
设计一个图片缓存框架
缓存算法用什么
有个ListView快速滑动 如何优化Bitmap的显示
Bitmap的复用听过没有
如何进行内存优化 减少内存消耗

GUOBIN-8

讲下项目的架构
负责的模块
算法 最大子序和
try catch finally关于return的执行结果
hashmap源码 treemap如何对两个元素进行比较 非compareble对象比较
hashcode equals区别
object有什么方法
讲讲Android存在的设计模式
android的消息机制
android的事件分发
讲个android的源码 自选
LeakCanary

GUOBIN-9

android消息机制
android事件分发
设计模式讲讲有什么认识的 代理模式优缺点
图片 缓存机制
首屏调优 内存调优

GUOBIN-SHOPEE

用https本地证书验证,基于这个点描述下。为什么做?技术方案?业界的技术方案?

新证书放在sp里面,sp在使用的过程中会有什么问题?新证书存进去要进行简单的对称加密?

插件化方案描述一下

React 的原理讲一下?

工作这么长时间,觉得哪些方面对自己挑战比较大?

在团队里面是什么样的角色

除了工作以外,还会接触哪些框架原理之类的,对 Fresco 比较熟是吧,它是怎么做的图片缓存的?

GUOBIN-FUTU

富途有一个概率问题,3个人去打天上的飞机,每个人打中的概率都是0.6,一起打,飞机被打中的概率是多少

超大图片加载到app预览,占用内存很大,实现方案上需要注意什么,怎么解决这个问题

微信朋友圈刷列表卡顿,让你定位你如何入手,怎么安排怎么开展工作

还一个,一堆钻石,每个大小可能不一样,你一次只能看一个,看完拿了就结束了,没拿就看下一个,不能回头。怎么保证能拿到一个比较大的钻石,钻石数量无限,可以认为是百万级

笔试(1h):

笔试主要是做一些基础题,主要涉及基础数学、操作系统、算法等基本知识

1:数独游戏,在9*9的数独上填充数字

2:逻辑电路的概率题

3:猴子吃桃问题

4:页面置换算法为FIFO,求缺页中断的次数

5:有7g和2g砝码,如果利用砝码和天平在3次之内将140g的面粉分为90g和50g

第一次:将140g面粉分为70g和70g
第二次:将70g面粉分为35g和35g
第三次:利用砝码将35g面粉分为20g和15g。由此35+15 = 50g; 35+35+20 = 90g
6:编程题 : 根据中序遍历结果和先序遍历结果建树

7:? 编程题:将字符串“l.am.happy”反转为“yapph.ma.I”

/**
 * 两次翻转,先对每个单词进行翻转,再对整体进行翻转 
 */
public String reverseString(String str){

    if(str == null || str.length() == 0){
        return null;
    }
    // 分割单词
    String []wordList = str.split("/.");
    for(int i = 0; i < wordList.length; i++){
        // 对每个单词进行翻转
        wordList[i] = convert(wordList[i]);
    }

    int low = 0;
    int high = wordList.length - 1;
    while(low < high){
        String tmp = wordList[low];
        wordList[low] = wordList[high];
        wordList[high] = tmp;
        low++;
        high--;
    }

    StringBuffer sb = new StringBuffer();
    for(int i = 0; i < wordList.length - 1; i++){
        sb.append(wordList[i]).append(".");
    }
    sb.append(wordList[wordList.length - 1]);
    return sb.toString();
}

// 对单个单词进行翻转
public String convert(String str){
    int low = 0;
    int high = str.length() - 1;
    char[]tmpStr = str.toCharArray();
    while(low < high){
        char temp = tmpStr[low];
        tmpStr[low] = tmpStr[high];
        tmpStr[high] = temp;
        low++;
        high--;
    }
    return String.valueOf(tmpStr);
}

8:? 编程题:不能使用系统函数,计算任意两个日期的天数差

9:? 推导题:A、B、C、D四个人分别带着一顶帽子。共两顶黑帽子,两顶白帽子。其中D和A、B、C三个隔了一堵不透明的墙。A可以看到B、C帽子的颜色。B可以看到C帽子的颜色。只要能判断自己的帽子颜色,就可以立刻说出来。他们四人沉默了几分钟,这时候一个人说到,它知道自己帽子的颜色是什么了,请问这个人是谁?

答案:应该是B。A能看到B、C两人的帽子。如果B、C两个人的帽子颜色相同,那么A立刻就能说出来自己帽子的颜色。否则,如果A沉默,我们就能断定B、C带了不同颜色的帽子。因为B能看到C帽子的颜色,B和C帽子的颜色不同,所以,我们能够推断出B。

?

一面:

一面主要是针对刚才的笔试题进行提问,以及抓着简历和项目经历来问

1:解释一下MVC、MVP、MVVM架构模式

2:解释一下Android组件化(LiveData + ViewModel)

3:? ?对ios架构有了解吗?(只了解过Viper)

4:Kotlin的特点、优点和缺点

优点:

完全兼容Java
Null safe
支持lambda表达式(比Java8更好)
支持扩展
支持高阶函数
体验一致的开发工具链
代码简洁
缺点:

可读性差
编译速度慢
操作不当容易引出大错误
学习资料少
IDEA 自动转换工具,把 Java 转换成 Kotlin,转换质量比人工转的要差的多。
5:? 抓项目细节,问项目的实现

6:Android如何进行优化,如内存优化、布局优化、性能优化

布局优化:

尽量减少布局文件的层级
标签,主要用于布局重用,提高布局的复用性
标签,一般和标签配合使用,可以减少布局的层级
标签,提供了按需加载的功能,当需要时才会将ViewStub中的布局加载到内存,这提高了程序的初始化效率
绘制优化:

避免在View的onDraw方法中执行大量的操作

onDraw中不要创建新的局部变量,这是因为onDraw方法可能会被频繁的调用,这样就会在一瞬间产生大量的临时对象
onDraw方法中不要做耗时的任务,也不能执行成千上万次的循环操作。否则这回导致View的绘制流程不流畅
内存优化:

尽量使用Android特有的数据容器。如SparseArray、SparseBooleanArray
不要使用过多的枚举类,枚举占用的内存空间比整形大
适当使用软引用和弱引用
尽量采用静态内部类,这样可以避免潜在的由于内部类而导致的内存泄露

二面:

1:? 重载和重写的区别

方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载是一类中多态性的一种表现。

override(重写):

   1、方法名、参数、返回值相同。

   2、子类方法不能缩小父类方法的访问权限。

  ?3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。

   4、存在于父类和子类之间。

   5、方法被定义为final不能被重写。

 overload(重载):

  1、参数类型、个数、顺序至少有一个不相同。?

  2、不能重载只有返回值不同的方法名。

  3、存在于父类和子类、同类中。

2:Android应用的启动过程

时序图

3:TCP建立连接的过程

建立连接:

TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

(1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。

(2)第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。

(3)第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据

释放链接:

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个?FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

?CP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。?

(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。?

(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。?

(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

4:传输层和网络层的联系

网络层负责ip数据报的产生以及ip数据包在逻辑网络上的路由转发。

传输层提供端到端通信服务层次,提供可靠及非可靠连接。

网络层只是根据网络地址将源结点发出的数据包传送到目的结点(点到点),其主要任务是:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。该层控制数据链路层与传输层之间的信息转发,建立、维持和终止网络的连接。具体地说,数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。

而传输层则负责将数据可靠地传送到相应的端口(端到端),传输层提供了主机应用程序进程之间的端到端的服务。传输层利用网络层提供的服务,并通过传输层地址提供给高层用户传输数据的通信端口,使高层用户看到的只是在两个传输实体间的一条端到端的、可由用户控制和设定的、可靠的数据通路。

5:25匹马,5条跑道。要选出最快的前三名,最少要跑几次?

7次。将25匹马分成五批,跑五次,决胜出每批马的第一名。再让每批第一名的马跑一次,决定前三名,设为A,B,C。此时可确认跑得最快的为A,但是第二名和第三名不确定。于是可以让A1,A2, B,B1,C跑一次。(A1代表A组的第二名),决胜出前二名。就是最快的第二和第三名的马。

6:老王卖鞋,一双进价30元,老王赔本卖,只卖20元。有个骗子来买,给老王50元假钞。老王未能识别,又没有零钱,把这假钞拿到隔壁铺子的老李换了50元零钱,回来找了骗子30。隔壁很快发现问题,拿假钞来换,老王只好把自己的家底真钞50元换给隔壁。问老王损失了多少钱?

损失了60元,由题目可知老李没有任何损失。老王找了骗子30元,同时又得到了一双价值30的鞋子。赚了60元,因此可以得出老李亏了60元。

7:死锁产生的必要条件

互斥条件:请求的资源为临界资源
请求和保持条件:申请新资源,保持旧资源
不剥夺条件:已获得的资源,在使用完之前,不被外力剥夺
环路等待条件:互相等待资源
8:多少个进程竞争多少个临界资源会产生死锁?

两个或以上进程需要两个或以上资源

9:你怎么规划你以后的发展?

(接下来巴拉巴拉一大堆产品的问题,产品的优势、竞争力等等)

?

Hr面(20min)

cici

1、数组实现队列

2、gc的流程

点击看答案

可以查看 虚拟机 第5题

3、java软引用与弱引用区别

点击看答案

参考以前的读书笔记

4、java中的this编译时的原理

点击看答案

我们知道,this关键字主要有三个用途:

  • 调用本类中的属性
  • 调用本类中的其他方法
  • 调用本类中的其他构造函数

this编译时的原理:

  1. this指代的一定是对象(所以静态方法不能使用this),且该对象的静态类型就是就是当前类
  2. 实例方法以及 构造方法的第一个参数都是this(在构造方法之前,jvm其实已经给对象在堆中分配好了内存了,构造方法的作用是对类初始化
  3. this一般出现在方法中;如果this出现在方法体外部,如:在类A中定义了成员变量 A a = this;最终这行代码仍然会被放入 A 类的构造函数中执行

参考他人的博客

5、final变量用反射修改

6、HashMap的内部结构,给定一个key,如何找到对应的value,使用equal

7、volatile

8、Java线程池有什么作用

9、Java动态代理

10、handler机制

点击看答案

查看Android基础 第4题即可

11、android跨进程通信的方式

点击看答案

阅读以前的读书笔记

12、自定义控件方式

13、Canvas绘制过什么 手写功能

14、断点续传的实现

15、如何设计图片加载库

16、有看过哪些安卓的源码

  • Activity启动
  • handler
  • ThreadHandler
  • IntentThread

17、看过哪些开源项目

  • LeakCanary
  • Alpha
  • okhttp

18、app 启动速度的优化做过哪些

19、fresco加载图片原理 优势是什么

20、写程序时,堆和栈有什么优化点 内存回收时机 如何判断对象可被回收

21、引用计数法和gc root法

22、事件分发 cancel事件一般在什么时候被触发

点击看答案

参考源码理解中的12、13题

23、touchdelagate 一个父view只能设置一个delegate,如何解决设置多个

24、App整个架构了解么

25、mvvm data binding

26、webview

27、fragment startactivity

28、动画的原理

黄油计划 vsync

设计一个离线视频下载功能

Activity 启动流程

android app签名原理

Android查询资源文件layout原理

设计一个decode bitmap方法

启动Activity A后,按home键,再从桌面启动activity A , Activity A的生命周期

handler原理

onSaveInstanceState调用时机

Fragment View区别

Java内存管理和内存回收

Android scheme

Activity怎么管理自己的生命周期,ActivityThread怎么运作

消息事件分发

进程之间通讯

线程锁

touch事件分发原理scrollview和viewpager之间的滑动如何防止冲突,里面listitem也需要支持滑动怎么办

插件化的了解情况动态代理实现(自由发挥的)

如何实现一个拥有取出最小值方法的堆栈,要求算法的事件复杂度是O(E)如何算

二叉树节点之间的最小距离

两个链表,可能很长,实现求和(大数求和),结果也是单向链表

ActivityTask的使用

onNewIntent的调用时机

checkbox,up事件和down事件的区别

怎么用Standard方式来实现一个SingleTop启动的Activity

Http文件上传的具体过程

其实证书的本地校验还有一个步骤就是,将获取的新证书与老证书对比下,对比新旧证书

在kotlin中各个部分的执行顺序:

companion > init > constructor

自己写代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class KotlinTest {
init {
println("init");
}

constructor(){
println("constructor init");
}

companion object {
init{
println("companion init");
}
}
}

会输出:

companion init

init

constructor init

对称加密哪些

三次、四次握手

注意postInvalidate的使用

关于如何排查ANR

获取日志文件

首先,获取日志文件:

adb bugreport buglog

之后,就会显示进度生成,有个时候会生成不成功,没关系,再来一次

生成之后,这个文件被导入到当前项目的路径下,解压这个 buglog.zip 文件即可,打开 [机型]xxx.txt 查看里面的日志。

ANR类型和日志关键字

KeyDispatchTimeout-主要类型按键或触摸事件,input事件在5S内没有处理完成发生ANR

日志关键字:Reason: Input dispatching timed out xxxx

ServiceTimeout-bind,create,start,unbind等在主线程处理耗时,前台Service在20s内,后台Service在200s内没有处理完成发生ANR

日志关键字:Timeout executing service:/executing service XXX

3)BroadcastTimeout- BroadcastReceiver onReceiver处理事务时前台广播在10S内,后台广播在60s内没有处理完成发生ANR

日志关键字:Timeout of broadcast XXX/Receiver during timeout:XXX/Broadcast of XXX

4)ProcessContentProviderPublishTimedOutLocked-ContentProvider publish在10s内没有处理完成发生ANR
日志关键字:timeout publishing content providers

造成ANR的常见原因

  • 主线程耗时操作,如复杂的layout,庞大的for循环,IO等。
  • 主线程被子线程同步锁block
  • 主线程被Binder 对端block
  • Binder被占满导致主线程无法和SystemServer通信
  • 得不到系统资源(CPU/Memory/IO)

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

频繁GC、OOM 的排查

Android 的profile 功能->memory -> dump ,得到 hprof 文件

AS 现在直接能看到各个对象了,或者按照以前的,将 hprof 文件转一道,使用 MAT 打开

两个人轮流抛硬币,正面朝上的赢,正反面概率一样,你应该先抛还是后抛

设先抛先吃的概率为p1, 后抛先吃的概率为p2

那么有:

p1 = 1/2 + 1/2 * p2

p1 + p2 = 1

解方程可得,

p1 = 2/3

参考自牛客网

谢谢你的鼓励