Android

  • 描述清点击 Android Studio 的 build 按钮后发生了什么

build

  • 画出 Android 的大体架构图

Android系统采用分层架构,从下往上依次为:
Linux内核
系统库和Android运行时
框架层
应用程序层

分层架构

  • App启动流程,从点击桌面开始

App启动

Https请求慢的解决办法,DNS,携带数据,直接访问IP
https相关,如何验证证书的合法性,https中哪里用了对称加密,哪里用了非对称加密,对加密算法(如RSA)等是否有了解

  • Bundle 机制
  • Activity的启动模式

standard
singleTop
singleTask
singleInstance
启动模式

  • 四大组件

四大组件

  • Service的开启方式

Service的开启

  • 广播的使用场景

广播 -1

  • service一些知识,Activity与Service通信的方式

service -1
service -2

  • 简述Activity启动全部过程?

Activity启动过程

  • fragment的生命周期,Activity与Fragment之间生命周期比较

fragment的生命周期

  • 简述IPC?

IPC是Inter-Process Communication的缩写,含义为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。
IPC
IPC-2
https://www.jianshu.com/p/96062c549b2a

  • fragment之间传递数据的方式?

1.Fragment 方法设置和调用。
2.采取接口回调的方式进行数据传递。
3.使用三方开源框架:EventBus
fragment之间传递数据

  • 四种启动模式,用过哪些,出过什么问题。(包括聊到了onSaveInstanceState跟onRestoreInstanceState的场景与时机,然后在一个点跟面试官看法不同,我说我调试时候遇到过相关问题,面试官让我回去再确认下)

standard 标准模式,每次都新建一个实例对象
singleTop 如果在任务栈顶发现了相同的实例则重用,否则新建并压入栈顶
singleTask 如果在任务栈中发现了相同的实例,将其上面的任务终止并移除,重用该实例。否则新建实例并入栈
singleInstance 允许不同应用,进程线程等共用一个实例,无论从何应用调用该实例都重用
启动模式

onSaveInstanceState()方法会在什么时候被执行,有这么几种情况:
  (1)、当用户按下HOME键时。
  这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,因此系统会调用onSaveInstanceState(),让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则
  (2)、长按HOME键,选择运行其他的程序时。
  (3)、按下电源按键(关闭屏幕显示)时。
  (4)、从activity A中启动一个新的activity时。
  (5)、屏幕方向切换时,例如从竖屏切换到横屏时。
数据恢复

  • BroadcastReceiver,LocalBroadcastReceiver 区别

一、应用场景
1、BroadcastReceiver用于应用之间的传递消息;
2、而LocalBroadcastManager用于应用内部传递消息,比broadcastReceiver更加高效。
二、安全
1、BroadcastReceiver使用的Content API,所以本质上它是跨应用的,所以在使用它时必须要考虑到不要被别的应用滥用;

2、LocalBroadcastManager不需要考虑安全问题,因为它只在应用内部有效。
LocalBroadcastReceiver

  • android 事件传递机制

事件传递机制

  • 如何保持应用的稳定性
  1. 提高编码质量 (静态扫描工具:Lint、Findbugs)
  2. 改进Crash上报系统,解决Crash问题
  3. 目前的策略:先在某一个渠道灰度,当问题暴露的足够多时,再发布全量版本。
    稳定性
  • 谈谈classloader,类加载机制 双亲委派模型

谈谈classloader

热修复详细的流程:
1.通过PathClassLoader 来加载自身App的dex,因为我们要修改自己的bug.
2.通过DexClassLoader来加载我们的补丁dex文件,这里面就是没有bug的dex.
3.反射两个classLoader的,目的是拿到这个值.
4.接着我们来继续反射两个classloader中的pathList(注意:是两个!一个是我们自己应用的,另一个是我们补丁的,PathClassLoader和DexClassLoader都继承BaseDexClassLoader),DexPathList里面的,没错还是拿到这个数组的值
5.合并两个反射到的Element 数组!这里是重中之重.我们需要把我们的补丁dex放在数组的最前面!
6.将合并的新的数组,通过Field重新设置到我们自身App的DexPathList->dexElements.没错!就是合并之后覆盖有bug那个loader的Element 数组!!
7.通过Android build-tools 中的dx命令打包一个没有bug的dex
注:假设你的App中有一个class A 出bug了,那么你就可以通过dx命令打包一个只有class A的dex文件.

  • 动态加载

动态加载
插件化开发

  • SP是进程同步的吗?有什么方法做到同步

commit() 是同步提交到内存后再同步提交到磁盘上,如果 commit() 之前还有没结束的异步任务(包括 apply() 的提交),就会一直阻塞到前面的提交都完成,才进行提交。
apply() 是立即提交到内存后异步提交到磁盘上。
commit() 有返回值,而 apply 没有返回值。
存在内存与磁盘数据不同步的情况,多进程共享需要注意数据安全。
ContentProvider 多进程共享 SharedPreferences 数据

  • 介绍下SurfaceView

一是,如果屏幕刷新频繁,onDraw方法会被频繁的调用,onDraw方法执行的时间过长,会导致掉帧,出现页面卡顿。而SurfaceView采用了双缓冲技术,提高了绘制的速度,可以缓解这一现象。
二是,view的onDraw方法是运行在主线程中的,会轻微阻塞主线程,对于需要频繁刷新页面的场景,而且onDraw方法中执行的操作比较耗时,会导致主线程阻塞,用户事件的响应受到影响,也就是响应速度下降,影响了用户的体验。而SurfaceView可以在自线程中更新UI,不会阻塞主线程,提高了响应速度。
SurfaceView介绍
SurfaceView

  • OSGI
  • 对 Dalvik、ART 虚拟机有基本的了解;

Dalvik、ART 虚拟机

  • App 是如何沙箱化,为什么要这么做;

沙箱化

  • Application 的生命周期;

Application

  • handler实现机制(很多细节需要关注:如线程如何建立和退出消息循环等等)

Handle

  • ThreadLocal 原理

ThreadLocal
ThreadLocal2

  • ActicityThread相关?

ActicityThread

  • 进程间通信的方式
  1. 使用Bundle的方式
  2. 使用文件共享的方式
  3. 使用Messenger的方式
  4. 使用AIDL的方式
  5. 使用Socket的方式

进程间通信
进程间通信2

  • 为什么不能在子线程更新UI

不能在子线程更新UI

  • Handler为什么能够更新UI

Handler能够更新UI

  • 如何保证一个线程只有一个Looper

一个线程只有一个Looper

MVP模式
模式MVP,MVC介绍

recycleview listview 的区别,性能
ListView的优化
RecycleView的使用,原理,RecycleView优化
网络请求缓存处理,okhttp如何处理网络缓存的
图片加载库相关,bitmap如何处理大图,如一张30M的大图,如何预防OOM
listview图片加载错乱的原理和解决方案

图片加载原理
模块化实现(好处,原因)
热修复,插件化

  • OkHttp源码?

OkHttp源码
OkHttp源码-2

  • Glide源码?

Glide源码解析

RxJava的作用,与平时使用的异步操作来比,优势

RxJava简介及其源码解读?

RxJava的作用,优缺点

TCP的三次握手四次挥手全流程(画了每次握手挥手时候的报文内容与控制位设定)

  • volley的源代码,在图片缓存部分讨论了挺长时间,http中缓存机制,Last-Modify的作用等。

Volley源码解析

  • EventBus实现原理

EventBus实现原理

Android相关优化(如内存优化、网络优化、布局优化、电量优化、业务优化)

handler发消息给子线程,looper怎么启动
OOM,内存泄漏
View事件传递
activity栈
封装view的时候怎么知道view的大小
view渲染

Bitmap 使用时候注意什么?
Oom 是否可以try catch ?
内存泄露如何产生?
ANR 如何产生?
Jni 用过么?
glide 使用什么缓存?
Glide 内存缓存如何控制大小?

LinearLayout、RelativeLayout、FrameLayout的特性、使用场景
如何实现Fragment的滑动
ViewPager使用细节,如何设置成每次只初始化当前的Fragment,其他的不初始化
ListView重用的是什么
RxJava、EventBus底层原理
如何自我实现一个网络请求框架

  • Retrofit原理?为何用代理?代理的作用是什么?

Retrofit原理
Retrofit原理-2

  • ButterKnife原理?用到反射吗?为什么?

ButterKnife原理

  • Hotfix 原理

Hotfix 原理

ANR异常如何查找并分析?

Git工作流
build.gradle 脚本依赖和打包配置(替换资源)
组件化开发 context arouter
三次握手 四次挥手
Rxjava 源码

svg path 大小长度限制

  • invalidate() postInvalidate() 全局刷新 局部刷新

invalidate

glide 源码
二次采样,不压缩图片,实现
事件分发
SurfaceView view 区别
lrucache linkHashMap

动态权限适配方案,权限组的概念
Binder机制介绍
权限管理系统(底层的权限是如何进行 grant 的)

系统启动流程 Zygote进程 –> SystemServer进程 –> 各种系统服务 –> 应用进程

RxJava的功能与原理实现

MVP模式

怎么启动service,service和activity怎么进行数据交互
Android系统为什么会设计ContentProvider,进程共享和线程安全问题
是否熟悉Android jni开发,jni如何调用java层代码
计算一个view的嵌套层级
项目组件化的理解

下拉状态栏是不是影响activity的生命周期,如果在onStop的时候做了网络请求,onResume的时候怎么恢复
singleTask启动模式
用到的一些开源框架,介绍一个看过源码的,内部实现过程。
App启动崩溃异常捕捉
事件传递机制的介绍
Android进程分类
ANR的原因

ANR怎么分析解决
内存泄漏的可能原因?
用IDE如何分析内存泄漏?
OOM的可能原因?
如何处理内存泄漏。也提到了简历中20000*20000大小的图片如何加载的

App中唤醒其他进程的实现方式
AndroidManifest的作用与理解
EventBus作用,实现方式,代替EventBus的方式
Android中开启摄像头的主要步骤
String 为什么要设计成不可变的?
fragment 各种情况下的生命周期
序列化的作用,以及 Android 两种序列化的区别。

进程间通信的机制
AIDL机制
AsyncTask机制
如何取消AsyncTask
序列化
Android为什么引入Parcelable
有没有尝试简化Parcelable的使用
AIDL机制
应用安装过程

AlertDialog,popupWindow,Activity区别
Activity 上有 Dialog 的时候按 home 键时的生命周期
横竖屏切换的时候,Activity 各种情况下的生命周期
Application 和 Activity 的 context 对象的区别
性能优化,怎么保证应用启动不卡顿
怎么去除重复代码

用过React Native没。(自己用过Ionic,但是面试官没听过,Ionic在2015年相对较火)
平时如何自我学习,2017 Google I/O大会讨论内容有哪些
MVP框架,如何用,怎么用。怎么解耦。跟MVC的差别
问专业方向(GIS),问如何处理地理围栏
如何省电又能实时跟服务器端交互(我说的是AlarmManager+Service),一直传输位置信息给服务器。用了什么协议
由上面的扯到OkHttp底层原理

Binder相关?
触摸事件的分发?
点击事件被拦截,但是相传到下面的view,如何操作?
Android事件分发机制

翻转一个单项链表
合并多个单有序链表(假设都是递增的)
Android中数据存储方式

Android中进程内存的分配,能不能自己分配定额内存

微信主页面的实现方式
微信上消息小红点的原理
项目的并发度多大,如何处理crash后的信息回传
两个不重复的数组集合中,求共同的元素。
上一问扩展,海量数据,内存中放不下,怎么求出。
如何对APP进行内存优化

涉及到OpenGL的项目。以及OpenGL3.0与2.0的差别
View与SurfaceView
OpenGL、GLSurfaceView和Shader,主要聊了OpenGL绘制方法

JNI/NDK开发如何使用,如何定义java文件与cpp文件中的方法(主要看是不是真的用过吧)
涉及到自己项目中用到的优化方案与策略,尤其针对图片的

看到用过GreenDao,问有没有在一个事务中提交两种不同的操作

MVP框架,混合开发相关
ANR异常发生条件
5s内没有响应用户输入事件
2)10s内广播接收器没有处理完毕
3)20s内服务没有处理完毕
如何分析ANR
log+trace.txt
内存优化如何做?

自定义View和ViewGroup
说一下自己定义的组件就行
事件处理
分发,拦截,处理。只是View没有拦截处理

动画
View动画,属性动画,帧动画。再说下View和属性动画区别。
参考:https://developer.android.com/guide/topics/graphics/overview.html

Dalvik和Art区别?(Just In Time和Ahead Of Time)

会对代码进行review吗?何时review?怎么review?
项目中遇到的让你棘手的问题?多久解决,怎么解决?(考的是你发现问题和解决问题的能力)
如何学习?何时学习?怎么学习?学习渠道?(考的是学习能力)

Android一些优化方案
什么是过渡绘制,如何防止过渡绘制
事件分发机制
ListView的优化
Binder机制
在多进程中,Application会启动几次
单例模式,双锁原理,volatile原理,静态内部类实现单例的原理。
网络的五层模型,又问了TCP和UDP,还有Android相关的长连接

事件分发机制
Binder实现机制,Stub类中asInterface函数作用,BnBinder和BpBinder区别。
gradle中buildToolsVersion和TargetSdkVersion的区别是什么
手机适配一些方案

Java基础知识。线程,java虚拟机,内存模型等。
Android基础知识。官方API,常用控件源码,自定义控件,动画,性能分析等。
app层面:第三方开源框架(okHttp,Retrofit,ButterKnife),热修复技术(Andfix,Robust,Tinker等),崩溃处理,日志处理,内存溢出内存泄漏定位等。
网络基础:TCP/IP,Http/Https,UDP,七层网络协议等等。

Android是如何进行资源管理的单例,快排,回型打印二维数组

Acticity启动模式有几种,分别代表什么意思

Binder机制,从java到framework再到kenral层,面试官问的都很详细,遇到不会的也都会跟我解释

Serializable和Parcelable的区别。
View的绘制流程,详细到framework代码,讨论到不确定的地方,立马打开电脑和我一起看源码。
事件分发机制。
常用设计模式,使用静态内部类实现单例的原理是什么。
线程同步,CopyOnWriteArrayList怎样实现。
Volley源码,EventBus源码

下拉listview的实现,需要注意的地方和优化的地方(不是lsitview的优化,是下拉的优化)
Android上一些优化方案
聊项目,GLSufaceView,OpengGL,Shader相关一些知识,在项目中做的优化
gc是根据什么来回收一个对象的,引用计数和gc root分别怎么实现。
怎样会产生内存泄露,举一个具体的例子,使用什么检查内存泄露
自定义View的绘制流程
给出二叉树和一个值,找出所有和为这个值的路径;{1,3}{3,6}{3,4}{6,8}区间去重,最少去掉几个集 合,可以让这个集合没有交集
什么是ANR,Activity、BroadcastReceiver、Service对ANR时间限制分别是多少,怎么处理ANR,除了系统生成trace.txt文件,怎么在程序中检测ANR。写出伪代码。
编解码一些知识,I帧,B帧,P帧区别。
Android一些优化方案。
算法 n/m,怎么判断得数是无限循环小数。

事件分发机制。
算法,将一个字符串转换成int型数字,考虑 错误输入,溢出,正负值等一些条件,考细心。
给出一个搜索二叉树,输出一个排序好的双向链表

类的加载过程,Person person = new Person();为例进行说明。

JVM相关知识,GC机制。

类的加载器,双亲机制,Android的类加载器。

Android中进程的级别,以及各自的区别。

插件化原理。

集合框架,list,map,set都有哪些具体的实现类,区别都是什么。

concurrentHashmap原理,原子类。

volatile原理。

Binder机制。

View的绘制流程,事件传递机制,Handler异步消息机制。

Interger中的128(-128~127),这里考的是常量池的概念,这个没回答上来。

线程池的相关知识。

Handler机制,HandlerThread实现等等。

LRUCache算法是怎样实现的。

内存泄露,怎样查找,怎么产生的内存泄露。

怎样计算一张图片的大小,加载bitmap过程(怎样保证不产生内存溢出),二级缓存,LRUCache算法。

简单介绍一下java中的泛型,泛型擦除以及相关的概念。

Android优化相关的只是,布局优化、内存优化等等。

SQL相关的知识优化的方案,这里我直接说不太了解,就过了。

算法题,m * n的矩阵,能形成几个正方形(2 * 2能形成1个正方形,2 * 3 2个,3 * 3 6个)

Android优化.。

插件化相关技术,热修补技术是怎样实现的,和插件化有什么区别。

GLSurfaceView的相关知识,OpenGL,Shader,绘制流程。
多进程间的通讯,Binder机制。

询问看过哪些框架源码,EventBus,Volley讲了一下

Android一些源码的阅读
优秀的第三方框架源码阅读

广度:比较新的技术(Rxjava,插件化等),JVM,GC,网络,数据库,Android(一般不会询问之前面试官问过的问题)。
深度:一般会通过1或2个问题来考察,例如:map接口下都有什么子类->hashmap和hashtable区别->hashmap实现原理->怎么解决hash冲突->是否了解concurrentHashmap->concurrentHashmap实现原理->volatile实现原理(concurrentHashmap读是不加锁的,使用到了volatile)

Android基础
View的绘制流程;自定义View如何考虑机型适配;自定义View的事件分发机制;View和ViewGroup分别有哪些事件分发相关的回调方法;自定义View如何提供获取View属性的接口;

Art和Dalvik对比;虚拟机原理,如何自己设计一个虚拟机(内存管理,类加载,双亲委派);JVM内存模型及类加载机制;内存对象的循环引用及避免

内存回收机制与GC算法(各种算法的优缺点以及应用场景);GC原理时机以及GC对象;内存泄露场景及解决方法;OOM的避免及解决方法

四大组件及生命周期;ContentProvider的权限管理(读写分离,权限控制-精确到表级,URL控制);Activity的四种启动模式对比;Activity状态保存于恢复

Fragment生命周期;Fragment状态保存

startActivityForResult是哪个类的方法,在什么情况下使用,如果在Adapter中使用应该如何解耦

AsyncTask原理及不足;IntentService原理

AstncTask+HttpClient与AsyncHttpClient有什么区别

如何保证一个后台服务不被杀死;比较省电的方式是什么

如何通过广播拦截和abort一条短信;广播是否可以请求网络;广播引起anr的时间限制

进程间通信,AIDL

Handler机制及底层实现

Binder机制及底层实现

ApplicationContext和ActivityContext的区别

一张Bitmap所占内存以及内存占用的计算

对于应用更新这块是如何做的?(灰度,强制更新,分区域更新)

混合开发,RN,weex,H5,小程序(做Android的了解一些前端js等还是很有好处的)

说一款你认为当前比较火的应用并设计(直播APP)

动态权限适配方案,权限组的概念
网络请求缓存处理,okhttp如何处理网络缓存的
图片加载库相关,bitmap如何处理大图,如一张30M的大图,如何预防OOM

你可能感兴趣的:(Android)