Android 基础

作者: CHSmile | 来源:发表于2018-04-16 22:03 被阅读0次
    • 描述清点击 Android Studio 的 build 按钮后发生了什么

    build

    • 画出 Android 的大体架构图

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

    分层架构

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

    App启动
    Android App启动流程(下)

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

    • Bundle 机制

    详解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 事件传递机制

    事件传递机制
    Android中事件传递机制(一) - 理论知识

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

    谈谈classloader

    热修复详细的流程:
    1.通过PathClassLoader 来加载自身App的dex,因为我们要修改自己的bug.
    2.通过DexClassLoader来加载我们的补丁dex文件,这里面就是没有bug的dex.
    3.反射两个classLoader的<DexPathList pathList;>,目的是拿到这个值.
    4.接着我们来继续反射两个classloader中的pathList(注意:是两个!一个是我们自己应用的,另一个是我们补丁的,PathClassLoader和DexClassLoader都继承BaseDexClassLoader),DexPathList里面的<Element[] dexElements;>,没错还是拿到这个数组的值
    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 SurfaceView, TextureView, SurfaceTexture等的区别

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

    Dalvik、ART 虚拟机

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

    沙箱化
    沙箱化2

    • 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 的区别,性能
    Android ListView与RecyclerView对比浅析
    ListView的优化
    ListView的优化
    RecycleView的使用,原理,RecycleView优化
    RecyclerView 性能优化
    ListView 和 RecyclerView 复用机制区别

    网络请求缓存处理,okhttp如何处理网络缓存的
    图片加载库相关,bitmap如何处理大图,如一张30M的大图,如何预防OOM
    高效加载大图, 有效避免程序OOM
    listview图片加载错乱的原理和解决方案
    ListView异步加载图片乱序问题,原因分析及解决方案

    图片加载原理
    图片加载之原理分析
    Android图片加载机制及其优化

    模块化实现(好处,原因)
    模块化实现

    热修复,插件化

    • OkHttp源码?

    OkHttp源码
    OkHttp源码解析入门教程(一

    • Glide源码?

    Glide源码解析

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

    RxJava简介及其源码解读?
    源码分析
    RxJava的作用,优缺点

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

    • Volley的源代码

    Volley源码解析

    http中缓存机制,Last-Modify的作用
    彻底弄懂HTTP缓存机制及原理

    • EventBus实现原理

    EventBus实现原理

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

    性能优化

    handler发消息给子线程,looper怎么启动
    Handler之从主线程往子线程发消息

    OOM,内存泄漏
    内存泄漏

    activity栈
    Activity调用栈分析

    封装view的时候怎么知道view的大小

    view渲染
    View 渲染流程
    Window、DecorView、ViewRootImp的关系
    Measure、Layout、Draw
    Bitmap 使用时候注意什么?
    Bitmap 使用时候注意
    OOM 是否可以try catch ?
    oom是否可以try catch
    ANR 如何产生?
    ANR的产生和解决办法
    Jni 用过么?
    CMake的编译使用
    native 通过JNI调用java的属性跟方法
    Glide 使用什么缓存,内存缓存如何控制大小?
    从源码的角度理解Glide的执行流程
    Glide中的缓存
    如何实现Fragment的滑动
    如何实现Fragment的滑动?
    ViewPager使用细节,如何设置成每次只初始化当前的Fragment,其他的不初始化
    Fragment 懒加载
    Fragment 懒加载1
    ListView重用的是什么
    ListView 和 RecyclerView 复用机制区别
    RxJava、EventBus底层原理
    如何自我实现一个网络请求框架

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

    Retrofit原理
    Retrofit原理-2

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

    ButterKnife原理

    • Hotfix 原理

    Hotfix 原理

    ANR异常如何查找并分析?
    Android ANR分析详解
    Git工作流
    分支开发工作流

    build.gradle 脚本依赖和打包配置(替换资源)
    组件化开发 context arouter
    三次握手 四次挥手
    三次握手四次挥手过程

    svg path 大小长度限制

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

    invalidate
    二次采样,不压缩图片,实现
    Android图片压缩(二次采样)
    SurfaceView View 区别
    Android中的SurfaceView详解
    lrucache linkHashMap
    LruCache带你彻底解析Android缓存机制

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

    系统启动流程 Zygote进程 –> SystemServer进程 –> 各种系统服务 –> 应用进程
    MVP模式
    MVP设计模式
    怎么启动service,service和activity怎么进行数据交互
    Activity与Service的交互方式
    Android系统为什么会设计ContentProvider,进程共享和线程安全问题
    Android系统为什么会设计ContentProvider
    是否熟悉Android jni开发,jni如何调用java层代码
    Java与Native相互调用

    计算一个view的嵌套层级
    计算一个ViewGroup的嵌套层级
    项目组件化的理解

    下拉状态栏是不是影响activity的生命周期,如果在onStop的时候做了网络请求,
    onResume的时候怎么恢复
    用到的一些开源框架,介绍一个看过源码的,内部实现过程。
    App启动崩溃异常捕捉
    App启动崩溃异常捕捉
    Android进程分类
    Android进程分类
    用IDE如何分析内存泄漏?
    如何处理内存泄漏。也提到了简历中20000*20000大小的图片如何加载的
    大尺寸图片加载问题
    App中唤醒其他进程的实现方式
    App中唤醒其他进程的实现方式
    AndroidManifest的作用与理解

    • 为应用的 Java 软件包命名。软件包名称充当应用的唯一标识符。
    • 描述应用的各个组件,包括构成应用的 Activity、服务、广播接收器和内容提供程序。它还为实现每个组件的类命名并发布其功能,例如它们可以处理的 Intent 消息。这些声明向 Android 系统告知有关组件以及可以启动这些组件的条件的信息。
    • 确定托管应用组件的进程。
    • 声明应用必须具备哪些权限才能访问 API 中受保护的部分并与其他应用交互。还声明其他应用与该应用组件交互所需具备的权限
    • 列出 Instrumentation类,这些类可在应用运行时提供分析和其他信息。这些声明只会在应用处于开发阶段时出现在清单中,在应用发布之前将移除。
    • 声明应用所需的最低 Android API 级别
    • 列出应用必须链接到的库

    AndroidManifest--你真的理解了吗?
    EventBus作用,实现方式,代替EventBus的方式
    Android中开启摄像头的主要步骤
    String 为什么要设计成不可变的?
    为什么String要设计成不可变的?
    序列化的作用,以及 Android 两种序列化的区别。
    Android 序列化 & 反序列化
    进程间通信的机制
    AIDL机制
    AsyncTask机制
    AsyncTask机制原理分析
    AsyncTask机制原理分析1
    AsyncTask机制原理分析2

    如何取消AsyncTask
    取消AsyncTask
    Android为什么引入Parcelable
    Android为什么引入Parcelable
    有没有尝试简化Parcelable的使用
    简化Parcelable的使用

    应用安装过程

    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

    Rtmp 协议
    rtmp

    1. Android一些优化方案

    2. 什么是过渡绘制,如何防止过渡绘制

    3. 事件分发机制

    4. ListView的优化

    5. Binder机制

    6. 在多进程中,Application会启动几次

    7. 单例模式,双锁原理,volatile原理,静态内部类实现单例的原理。

    8. Java多线程,synchronized

    9. 聊项目,都具体做了什么。

    10. Binder机制

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

    12. fragment的生命周期

    13. service一些知识

    14. 事件分发机制

    15. Binder实现机制,Stub类中asInterface函数作用,BnBinder和BpBinder区别。

    16. gradle中buildToolsVersion和TargetSdkVersion的区别是什么

    17. 手机适配一些方案

    18. hashmap的实现原理

    19. 静态方法是否能被重写

    20. 3次握手和4次挥手的原因,以及为什么需要这样做。

    21. 数据结构,搜索二叉树的一些特性,平衡二叉树。

    22. hashmap是如何解决hash冲突的

    23. 进程与线程区别

    24. 写了一个二分查找和单例模式

    25. http中的同步和异步

    26. 聊了一些项目上做的东西,问了问职业规划

    27. 我认为Android做的优秀的几个地方,然后又根据我说的问了问比较深入问题。

    28. Android是如何进行资源管理的。

    29. java比较重要的几个特性

    30. 网络五层结构,每一层协议,由于我网络不是很好,还问了一些其他的问题(例如MAC地址和ip地址的区别等)。

    31. 为什么离开原来公司,以及职业规划,然后因为面试完大概就晚上8点了,就先让我回去,下周让hr跟我联系,我想这是应该通过面试了吧。

    32. 单例,快排,回型打印二维数组

    33. 写一个死锁,死锁是怎样产生的,怎样防止死锁

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

    35. 聊项目都做了些什么

    36. 字符串反转,讨论复杂度。

    37. 聊经历和项目

    38. 给定一个int型 n,输出1~n的字符串例如 n = 4 输出“1 2 3 4”

    39. 输出所有的笛卡尔积组合

    40. 单例模式

    41. 最长上升子序列

    42. 对刚才做的题,一些错的地方做了讨论,主要是类的加载和内部类方面的知识,尤其一些深入到JVM层的知识的确自己有一些不足,不过大部分都还是能答出来。

    43. 双亲委托机制,类的五个加载过程。

    44. java类加载器的加载流程。

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

    46. Serializable和Parcelable的区别。

    47. View的绘制流程,详细到framework代码,讨论到不确定的地方,立马打开电脑和我一起看源码。

    48. 事件分发机制。

    49. 常用设计模式,使用静态内部类实现单例的原理是什么。

    50. 线程同步,CopyOnWriteArrayList怎样实现。

    51. Volley源码,EventBus源码。

    52. 项目介绍,聊一些项目上的问题

    53. 下拉listview的实现,需要注意的地方和优化的地方(不是lsitview的优化,是下拉的优化)。

    54. Android上一些优化方案

    55. 介绍了一下现在做的项目,大体说明了现在所用到的技术。

    56. 聊项目,GLSufaceView,OpengGL,Shader相关一些知识,在项目中做的优化

    57. gc是根据什么来回收一个对象的,引用计数和gc root分别怎么实现。

    58. 怎样会产生内存泄露,举一个具体的例子,使用什么检查内存泄露

    59. 自定义View的绘制流程

    60. 给出二叉树和一个值,找出所有和为这个值的路径;{1,3}{3,6}{3,4}{6,8}区间去重,最少去掉几个集合,可以让这个集合没有交集。

    61. 什么是ANR,Activity、BroadcastReceiver、Service对ANR时间限制分别是多少,怎么处理ANR,除了系统生成trace.txt文件,怎么在程序中检测ANR。写出伪代码。

    62. 编解码一些知识,I帧,B帧,P帧区别。

    63. Android一些优化方案。

    64. 算法 n/m,怎么判断得数是无限循环小数。

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

    66. JVM相关知识,GC机制。

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

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

    69. 插件化原理。

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

    71. concurrentHashmap原理,原子类。

    72. volatile原理。

    73. Binder机制。

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

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

    76. 线程池的相关知识。

    77. Handler机制,HandlerThread实现等等。

    78. LRUCache算法是怎样实现的。

    79. 说了说项目中相关的知识。

    80. 聊了聊之前做过的项目。

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

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

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

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

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

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

    87. 项目相关。

    88. Android优化.。

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

    90. 询问了我博客上写的一些东西,从项目立意谈起,到设计,再到详细的技术实现,可谓是面面俱到,由于自己写的博客还是比较熟悉,回答的还不错。

    91. GLSurfaceView的相关知识,OpenGL,Shader,绘制流程。

    92. 询问当前做的项目,以及到具体的实现和优化。

    93. 多进程间的通讯,Binder机制。

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

    95. hashmap实现原理

    96. 自定义view流程

    97. 事件机制

    98. activity生命周期

    99. handler机制

    100. 链表加法 例如 1->2->3 + 4->5->6->7 = 4->6->9->0

    101. 设计题

    102. view绘制流程

    103. 事件机制

    104. activity生命周期

    105. service两种启动方式,如果多次绑定,会有什么结果

    106. binder机制

    107. volley框架

    108. 查找两个链表的共同节点

    109. Rxjava、Retrofit、okhttp相关的,这些我了解的不是很深。

    110. apk是打包过程,资源文件生成id的规则,xml文件打包后放在哪里?

    111. 聊了聊之前做的项目

    112. Android中的引用以及使用场景

    113. Volley框架,okHttp

    114. 数组实现队列,快排

    115. fragment生命周期

    116. 集合相关的知识,List,Set,Map具体的实现类,以及相应的区别,ConcurrentHashMap实现原理。

    117. 多线程知识,例如,volatile原理

    118. 内部类和静态内部类的区别,以及使用场景。

    119. 一道关于多线程的设计题,下载一本书的章节1.下载一个list列表。2.从列表中并行下载相应的内容。3.显示下载后的章节。要求:并行下载、章节有顺序,需要尽早显示出来,出现异常错误立马停止下载。

    120. 自我介绍,大体聊了以下项目中做的东西。

    121. Top K度算法题,给定一个数组,求前n个最大的数,堆排序。 3. 判断一个view的父类或者父父类是否为listview

    122. listivew的优化,使用复用机制,最多需要创建多少个view。 5. activity的启动模式。

    123. 如何计算Bitmap在内存中的大小?

    124. serizalable和parcelable的区别

    125. volley源码,HTTP缓存机制。

    126. 自我介绍

    127. 实现map接口的几个类,以及各自的特点和区别。

    128. ConcurrentHashMap实现原理,Volatile原理。

    129. 快排

    130. Binder机制

    131. 单例模式实现方式,静态内部类实现单例的原理,内部类和静态内部类的区别等 7. 插件化一些问题

    132. 自我介绍,聊了聊项目。

    133. 绘制OpenGL过程,Shader语言,GLSurfaceView等,说了说在渲染视频的时候做的优化。

    134. JVM相关知识。

    135. 又说了一遍Binder机制。

    136. Android中一些优化方案。

    137. 插件化原理,主要是DL和 360 DroidPlugin的区别,因为我只看了DL源码,对DroidPlugin了解的不深,就大体聊了下DL实现的过程。

    138. 自我介绍,项目介绍了一下。

    139. GC原理

    140. 插件化

    141. 职业发展

    Android基础知识
    Java基础知识,大概是多线程,线程安全,集合类,JVM,类相关知识等。
    Android一些源码的阅读
    优秀的第三方框架源码阅读

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

    对MVC和MVP的理解
    Android中的MVC与MVP

    Handler的内存泄漏问题具体是什么,解决方案知道有什么,空数据的时候Handler的阻塞问题。
    Handler导致的内存泄漏

    http的长连接和短连接这两个概念
    http 长连接和短连接介绍

    HashMap、ConcurrentHashMap、Hashtable的问题,数据结构,线程安全啊之类的问题了,当然还是考了version 1.7和1.8。
    HaskMap

    数组和链表区别
    数组和链表区别
    数组和链表区别2

    哈希表如何处理冲突
    解决哈希冲突的方法

    动态代理原理
    代理模式(动态代理)及其原理分析

    保活机制
    Android保活实现方案梳理

    AMS
    AMS

    hook
    Hook机制之动态代理
    Android 如何开启多进程?应用是否可以开启N个进程?
    开启多进程

    设计模式
    JsBridge 原理

    组件化
    Android彻底组件化方案实践
    ARouter之基本使用(一)
    可能是最详细的ARouter源码分析

    static static {} 谁先执行

    1.静态成员变量
    特点:
    1.随着类的加载,会在方法区的静态区开辟内存空间,初始化数据
    2.可以通过类名直接访问,格式:类名.静态成员变量
    3.一般用于存储所有类的共享数据
    2.静态成员方法
    特点:
    1.静态方法中只能访问静态成员变量(不能使用this引用)
    2.非静态方法中可以访问静态成员(都能访问),在非静态方法中可以访问静态方法
    非静态方法中即可以使用静态成员,也可以使用非静态成员
    3.静态成员变量与非静态成员的区别
    1.生命周期
    静态成员变量是随着类的加载在方法区的静态区中初始化,在程序结束时而消失
    成员变量是随着对象的初始化在堆中创建与初始化,在对象被垃圾回收时,而消失
    2.存储的特点
    静态成员变量是所有对象共享存储数据
    成员变量是某一对象存储的数据
    3.访问方式
    静态成员变量可以通过类名直接访问,也可以通过对象访问
    成员变量只能通过对象来访问

    对象初始化过程
    1.加载类的字节码文件到jvm的方法区中
    2.为静态成员变量在静态区开辟内存空间,并初始化默认值
    3.加载静态代码块,初始化静态成员变量
    4.在堆中开辟空间(根据成员变量的大小),并默认初始化成员变量
    5.加载构造代码块,显式初始化成员变量
    6.加载构造方法,显式初始化成员变量
    7.将堆内存空间的首地址赋给对象的引用

    hashmap 初始大小
    android整理之HashMap
    probuf 为什么传输数据快
    Android Protobuf应用及原理
    Google出品的Protocol Buffer

    红黑二叉树

    如何查找链表倒数第n个节点

    lock 与 synchronzid 区别

    ReentrantLock 显示的获得、释放锁,synchronized 隐式获得释放锁
    ReentrantLock 可响应中断、可轮回,synchronized 是不可以响应中断的,为处理锁的
    不可用性提供了更高的灵活性
    ReentrantLock 是 API 级别的,synchronized 是 JVM 级别的
    ReentrantLock 可以实现公平锁
    ReentrantLock 通过 Condition 可以绑定多个条件
    底层实现不一样, synchronized 是同步阻塞,使用的是悲观并发策略,lock 是同步非阻
    塞,采用的是乐观并发策略
    Lock 是一个接口,而 synchronized 是 Java 中的关键字,synchronized 是内置的语言
    实现。
    synchronized 在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;
    而 Lock 在发生异常时,如果没有主动通过 unLock()去释放锁,则很可能造成死锁现象,
    因此使用 Lock 时需要在 finally 块中释放锁。
    Lock 可以让等待锁的线程响应中断,而 synchronized 却不行,使用 synchronized 时,
    等待的线程会一直等待下去,不能够响应中断。
    通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。
    Lock 可以提高多个线程进行读操作的效率,既就是实现读写锁等。

    eventbus 源码xxx

    netty 机制
    Netty的理解和使用
    Netty在Android中使用

    gradle 如何运行

    常量池
    深入浅出java常量池

    View 渲染
    ViewGroup 子view 交叉绘制

    getMeasureWidth getWidth
    源码解析通过getWidth() 与 getMeasuredWidth()获取宽高的区别
    onResume 能不能拿到width height
    onCreate() 和 onResume() 获取不到 View 的宽高
    onResume() 中如何获取 View 宽高
    自定义view view draw() 主要做什么
    handler postDelayMessage 原理
    Handler postDelayed的原理
    补间动画和属性动画区别 原理(属性改变)
    谈谈属性动画和补间动画的原理及区别
    invalide 一定会重新绘制吗?
    为什么有时候不会回调onDraw
    组件化
    相机预览数据格式

    Android下摄像头预览数据只能 ImageFormat.NV21 格式
    jpg png 区别原理
    gif、jpg、png、webp图片格式比较
    LinkedBlockingQueue(两个独立锁提高并发)
    blockingqueue (如果数据放入过快)
    生产者消费者问题
    字节跳动:
    多指触控
    多点触控最佳实践
    surfaceview
    SurfaceView
    seekto 优化
    seekTo不准确的解决方案
    视频编码之I帧 、P帧、B帧
    视频编码之I帧 、P帧、B帧
    Mediaplayer
    MediaPlayer状态机
    IjkMediaPlayer
    ijkplayer 音视频同步流程分析
    rtmp m3u8协议
    RTMP、HTTP-FLV、HLS
    glide 源码
    ArrayMap 源码
    ArrayMap
    深入剖析 Android中的 ArrayMap
    messagequeue 原理
    深入理解 MessageQueue
    两个栈如何实现队列
    网易:
    布局优化

    1. 标签使用
      标签使用
      ViewStub
    2. 异步加载
      异步加载布局探索
      merge标签使用
      merge标签
      内存泄漏
      内存抖动(写一个内存抖动)如何分析内存抖动,并解决

    什么是过度绘制? 如何查看过度绘制,如何解决
    如何获取Activity 帧率
    如何检测卡顿
    有哪些异步任务,handleThared interservice 区别
    线程优先级
    内存优化 hashmap arraymap 复杂度
    性能优化
    如何查看奔溃日志信息
    如何获取logcat日志
    快排序

    相关文章

      网友评论

        本文标题:Android 基础

        本文链接:https://www.haomeiwen.com/subject/uktwxftx.html