美团
1面
牛客网手写代码,计算树(不是二叉树)的高度
2面
为什么要设计内部类?
一是可以提高封装性,二是可以实现多重集成。
1) 当我们需要在某一情形下实现一个接口,而在另一情形下又不需要实现这个接口时,我们可以使用内部类来解决这一问题。让内部类来实现这个接口。
2) 内部类有效的解决了多重继承的问题。模块化为什么要使用ARouter路由而不是使用IntentFilter?
原生的路由方案一般是显示Intent和隐式的Intent
显示Intent:存在类依赖,耦合比较严重;
隐式的Intent会存在规则集中式管理,会比较混乱,会导致协作变得困难,并且一般而言配置规则在manfest中,会导致扩展性较差;
原生的路由方案会出现跳转无法降级的问题;模块化路由原理,APT怎么实现的
泛型方法为什么使用extends和super?泛型类的extends是只读super是只写,是因为什么?
线程池原理
binder优点缺点
Thread.unCachedExceptionHandler() 遇到过什么问题?io没写完就发生了ANR然后杀死应用了,这种情况有没有遇到过,该怎么解决?
新起service进程,在单独的进程里处理网络上传。为什么GC root是这些?
引申出来的问题是 怎么确定堆中要回收的内存呢。要么通过引用计数法,但是引用计数法有循环引用的问题。换一种方式就是枚举根节点插件化换皮肤反射的是activity里面的什么?是什么?是什么?
phonewindow
快手面试
1面
对着简历找亮点,然后深挖
你们主页面怎么实现的?一般主页面是最复杂的页面。
为什么用RecyclerView来做翻页,而不是用PagerView?
答:RecyclerView的PagerSnapeHelper可以帮助实现横向竖向的翻页。
注册RecyclerView的setOnTouchListener() addOnScrollListener()以及setOnFlingListener()如何给ImageView设置上下左右各5像素的放大点击区域。
事件拦截机制,事件冲突处理 父容器拦截法 子容器拦截法
RecyclerView 4级缓存是什么,一级缓存会回调了什么方法?
EventBus流程
滴滴造车
1面
蓝牙在framework和native层原理
Wifi在framework和native层原理
链表反转 注意代码格式及优化
如何降低内存
OOM ANR怎么解决
JVM内存模型
2面
android系统启动流程
binder细节 为什么同步是(1M-8k)异步是(1M-8k)/2 BC_TRACTION客户端服务端流程
使用ProcessState这个类来初始化Binder服务,那么这个进程的binder上限就是(1M-8k)
为什么异步是同步的一半?猜应该是优先满足同步调用的内存需要;AMS获取流程
性能优化都做过什么
WiFi在framework的流程
BT在framework的流程
Zygote 为什么不采用 Binder 机制进行 IPC 通信?
Binder 机制中存在 Binder 线程池,是多线程的,如果 Zygote 采用 Binder 的话就存在上面说的fork() 与多线程的问题了。ANR发生在AMS的流程
SystemServer进程的埋炸弹、拆炸弹、引爆炸弹点击事件在view根节点DectorView之前的流程
https://blog.csdn.net/whale_kyle/article/details/96435055
InputManagerService负责输入事件的采集,WindowManagerService负责找到目标窗口。
InputManager会单独开启一个线程来处理输入事件,EventHub。
3面 挂了
- 你简历里的65535是什么?为什么谷歌会有个65535的限制?
jvm的限制 - 插件化有实际应用经验吗?
没有 - Tinker热修复你们做的成功率有多少?那么多热修复框架,你们有做过对比吗?凭什么用Tinker?
在使用tinker1.9.9之前,上一个版本使用的是1.9.2,线上修复率稳定在92%以上,这个版本tinker升级后,修复率很低,只有60%
腾讯地图
位运算是什么?使用场景 & | ~
参数类型 这个val是1还是2?
public void addition_isCorrect() {
Node node = new Node(1);
add(node);
System.out.println(node.val);//这个val是1还是2?
}
public void add(Node node) {
node = new Node(2);
}
public static class Node {
public int val;
public Node(int val) {
this.val = val;
}
}
jvm内存模型
线程状态有哪些
网络的七层协议 数据怎么传输的 https怎么保证安全的
线程安全方面有哪些
作业帮
1面
MVC MVP MVVM区别
MVVM LiveData原理
fragment生命周期,第一帧绘制是在activity的onResume()还是fragment的onResume()
Rxjava 连接多个操作符concat zip
binder 被调用端执行在主线程还是binder线程池?
运行在服务端的binder线程池c++的global reference 是什么?
DNS劫持是什么?
快排的时间复杂度
N*logNAndroid冷启动优化做过什么?
apk瘦身做过什么?
算法题
-> 写一个观察者被观察者模式,牛客网写,没有语法检查的,需要注意private final啊这些细节。
->怎么判断单向链表有环?怎么计算链表环的入口?
2面
问项目 讲解项目亮点难点,我说的电影院座位图的自定义view实现方法,问postOnAnimation()跟post(handler)有什么区别
手写代码:一个单向链表怎么移除掉指定的节点?比如5->6->3->3->8->3->9 删除3的节点
做过的内存优化有哪些?图片怎么根据目标ImageView转换成对应的大小的?
3面
动态代理的原理 优缺点
动态代理的原理:运行期间生成java字节码。
相比于静态代理, 动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法。自定义View混淆吗,四大组件混淆吗?
答:都不混淆包打包流程 签名v1v2 v3区别
签名是对apk进行加密的过程,V2签名是为了让不同渠道、应用市场的安装包有所区别,携带了渠道的唯一标识;
v1 jar签名
v2 v2主要比v1多一个签名块。检查整个压缩包。v2 签名将验证归档中的所有字节,而不是单个 ZIP 条目
就是把 APK 按照 1M 大小分割,分别计算这些分段的摘要,最后把这些分段的摘要在进行计算得到最终的摘要也就是 APK 的摘要。然后将 APK 的摘要 + 数字证书 + 其他属性生成签名数据写入到 APK Signing Block 区块。
v3 多个Attr块 以链表形式存储了签名信息。
https://blog.csdn.net/xhmj12/article/details/104549121DES AES RSA RSA2加密原理
断点续传http实现原理
带Range的头h5和native交互逻辑
java->h5 两种方式:
方式1 webview.loadUrl()
方式2 String jscode = "javascript:myjs.callback('" + callbackname + "'," + response + ")";
webview.evaluateJavascript(jscode, null);
h5 -> java
方式1
//注册js的回调
BaseWebView.java
addJavascriptInterface(this,"mywebview");
//然后处理回调
@JavascriptInterface
public void takeNativeAction(final String jsParam) {
}
//html页面响应点击事件
在html js里的处理
打开MainProcessTestActivity
js/myjs.js
myjs.takeNativeAction = function(commandname, parameters){
console.log("myjs takenativeaction")
var request = {};
request.name = commandname;
request.param = parameters;
if(window.myjs.os.isAndroid){
console.log("android take native action" + JSON.stringify(request));
window.mywebview.takeNativeAction(JSON.stringify(request));//调用Native方法
} else {
window.webkit.messageHandlers.mywebview.postMessage(JSON.stringify(request))
}
}
方式2 使用WebViewClient 的shouldOverrideUrlLoading()方法回调拦截请求。
LeakCanary原理 怎么看引用activity的弱引用有没有放到ReferenceQueue里
https流程
MVC MVP MVVM区别
用过kotlin吗?
没用过。。。会jni C++吗?
不会。。。ANR原理是什么?
理想汽车
CPU使用率过高遇过没有,怎么解决的
应用出现大量的图片处理以及加载或者大量的音频、视频处理跟加载。PS:大量的图片、音频、视频处理最好使用JNI技术来实现Picasso Glide 最大的区别 缓存图片方面
内存优化 冷启动优化 ANR怎么解决
SDSCenter IPC有没有用到oneway onepass来优化进程间通信的流程?
oneway的坑:oneway的服务端处理连接是按照类似handler处理消息队列一样挨个执行的,如果遇上被频繁调用,并且服务端处理耗时时,会发生transaction failed这种比较隐蔽的错误,它只会导致业务处理丢失,不会导致客户端客户端anr crash等,
结论:不要在oneway操作中处理耗时操作同样一个功能,你们组可以做,别的组也可以做,你会怎么选择?
是否是Leader?以后的职业规划
腾讯面试
1面
jvm内存模型
并发问题是怎么造成的
binder的原理
android开机启动流程
2面
- 座位图自定义view页面性能优化 你开发的自定义view帧率从多少降到了多少?
1 避免在onDraw中创建对象,分配内存,把paint对象的创建放在初始化函数里面:非常关键
2 避免不必要的绘制逻辑,在需要的时候才绘制。
3 总的原则就是想尽一切办法把onDraw方法的执行控制在16ms以内,就不会卡了。
4 尽量减少过度绘制
- 插件化换皮肤是开发者打包,还是设计打包,有没有给design部门提供自动化打包工具
百度面试
1面
handler机制
HashMap原理
binder如何做权限校验?
我说uid,不记得了
方式1
//服务端的Manfest.xml里申明权限
//服务端在onBind方法中权限校验
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.e(TAG, "onBind-->"+ System.currentTimeMillis());
int check = checkCallingOrSelfPermission("com.xxq2dream.permission.ACCESS_BOOK_SERVICE");
if (check == PackageManager.PERMISSION_DENIED) {
Log.e(TAG, "PERMISSION_DENIED");
return null;
}
Log.e(TAG, "PERMISSION_GRANTED");
return mBinder;
}
客户端的权限申请
方式2
private Binder mBinder = new BookManagerImpl(){
@Override
public List getBookList() throws RemoteException {
Log.e(TAG, "getBookList-->"+ System.currentTimeMillis());
return mBookList;
}
...
@Override
public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
int check = checkCallingOrSelfPermission("com.xxq2dream.permission.ACCESS_BOOK_SERVICE");
if (check == PackageManager.PERMISSION_DENIED) {
Log.e(TAG, "PERMISSION_DENIED");
return false;
}
String packageName = null;
//获取客户端包名
String[] packages = getPackageManager().getPackagesForUid(getCallingUid());
if (packages != null && packages.length > 0) {
packageName = packages[0];
}
//校验包名
if (!packageName.startsWith("com.xxq2dream")) {
return false;
}
Log.e(TAG, "PERMISSION_GRANTED");
return super.onTransact(code, data, reply,flags);
}
在onTransact中先校验permission,然后根据uid校验包名
jvm内存模型
GC roots是些什么
OkHttp实现原理,大概过程
HashMap hashTable区别
加密了解吗?都知道多少?
2面
Object类有什么方法
getClass() hashCode() equals() toString() clone() wait() wait(long) notify() notifyAll() finalize()8种基本数据类型是什么 boolean int各占几个字节?String是基本数据类型吗?boolean和Boolean区别
bbscifld
1 byte 1字节
2 boolean 1字节
3 short 2字节
4 char 2字节
5 int 4字节
6 float 4字节
7 long 8字节
8 double 8字节
~符号是反码还是补码
-
java的异常有哪几种?error和Exception区别
以Throwable为顶层父类
Throwable又派生出Error类和Exception类
Error: Error类及其子类,代表了JVM内部错误。错误不能被程序员通过代码处理,不常见
Exception:代表程序运行时发送的各种不期望发生的事件。
非检查异常:javac在编译的时候不会提示和发现这样的异常,不要求捕获。如除0异常ArithmeticException、强制类型转换异常ClassCastException、数组索引越界ArrayIndexOutOfBoundsException,空指针异常NullPointerException;
检查异常:需要开发者用try-catch语句捕获并处理,否则编译不通过,如IOException,SQLException
说几个网络相关的名词 http https区别,端口分别是什么
android里用到的设计模式举4个例子
-
java的所有集合类,说越多越好,ArrayList和HashMap是同步的吗?不是同步的话针对ArrayList有什么同步的集合类吗?
- 是leader吗?有带人吗还是自己做?
梧桐车连
1面
jvm内存模型
Android冷启动优化
2面
android开机启动流程
Glide原理
爱奇艺
1面
- MVP MVVM 各自功能,优缺点
- binder机制
- 软引用:内存不够情况下回收的。 弱引用:只有弱引用持有,GC时候可以回收掉的 看具体场景
- 性能优化 内存泄漏
- 自定义View 都做过什么 LinearLayout RelativeLayout FrameLayout看过源码吗?
Keep
1面
- java基础部分
- LeakCanery 原理及 dump 内存的时候需要stop-the-world 如何做到界面不卡顿?
enqueue.addIdelHandler() 等空闲的时候再去处理 - classloader 加载一个自己写的跟String包名类名一样的类 会出现错误吗? 错误是在编译时还是在运行时?答:运行时
- sendDelayMessage(2s) 之后sleep了3秒 然后sleep醒后会马上收到消息吗?
测试了下 是的 3s后looper取出来消息发现消息的时间SystemClock.uptimeMillis() // 从开机到现在的毫秒数(手机睡眠的时间不包括在内) 也就是手机锁屏之后再开屏的话会从头算起
System.currentTimeMillis() // 从1970年1月1日 UTC到现在的毫秒数; - 读多写少情况下并发用什么数据结构 答:CopyOnWriteArrayList 那它原理是什么?
- 斐波那契数列写一个方法
头条
版本号 x.x.x.x 比较版本号大小
1 - 100个楼梯,每次可以走1 2 3个楼梯,有多少种走法
动态规划
api 网络做缓存,网络请求做线程池
查看LinearLayout FrameLayout RelativeLayout
立即执行一个消息
延时message怎么等到5分钟之后再去执行 wait notify?
layout干嘛的呀?怎么画
数据库升降级
掌阅科技
- Handler Looper机制简述 能发送一个立即执行的消息吗?
答 sendMessageAtFrontOfQueue(Messagemsg),postAtFrontOfQueue(Runnable r)会插入到Message队头并nativeWake唤醒取消息 - 怎么计算一个应用有多少个Context?https://www.jianshu.com/p/f0fb461a2b2c
答 Context数量=Activity数量+Service数量+1(Application) - View touch事件处理流程。一个View调用setOnTouchListener后返回true,也setOnClickListener的话OnClickListener会被调用吗?
- 自定义View都用过什么 流程
- 安卓动画 Animation Animator区别 ValueAnimator ObjectAnimator
- canvas save 和 restore区别
save 用于保存canvas在旋转 平移 画完等后的状态
restore 用于恢复canvas之前保存的状态 - 组件化 插件化 原理
- 性能优化 UI 内存
九号机器人
- handler.sendMessage Handler.post(Runnable) 这两种有何区别?
post(Runnable r)会调用 sendMessageDelayed(getPostMessage(r), 0)
private static Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
} - mCallback 和 Handler的handleMessage的执行优先级?
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
} - 原子操作。AtomicInteger 等原理。 https://www.jianshu.com/p/cea1f9619e8f
使用了CAS保证原子性 - 锁 的可重入概念? synchronized 是不是可重入锁?
- Activity service Application的context的区别?
- Service 的bind 和 start的生命周期的区别???
- aidl如何执行异步回调? onway in out inout; 等等的区别?
- 返回数组最长连续的子数组