Android知识点归纳总结提纲

Android部分
一、Android四大组件
二、Fragment相关
三、动画相关
四、布局相关
五、数据存储
六、线程、进程
七、网络
八、WebView
九、图片
十、Camera相关
十一、音视频相关
十二、ViewPager相关
十三、RecyclerView相关
十四、Canvas相关
十五、传感器相关
十六、性能优化
十七、UI适配
十八、Android中的Context
十九、序列化与反序列化
二十、JSON解析
二十一、二维码
二十二、Permission权限
二十三、Activity工作原理
二十四、View事件分发机制
二十五、View的绘制流程
二十六、自定义view基本流程
二十七、Apk的打包/安装过程
二十八、App混淆
二十九、App冷启动优化
三十、子线程不能更新UI
三十一、Android Studio Gradle
三十二、adb相关
三十三、逆向安全
三十四、NDK开发
三十五、设计模式
三十六、架构模式
RxJava
Kotlin
Dagger 2
Flutter
Weex
Hybrid 混合开发
OpenGL
测试工具
其他冷门知识
其他补充:
Java部分
一、Java基础
二、Java数据结构和算法

Android部分

一、Android四大组件

1:Activity相关, Activity生命周期理解,Activity启动另一个Activity返回的完整生命周期, Activity四种启动模式,Activity任务栈理解(先进后出),Activity的显示隐式启动,Activity的隐式启动(理解Scheme跳转协议),Activity之间的跳转与回调,Activity之间的intent数据传递,理解Activity工作原理Activity与Window之间的关系,Activity和dectorView等
2:Service相关, Service生命周期方法,Service的两种启动方式的使用,start与bind的区别,何时需要停止Service, Service的使用场景理解, 后台Service与前台Service,如何提高后台服务的存活率,如何保证一个后台服务不被kill, IntentService的使用等
3:BroadcastReceiver相关,广播的两种注册方式(隐式/显示广播),广播的注册/反注册注意事项,有序广播、本地广播,接收到广播Action后的处理方法等
4:ContentProvider相关,ContentProvider的使用,如何使用ContentProvider实现应用间的数据共享,ContentProvider使用的content URI形式的理解等

二、Fragment相关

虽然Fragment不属于Android四大组件(也有人说它是第五大组件),但是作为Android日常开发使用的高频组件之一,必须要了解Fragment的使用方法和注意事项

1:Fragment的生命周期,以及Fragment生命周期与其宿主Activity生命周期的对应关系
2:如何通过FragmentTransaction实现Fragment的添加、移除、替换、显示、隐藏等
3:Fragment之间的跳转,Fragment如何与Activity交互
4:如何管理Fragment回退栈
5:没有视图的Fragment的用处
6:FragmentManager可提供使用的方法
7:v4包与app包提供的Fragment使用的区别注意项
8:Fragment使用的其他坑

三、动画相关

1:帧动画(FrameAnimation),帧动画的使用方式,xml和代码两种实现方式,帧动画使用注意事项,利弊等
2:补间动画(TweenAnimation), 四种常用的补间动画:alpha(淡入淡出),translate(位移),scale(缩放大小),rotate(旋转)的使用方式,xml和代码两种实现方式,相关属性的理解与注意事项,动画的监听设置,使用AnimatorSet播放多个组合动画等
3:属性动画(PropertyAnimation), 属性动画的使用方法,ValueAnimator与ObjectAnimator的使用,相关属性的理解,AnimatorSet同时播放多个动画,Interpolator(动画差值器)的理解与使用,AnimatorListener的设置,属性动画的工作原理等
4:如何利用Canvas绘制动画
5:了解Android 矢量动画实现
6:转场动画,触摸反馈动画,其他自定义动画

四、布局相关

1:常用布局LinearLayout、RelativeLayout、FrameLayout, xml与代码两种使用方式,相关属性的理解,会在代码中动态的设置与改变LayoutParams的相关属性控制view
2:非常用布局AbsoluteLayout、TableLayout、GridLayout的使用
3:百分比布局,PercentRelativeLayout、PercentLinearLayout、PercentFrameLayout的了解与使用
4:ConstraintLayout(约束布局)的使用,相关属性的理解
5:FlexboxLayout(流动布局)的使用,相关属性的理解
6:CoordinatorLayout的使用,会使用support.design库提供的CoordinatorLayout布局来实现常见的滑动折叠/展开浸入式联动特效,理解Behavior解决嵌套滑动冲突与事件拦截处理的原理,理解NestedScroll机制
7:界面布局类型的选择和性能优化

五、数据存储

1:SharedPreferences,sp的使用场景,sp的常用方法,sp能保存的数据类型,sp的保存位置,注意事项等
文件存储,常规文件操作(I/O读写操作、文件的创建/删除/复制)、外置sdcard卡的文件存储,读写权限, 如何使用FileProvider适配Android 7.0 (file uri exposed问题),应用目录下文件的创建存取(应用私有文件),压缩文件(zip/rar)的压缩与解压缩
2:SQLite数据库存储,SQLiteOpenHelper的使用,数据库需要升级时的注意事项(新老数据的保留),数据库表的创建/删除/清空,SQL语句语法(增删改查、排序、多表联查),利用execSql和系统提供的增删改查api两种方式操作,多线程操作数据库安全问题(加锁同步),大量频繁数据库操作使用事务,第三方的基于数据库的开源库方案
3:ContentProvider,自定义ContentProvider的使用,ContentProvider的抽象方法增删改查的实现,ContentProvider如何在应用间共享数据,ContentProvider涉及的Uri概念理解,有哪些系统的ContentUrl,什么是ContentResolver,如何用ContentResolver查询手机的存储信息(如联系人、多媒体图片、音视频等)
4:网络存储,如何读取文件流上传文件(表单方式),如何下载文件并保存,如何提交json格式的数据,如何解析服务器返回的json数据,网络传输数据的加密解密,常规的数据提交方式(GET/POST)以及 Content-type的几种常见方式的理解(具体参考网络部分总结)

六、线程、进程

1:什么是进程,什么是线程,理解进程和线程的区别和联系(默认一个android应用是系统的一个进程,线程共享进程的所有资源,app的默认工作线程是主线程UI线程)
2:如何在app创建多进程/子进程,子进程与主进程的关系,进程间通信方式IPC(文件共享/Messenger/AIDL/ContentProvider/饿了么HermesEventBus等),app开启多进程有哪些好处/坏处,Android进程的优先级(前台/可见/服务/后台/空),如何提升app自身的进程优先级,进程保活方案,多进程情况下Application创建的区别(onCreate)
3:如何在app创建子线程,子线程与主线程的通信方式(共享内存变量/Handler/runOnUiThread/EventBus等),线程池的使用,如何手动创建线程池,线程池各个参数的合理设置,系统提供的四种线程池的使用,Thread和Runnable的区别,如何安全的取消/终止一个线程的运行(有几种方式),Thread类的wait() sleep() notify(),线程/线程池有上限吗
4:线程同步,多线程访问共享资源会带来的安全问题,线程死锁,线程同步的几种方式(同步方法/同步代码块/volatile/ThreadLocal/阻塞队列/原子变量)
5:AsyncTask的使用,AsyncTask三个方法的解析,AsyncTask源码实现原理解析,什么情况下AsyncTask的doInBackground会不被执行,为什么new AsyncTask只能执行一次,如何避免AsyncTask导致内存泄露、销毁Activity后它内部的AsyncTask一定会终止运行吗,如何取消AsyncTask
6:Handler, Handler发消息的所有使用方式及区别,为什么不能直接在子线程中直接new Handler ,如何Handler实现主线程给子线程发消息,Handler的消息队列实现原理,Handler与Looper、Message的关系,如何避免Handler内存泄漏,HandlerThread的使用
7:AIDL的实现使用,AIDL的原理分析(Binder机制)
8:EventBus实现原理分析

七、网络

1:七层网络结构OSI,每层的含义理解
2:域名解析的过程,一次网络请求的完整流程
3:HTTP协议,什么是HTTP协议,HTTP1.0与2.0的区别,http完整报文的格式(请求头、请求正文、响应头、响应正文),请求头和响应头中常用字段的含义解析,GET/POST,上传文件、上传json格式与普通文本数据的get/post方式的区别(报文角度解析),HTTP响应头各个状态码的含义, 常见网络框架是如何解析响应头/响应正文的,可以自定义响应头中的ResponseCode吗, Cookie和Session, 长连接和短连接
4:TCP三次握手, TCP与UDP的区别,Android代码实现TCP和UDP通信(Socket api实现),Socket,如何使用Socket自定义协议(如可以用Socket api实现http协议,或任何双方约定好的自定义协议),使用Websocket实现收发消息等
5:常见网络请求库(OkHttp3/Volley/Retrofit)及实现原理解析,原生的网络请求使用,理解异步请求和同步请求
6:Https安全通信,与Http的区别,TSL/SSL加密协议,CA证书,防止运营商劫持
7:如何自己实现一个网络请求框架

八、WebView

1:WebView的基本使用和设置方法
2:WebView JS与原生代码交互的几种方式(方法互调、传参、返回值),优缺点/安全性,JSBridge, 如何自定义协议实现一个JSBridge
3:WebView的各种坑,避免WebView内存泄漏
4:WebView安全漏洞,不同Android版本的差异,如何避免WebView安全漏洞
5:Hybrid App混合开发的原理,Hybrid与原生开发有哪些优势与不足,H5/CSS/JS语法了解

九、图片

1:主流图片格式(png jpg gif bmp wbmp )的区别,ARGB_8888,RGB_888,RGB_565, RGB_444等色彩格式的区别
2:如何计算一张图片(Bitmap)在Android中占用的内存大小分析(加载网络/sdcard图片与加载drawable下的图片两种),
3:图片的压缩,从图片尺寸(节约内存),图片大小(节约流量),图片格式(色彩像素大小)三方面考虑
4:加载大图注意事项,OOM
5:图片缓存,三级缓存,LRU Cache原理,缓存大小是如何调整的,Android提供的LRUCache解析
6:图片加载库(Glide/Picasso/Fresco)的使用方法,实现原理(如何做到保证跟Activity/Fragment生命周期一致的),使用的缓存策略,内存策略,如何自己实现一个图片加载库
7:如何从图片文件/资源图片文件加载Bitmap. Bitmap压缩存储到文件
8:图片剪裁、旋转、缩放
9:圆角图片的实现(几种方式)以及其他各种形状图片
10:图片选择库,第三方开源的与调用系统的

十、Camera相关

1:利用系统Camera api自定义一个Camera的流程,如何配合Surfaceview/TextureView使用,Camera参数的设置,Camera预览,预览大小拍照大小的选择,预览画面旋转角度问题的处理,闪光灯,前置摄像头与后置摄像头切换,自动对焦问题,Camera坐标系,如何捕获Camera预览数据保存为图片(拍照功能的实现),保存图片时旋转角度问题的处理,何时需要释放Camera资源(不释放会导致什么问题),如何打开系统相机进行拍照/录视频(需要注意什么),Camera录制视频(配置MediaRecorder使用)
2:Camera2,Camera2与Camera的区别,Camera2中常用的类,如何利用Camera2实现预览、拍照等功能

十一、音视频相关

1:使用MediaRecorder录制音频
2:使用MediaRecorder录制视频(配合Camera使用)
3:使用AudioRecord录制音频,特殊格式如Mp3格式的录制,Android常见哪些音频格式, 哪些是同时可以兼容IOS平台的
4:使用MediaPlayer播放视频/音频
5:使用AudioTrack播放音频
6:音视频编解码,常见的音视频的编码格式,硬解与软解/硬编与软编的区别及常用解决方案(目前硬件编解码主要是用Android的MediaCodec,软解编解码一般是采用开源库FFMpeg)
7:视频的特效实现(如滤镜、合成、转场、涂鸦、水印、美颜、叠加等),美拍、抖音、直播等视频特效,市场主流的短视频SDK
8:Android视频直播的实现(推流、播放),流媒体,主要的流媒体协议(RTMP、RTSP等),跟HTTP区别是什么,市场主流的直播SDK
9:视频播放器,自定义实现播放功能(MediaPlayer或VideoView), 播放本地视频/在线视频,常见开源播放器引擎(如bilibili的ijkPlayer的,Google的ExoPlayer)的学习使用源码解析,如何实现常见视频app软件的弹幕、音量调节、亮度调节、 倍速调节、 清晰度切换等功能(可以参考主流开源库GSYVideoPlayer、JiaoZiVideoPlayer等的实现)
10:录屏(视频/Gif),截屏

十二、ViewPager相关

1:ViewPager + PagerAdapter+View的使用方式
2:ViewPager + FragmentPagerAdapter + Fragment的使用方式
3:ViewPager的页面预加载特性,如何防止/进行数据预加载(View和Fragment两种),PagerAdapter/FragmentPagerAdapter 的缺陷,ViewPager刷新问题(PagerAdapter/FragmentPagerAdapter), POSITION_NONE问题
4:ViewPager的常见特效实现,如无限循环滑动的Banner广告条,单页显示3个Item的ViewPager炫酷切换效果,ViewPager换页滑动特效(PageTransformer应用动画效果)
5:ViewPager的左右滑动监听,PageChangeListener中的几个方法解析,ViewPager指示器,自定义实现,常见开源库(ViewPagerIndicator、MagicIndicator)

十三、RecyclerView相关

1:RecyclerView的基本使用方式,如何使用RecyclerView的三种布局管理器LinearLayoutManager、GridLayoutManager、StaggeredGridLayoutManager实现以前ListView、GridView以及瀑布流的效果,RecyclerViewAdapter的使用,多类型布局的、分组布局的Adapter使用(可以参考RecyclerViewAdapter简化使用开源库BRVAH),RecyclerView设置header/footer, RecyclerView上拉刷新、下拉刷新(配合SwipeRefreshLayout),RecyclerView设置分割线(ItemDecoration),RecyclerView点击事件
2:RecyclerView的源码解析,与ListView相比的差异, ViewHolder
3:RecyclerView的局部刷新,如何只刷新某一项,只刷新某一项中的某个控件,与ListView的局部刷新比较

十四、Canvas相关

1:Canvas基本使用方法,画笔Paint的使用,Canvas绘制各种形状、文字、图片、曲线,Canvas画笔设置,Canvas剪裁,Canvas的现场保存/恢复,Canvas的变换、平移、缩放、旋转等
2:Canvas在自定义View当中的使用

十五、传感器相关

1:GPS, 如何使用Android原始代码实现GPS定位的获取(LocationManager),权限,注意事项(耗电量高,不能一直开着),拓展:LBS基站定位(国内常用的地图SDK高德/百度等定位都是以上两种方式的组合)
2:其他手机支持的常见传感器,如加速度传感器、方向传感器、陀螺仪传感器、重力传感器、加速度传感器、距离传感器、计步传感器、光线传感器等,如何代码中设置监听器实时监听这些传感器的变化参数值,SensorManager,注册/反注册监听

十六、性能优化

1:ANR, 什么是ANR, Activity/BroadcastReceiver/Service对ANR的响应时间,ANR产生的根本原因是什么,如何避免ANR, 如何避免在UI线程执行耗时任务,哪些日常操作任务是耗时任务(文件I/O、数据库、网络、解析等等)、有哪些方式可以异步处理耗时任务(线程、Aynctask等),区分UI线程和子线程,哪些日常场景是在UI线程中运行的(如四大组件都是在UI线程执行的),在不确定是UI还是非UI线程的运行环境中如何判断当前是否是主线程?(有几种方法)
2:OOM,什么是OOM, 哪些情况容易产生OOM,如何避免OOM
3:ListView优化,理解ListView的重用item机制原理,利用ViewHolder缓存view减少getView的执行时间,减少ItemView的布局层次,减少getView方法中的判断/计算/耗时逻辑,item中的图片避免每次都重新加载,做好图片缓存(使用图片加载库),快速滑动时不加载图片, 数据分页加载,图片错乱问题
4:UI 卡顿,UI 卡顿的原因,帧率,16ms, 过渡绘制,耗时任务,如何布局优化,减少布局嵌套
5:内存泄漏,GC垃圾回收机制,可能造成Android内存泄漏的几种情况,如何避免内存泄漏,Java内存分配管理的机制,堆内存和栈内存的区别,Android系统会为一个应用分配多大内存,如何提高应用内存,内存泄漏的排查方法/工具
6:内存优化,弱引用与软引用(Weakreference、Softreference), 避免对Activity作为Context的长时间引用或静态引用(如创建Handler AsyncTask的正确姿势),SparseArray, 为什么Android推荐使用SparseArray来替代1:HashMap? 优越在哪里
7:Crash崩溃异常,ForceClose,各种运行时异常(如空指针),如何避免,发生Crash时如何在app中捕获并保存本地或上传服务器
8:广播和Service中可以进行网络请求吗,可以执行耗时任务吗
9:AS哪些工具可以用来排查性能问题
10:电池优化,网络优化 (缓存/离线)

十七、UI适配

1:px、dp、sp、像素密度density和屏幕分辨率以及屏幕尺寸之间的关系,res/drawable-xxx各个文件夹与屏幕像素密度之间的关系
2:保证不同屏幕展示的效果最好用Android系统提供的布局属性,不要写死固定大小,图片按照比例放在不同密度的drawable文件下或只用一套
3:使用百分比布局(PercentxxxLayout)
4:使用约束布局(ConstraintLayout)
5:目前主流适配方案,今日头条屏幕适配方案和smallestWidth限定符适配方案分析
6:目前市面上流行的刘海屏幕适配方法目前市面上流行的刘海屏幕适配方法

十八、Android中的Context

1:理解Context的含义,Activity、Context、Application的区别和使用场景, ContextWrapper解析,getActivity()/getContext()/getApplication()/getApplicationContext()的区别
2:避免Context静态持有,避免内存泄漏

十九、序列化与反序列化

1:Serializable实现,实现方法,Intent传递与获取Serializable的方法
2:Parcelable实现,实现方法,,Intent传递与获取Parcelable的方法
3:Serializable和Parcelable区别,适合的使用场景(存储在内存中,推荐使用parcelable,存储在硬盘上,推荐使用Serializable)

二十、JSON解析

1:理解json格式的定义,什么是合法/不合法的json格式,什么样的json格式利于/不利于客户端开发的解析
2:Json的解析,使用原生代码解析,使用第三方库解析(Gson、FastJson、Jackson),Java类与Json字符串互转,注意事项,同一个字段多类型的json解析

二十一、二维码

1:二维码扫描,基于ZXing或Zbar开源库的开发(如开源库BGAQRCode-Android),如何提高二维码扫描的识别率,生成二维码

二十二、Permission权限

1:Android 6.0以后的权限适配,动态检查是否有某项权限,动态申请权限,申请权限的回调处理(有哪些第三方库可简化处理)、明确哪些行为是危险权限需要动态申请的,6.0以前的权限处理方式对比

二十三、Activity工作原理

1:从手指点击桌面的app开始到界面呈现发生了哪些过程,第一个Activity对象是如何被创建的,Application对象是如何被创建的,默认的工作线程(UI线程)是如何创建的,主线程Looper的如何创建的,Activity与Window的关系,WindowManager解析,Android系统是如何通过WindowManager管理窗口的

二十四、View事件分发机制

1:Touch事件的各个Action含义,何时会被触发
2:Touch事件在View之间的传递过程(View、ViewGroup、Activity),分发与处理的流程,何时会被消费,何时会被拦截,如何解决滑动冲突, onTouch 和 onTouchEvent区别,onClick与onTouch的关系
3:Android手势处理,双指缩放、双击、单击,多点触控

二十五、View的绘制流程

1:Activity的setContentView()做了什么,Window&PhoneWindow&DectorView&ViewRoot&contentView之间的关系
2:View绘制的三个阶段measure,layout, draw的解析
3:requestLayout,onLayout, onDraw, drawChild的区别与联系
4:invalidate与postInvalidate的区别与联系

二十六、自定义view基本流程

1:自定义属性,onMesure(),onLayout(ViewGroup) , onDraw(), TouchEvent的处理
2:组合控件的自定义方式

二十七、Apk的打包/安装过程

1:apk的打包过程,经过哪些步骤,每个步骤做了什么,AS的打包过程执行哪些task,每个task干了什么,apk签名(签名文件生成,AS打包apk时v1与v2选项的区别),apk对齐,apk加固(第三方都是如何实现的)
2:apk的安装过程,系统在安装之前会做哪些工作?校验哪些信息?(不同Android版本之间的差异),安装apk的过程做了什么,会生成哪些文件,apk会被安装到系统哪个路径,app的私有数据(sp/数据库/私有文件)存储在哪个路径,哪些情况下安装apk会不成功,覆盖安装时(app升级)与app的包名、签名、版本号versionCode之间的关系, 什么是ART, Android 5.0以后ART替代之前的Dalvik虚拟机有哪些优点,AOT,为啥5.0以后安装的时候时间特别长但是运行速度比以前快
3:app的卸载过程发生了什么,系统会删除哪些与apk相关的东西

二十八、App混淆

1:混淆常用基本语法,混淆类、成员、方法,哪些类需要混淆,哪些类不能被混淆的,混淆文件的配置
2:如何根据混淆之后的错误日志定位混淆之前的代码

二十九、App冷启动优化

1:冷启动与热启动的区别,从点击桌面app图标到app的第一个Activity页面呈现经历了什么,优化哪个地方能加快页面的呈现
2:如何实现app冷启动秒开,如何避免冷启动白屏/黑屏/缓慢,有哪些优化方案

三十、子线程不能更新UI

1:正常情况下子线程不能更新UI,“子线程不能更新UI”这句话是一定的吗?什么情况下子线程可以更新UI?(如这个UI控件是由这个线程创建时,SurfaceView也可以在单独线程中刷新,OpenGL可以在渲染线程中绘制)
2:view.postDelay(Runnable r)方法是运行在子线程中的吗?区分哪些场景是在主线程中的

三十一、Android Studio Gradle

1:build.gradle常用配置,minSdkVersion、targetSdkVersion、compileSdkVersion三者的关系区别,这三个值对app代码开发/安装运行/版本更新时的影响,包名/签名/混淆/源码路径的配置、如何利用BuildConfig添加自定义的属性配置,从gradle中加载properties配置文件,如何在gradle中开启/关闭混淆/调试/Log输出,如何使用gradle任务打包,如何在dependence中添加依赖(本地jar包、aar包、so库依赖,远程依赖),3.0以后的implementation、api、compileOnly与3.0以前的compile provided的区别,如何配置product falvor实现Build Variant变体打包,简单的Gradle task定义,指定task依赖任务,Android Studio的Gradle任务分析,Gradle插件,Gradle版本/仓库配置,groovy语法了解

三十二、adb相关

1:掌握常用的adb命令,如使用adb pull/push从手机中拉取/推送文件,adb 截屏,使用adb 抓取log日志, 使用adb 安装/卸载应用,adb命令下调试应用等等

三十三、逆向安全

1:app敏感数据的存储,如账户密码,请求的秘钥等,银行类交易类自定义输入键盘(避免拦截),设备唯一标识(Android目前有哪几种方式)
2:反编译 apk, 反编译so等, 混淆
3:app加固
4:如何防止app网络请求被第三方抓包(socket/https)
5:WebView开发JS交互避免远程执行漏洞
6:加密算法(DES,AES,RSA,MD5,SHA1,Base64),对称加密与非对称加密
7:视频加密

三十四、NDK开发

1:JNI基本数据类型,jni函数签名,jni注册native函数的两种方式(静态、动态)
2:java与jni互调,java如何调用jni层,jni层如何调用java代码, JNI各种层数据类型与Java/C层各种数据类型互转调用
3:Android.mk文件编写,如何连接源文件、.a .so库文件,如何编译生成动态链接库so文件,编译不同平台的so, 编译生成arm64位平台so时注意什么(指针要long型存), Application.mk, build过程解析
4:Android Studio环境下如何使用CMake方式进行NDK开发

三十五、设计模式

1:UML类图、时序图
2:OO六大设计原则,面向对象的三个基本特征
3:23种设计模式,了解常用常见的设计模式并在项目中实践,Android源码中的设计模式
4:如何优化代码,如何重构代码,去除重复代码,代码规范

三十六、架构模式

1:MVP模式, MVP、 MVC、MVVM(数据绑定式的MVP)的区别, MVP + Clean模式
2:模块化(从功能/业务上区分)
3:组件化的开发架构,组件化带来的问题,模块之间的跳转,路由,ARouter
4:插件化的开发架构,插件化的核心原理,虚拟机(内存管理,类加载,双亲委派), 主流插件化框架原理分析
5:热修复核心原理,主流热修复框架原理分析

RxJava

  • 实现原理,什么是响应式编程,观察者/订阅模式,RxJava是如何实现线程自由切换的, RxJava在空间和时间维度上重新组织事件的能力

Kotlin

  • Kotlin学习了解,与Java的区别,哪个更好用

Dagger 2

  • 依赖注入框架,使用与原理解析

Flutter

  • Flutter学习了解,跨平台,同时支持iOS和Android

Weex

  • Weex学习了解,跨平台,同时支持iOS和Android

Hybrid 混合开发

  • 除H5以外,有哪些混合开发方式(weex,小程序,React Native等了解)

OpenGL

  • OpenGL了解,了解OpenGL 的渲染流程(顶点着色器、片元着色器、光栅化、顶点坐标系、法向量、光照、投影、剪裁等等)
  • 学习Android系统中OpenGL ES 2.0/3.0的Api,使用OpenGL配合GLSurfaceView、Render等绘制点、线、面、纹理贴图等等

测试工具

  • 内存分析:MAT,DDMS,Leakcanary(Square)
  • 静态分析:Find Bugs,Lint
  • 压力测试:Monkey
  • 自动化测试: UiAutomator,MonkeyRunner,Rubotium,Athrun(淘宝)

其他冷门知识

  • Android近场通信NFC、Wifi、蓝牙、USB串口通信等开发
  • Android内核移植、嵌入式终端开发(非手机,如定制的平板、TV,定制的点餐平台,显示器等), 或基于终端系统之上的应用开发
  • 手机开发(非app开发,这里指手机厂商,如华为,小米,需要精通framework层以及Android系统底层源码),手机操作系统定制
  • Android游戏开发(这个不算冷门,只是平时接触比较少)

其他补充:

  • Notification
  • Dialog
  • Bitmap对象的理解
  • AndroidManifest的作用与理解
  • App中唤醒其他进程/应用的实现方式
  • ButterKnife实现原理
  • Dagger依赖注入
  • Android 多进程和Application关系
  • Android页面恢复
  • 如何监听Home键和back键点击
  • apk多入口
  • 第三方消息推送SDK
  • 地图
  • 硬件加速
  • Emoji
  • 多国语言适配(不单单指语言strings.xml适配 布局也可能要支持RTL)
  • 正则表达式
  • armeabi/armeabi-v7a/arm64-v8a等so库兼容问题
  • 类的加载机制
  • Android 65K问题,分包,引入第三方包冲突解决方案
  • 计时器/定时任务(Android有哪几种实现方式)
  • Theme 和 Styles
  • 多点触控
  • 闹钟
  • 音乐播放器
  • 输入法软键盘相关
  • 分屏
  • 夜间模式
  • 待续…

Java部分

一、Java基础

1:Java基础数据类型,各占用多少字节,数据类型之间的相互转换,数据类型之间的比较==和equals的区别
2:String、StringBuffer、StringBuilder区别,哪个是线程安全的,何时需要使用后面两个(有什么区别),String属于Java的基础数据类型吗,字符串操作(分隔、拼接、替换、查找),字符串比较,String与其他基础数据类型的包装类型之间的互转,String与char或byte Array之间的互转,创建字符串变量有几种方式有什么区别,什么是字符串池,为什么说Java字符串是不可变对象
3:Java集合相关,集合的排序/遍历/复制, HashMap原理,HashMap 和 HashTable 区别,LinkedHashMap源码分析, HashCode 作用,如何重载hashCode方法,ArrayList与LinkList区别与联系, List与数组[]相互转换,List,Set,Map的区别,ConcurrentHashMap的实现原理,要存储一个数据元素不重复的集合该使用哪种集合,要存储一个数据元素是有序的集合该使用哪种集合,ArrayList和HashMap 等集合是如何扩容的
4:Java反射相关,方法、成员变量
5:Java注解相关
6:Java线程同步相关,Java死锁产生的原因及避免,方法锁、对象锁、类锁的意义和区别,线程同步的方法:Synchronized、lock、reentrantLock分析,Synchronized原理,Volatile实现原理,ThreadLocal的原理和用法,ThreadPool的用法和示例,wait()和sleep()的区别,wait/notify关键字的理解
7:Java枚举相关
8:Java内存管理,虚拟机 ,GC机制,Java引用类型,循环引用,Java内存泄漏,Java内存模型(堆内存 栈内存 常量池),Java中new 一个对象是存在哪里的
9:JVM类加载机制,ClassLoader(类加载器)的理解,Android中的区别
10:什么是多态,Java封装、继承和多态的理解
11:什么是内部类?内部类的作用,静态内部类的作用
12:什么是抽象类,抽象类和接口区别,抽象类是否可以没有方法和属性,接口的意义
13:Java泛型相关,如何通过泛型传递Java类作为参数
14:序列化的方式 Serializable 和Parcelable 的区别
15:静态属性和静态方法是否可以被继承?重写?以及原因?
16:final,finally,finalize的区别
17:utf-8编码中的中文占几个字节;int型几个字节?,java unicode编码,中文与unicode互转
18:什么是深拷贝和浅拷贝
19:如何实现多线程断点续传
20:Class.forName()和ClassLoader的区别
21:待续…

二、Java数据结构和算法

1:栈和队列,栈和队列的概念理解,Java代码实现栈LIFO(后进先出)和队列FIFO(先进先出),实现思路,入栈/出栈,栈顶/栈底,入队/出队,队头/队尾,栈/队的遍历,循环队列,判断栈/队列是否为空
2:数组和链表,数组和链表的特点和区别,Java代码实现链表结构,数组和链表分别实现查找、插入,删除等操作以及各自的时间复杂度和空间复杂度,链表的反序,两个有序链表的合并,双向链表结构的实现,双向链表的插入、删除等,自定义一个动态数组,Java 类中哪些结构属于数组/链表
3:排序算法,Java八大排序算法的实现思路(选择排序,快速排序,冒泡排序,堆排序,希尔排序,归并排序,直接插入排序,基数排序)以及各自的时间复杂度和空间复杂度,最快的排序算法是哪个? 哪些是稳定/不稳定的排序算法,快排的优化,手写冒泡、快排代码
4:查找算法,Java代码实现顺序查找和二分查找,实现思路
5:二叉树,二叉树排序,二叉树遍历、查找、删除,哈夫曼树、红黑树
6:Hash表,及Hash冲突的解决
7:Java有向图的遍历,BFS遍历和DFS遍历(深度优先搜索算法和广度优先搜索算法)、Prim、Dijkstra算法
8:经典问题:海量数据的处理 (10亿个数中找出最大的10000个数 TOP K问题)
9:两个不重复的数组集合中,两个集合都是海量数据,内存中放不下,求共同元素
10:烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?
11:时针走一圈,时针分针重合几次
12:N*N的方格纸,里面有多少个正方形
13:待续…

坚持原创技术分享,您的支持将鼓励我继续创作!