1.如何对 Android 应用进行性能分析java
2.什么状况下会致使内存泄露linux
3.如何避免 OOM 异常android
4.Android 中如何捕获未捕获的异常git
5.ANR 是什么?怎样避免和解决 ANR(重要)程序员
6.Android 线程间通讯有哪几种方式github
7.Devik 进程,linux 进程,线程的区别面试
8.描述一下 android 的系统架构数据库
9.android 应用对内存是如何限制的?咱们应该如何合理使用内存?json
10. 简述 android 应用程序结构是哪些canvas
11.请解释下 Android 程序运行时权限与文件系统权限的区别
12.Framework 工做方式及原理,Activity 是如何生成一个 view 的,机制是什么
13.多线程间通讯和多进程之间通讯有什么不一样,分别怎么实现
14.Android 屏幕适配
15.什么是 AIDL 以及如何使用
16.Handler 机制
17.事件分发机制
18.子线程发消息到主线程进行更新 UI,除了 handler 和 AsyncTask,还有什么
19.子线程中能不能 new handler?为何
20.Android 中的动画有哪几类,它们的特色和区别是什么
21.如何修改 Activity 进入和退出动画
22.SurfaceView & View 的区别
23.开发中都使用过哪些框架、平台
24.使用过那些自定义View
25.自定义控件:绘制圆环的实现过程
26.自定义控件:摩天轮的实现过程
27.GridLayout的使用
28.流式布局的实现过程
29.第三方登录
30.第三方支付
android 性能主要之响应速度 和UI刷新速度。
能够参考博客:Android系统性能调优工具介绍
首先从函数的耗时来讲,有一个工具TraceView 这是androidsdk自带的工做,用于测量函数耗时的。
UI布局的分析,能够有2块,一块就是Hierarchy Viewer 能够看到View的布局层次,以及每一个View刷新加载的时间。
这样能够很快定位到那块layout & View 耗时最长。
还有就是经过自定义View来减小view的层次。
内存泄露是个折腾的问题。
何时会发生内存泄露?内存泄露的根本缘由:长生命周期的对象持有短生命周期的对象。短周期对象就没法及时释放。
1. 静态集合类引发内存泄露
主要是hashmap,Vector等,若是是静态集合 这些集合没有及时setnull的话,就会一直持有这些对象。
2.remove 方法没法删除set集 Objects.hash(firstName, lastName);
通过测试,hashcode修改后,就没有办法remove了。
3.observer 咱们在使用监听器的时候,每每是addxxxlistener,可是当咱们不须要的时候,忘记removexxxlistener,就容易内存leak。
广播没有unregisterrecevier
4.各类数据连接没有关闭,数据库contentprovider,io,sokect等。cursor
5.内部类:
java中的内部类(匿名内部类),会持有宿主类的强引用this。
因此若是是new Thread这种,后台线程的操做,当线程没有执行结束时,activity不会被回收。
Context的引用,当TextView 等等都会持有上下文的引用。若是有static drawable,就会致使该内存没法释放。
6.单例
单例 是一个全局的静态对象,当持有某个复制的类A是,A没法被释放,内存leak。
当程序须要申请一段“大”内存,可是虚拟机没有办法及时的给到,即便作了GC操做之后
这就会抛出 OutOfMemoryException 也就是OOM
为了减小单个APP对整个系统的影响,android为每一个app设置了一个内存上限。
public void getMemoryLimited(Activity context) { ActivityManager activityManager =(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); System.out.println(activityManager.getMemoryClass()); System.out.println(activityManager.getLargeMemoryClass()); System.out.println(Runtime.getRuntime().maxMemory()/(1024*1024)); }
HTC M7实测,192M上限。512M 通常状况下,192M就是上限,可是因为某些特殊状况,android容许使用一个更大的RAM。
1.ArrayMap/SparseArray代替hashmap
2.避免在android里面使用Enum
3.减小bitmap的内存占用
inSampleSize:缩放比例,在把图片载入内存以前,咱们须要先计算出一个合适的缩放比例,避免没必要要的大图载入。
4.减小资源图片的大小,过大的图片能够考虑分段加载
大多数对象的复用,都是利用对象池的技术。
1.listview/gridview/recycleview contentview的复用
2.inBitmap 属性对于内存对象的复用ARGB_8888/RBG_565/ARGB_4444/ALPHA_8
这个方法在某些条件下很是有用,好比要加载上千张图片的时候。
3.避免在ondraw方法里面 new对象
4.StringBuilder 代替+
CrashHandler
关键是实现Thread.UncaughtExceptionHandler
而后是在application的oncreate里面注册。
ANR->Application Not Responding
也就是在规定的时间内,没有响应。
三种类型:
1). KeyDispatchTimeout(5 seconds) —主要类型按键或触摸事件在特定时间内无响应
2). BroadcastTimeout(10 seconds) —BroadcastReceiver在特定时间内没法处理完成
3). ServiceTimeout(20 seconds) —小几率类型 Service在特定的时间内没法处理完成
为何会超时:事件没有机会处理 & 事件处理超时
ANR的关键
是处理超时,因此应该避免在UI线程,BroadcastReceiver 还有service主线程中,处理复杂的逻辑和计算
而交给work thread操做。
1)避免在activity里面作耗时操做,oncreate & onresume
2)避免在onReceiver里面作过多操做
3)避免在Intent Receiver里启动一个Activity,由于它会建立一个新的画面,并从当前用户正在运行的程序上抢夺焦点。
4)尽可能使用handler来处理UI thread & workthread的交互。
首先定位ANR发生的log:
04-01 13:12:11.572 I/InputDispatcher( 220): Application is not responding:Window{2b263310com.android.email/com.android.email.activity.SplitScreenActivitypaused=false}. 5009.8ms since event, 5009.5ms since waitstarted CPUusage from 4361ms to 699ms ago ----CPU在ANR发生前的使用状况 04-0113:12:15.872 E/ActivityManager( 220): 100%TOTAL: 4.8% user + 7.6% kernel + 87% iowait 04-0113:12:15.872 E/ActivityManager( 220): CPUusage from 3697ms to 4223ms later:-- ANR后CPU的使用量
从log能够看出,cpu在作大量的io操做。
因此能够查看io操做的地方。
固然,也有可能cpu占用不高,那就是 主线程被block住了。
1)共享变量(内存)
2)管道
3)handle机制
runOnUiThread(Runnable)
view.post(Runnable)
Dalvik进程。
每个android app都会独立占用一个dvm虚拟机,运行在linux系统中。
因此dalvik进程和linux进程是能够理解为一个概念。
从小到上就是:
linux kernel,lib dalvik vm ,application framework, app
activitymanager.getMemoryClass() 获取内存限制。
关于合理使用内存,其实就是避免OOM & 内存泄露中已经说明。
1)main code
2) unit test
3)mianifest
4)res->drawable,drawable-xxhdpi,layout,value,mipmap
mipmap 是一种很早就有的技术了,翻译过来就是纹理映射技术.
google建议只把启动图片放入。
5)lib
6)color
文件的系统权限是由linux系统规定的,只读,读写等。
运行时权限,是对于某个系统上的app的访问权限,容许,拒绝,询问。该功能能够防止非法的程序访问敏感的信息。
Framework是android 系统对 linux kernel,lib库等封装,提供WMS,AMS,bind机制,handler-message机制等方式,供app使用。
简单来讲framework就是提供app生存的环境。
1)Activity在attch方法的时候,会建立一个phonewindow(window的子类)
2)onCreate中的setContentView方法,会建立DecorView
3)DecorView 的addview方法,会把layout中的布局加载进来。
线程间的通讯能够参考第6点。
进程间的通讯:bind机制(IPC->AIDL),linux级共享内存,boradcast,
Activity 之间,activity & serview之间的通讯,不管他们是否在一个进程内。
屏幕适配的方式:xxxdpi, wrap_content,match_parent. 获取屏幕大小,作处理。
dp来适配屏幕,sp来肯定字体大小
drawable-xxdpi, values-1280*1920等 这些就是资源的适配。
wrap_content,match_parent, 这些是view的自适应
weight,这是权重的适配。
Android Interface Definition Language
AIDL是使用bind机制来工做。
参数:
java原生参数
String
parcelable
list & map 元素 须要支持AIDL
参考:android 进程/线程管理(一)——消息机制的框架 这个系类。
android 事件分发机制
带你一块儿探究Android事件分发机制, 让面试提问不在畏惧!
EventBus,广播,view.post, runinUiThread
可是不管各类花样,本质上就2种:handler机制 + 广播
必须能够。子线程 能够new 一个mainHandler,而后发送消息到UI Thread。
视图动画,或者说补间动画。只是视觉上的一个效果,实际view属性没有变化,性能好,可是支持方式少。
属性动画,经过变化属性来达到动画的效果,性能略差,支持点击等事件。android 3.0
帧动画,经过drawable一帧帧画出来。
Gif动画,原理同上,canvas画出来。
具体可参考:https://i.cnblogs.com/posts?categoryid=672052
overridePendingTransition
view的更新必须在UI thread中进行
surfaceview会单独有一个线程作ui的更新。
surfaceview 支持open GL绘制。
1.EventBus 事件分发机制,由handler实现,线程间通讯
2.xUtils->DbUtils,ViewUtils,HttpUtils,BitmapUtils
3.百度地图
4.volley
5.fastjson
6.picciso
7.友盟
8.zxing
9.Gson
pull2RefreshListView
public class CycleView extends View { Paint mPaint = new Paint(); public CycleView(Context context) { this(context, null); } public CycleView(Context context, AttributeSet attrs) { super(context, attrs); initView(); } private void initView() { mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(20); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawCircle(100,100,50,mPaint); } }
关键是canvas.drawCycle & paint.setsytle(stoken)
参考连接
https://blog.csdn.net/k316378085/article/details/52316633
参考连接
https://blog.csdn.net/sz237812861/article/details/78383484?locationNum=4&fps=1
一些基础知识和理论确定是要背的,要理解的背,用本身的语言总结一下背下来。
虽然 Android 没有前几年火热了,已通过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级如下的岗位饱和了,如今高级工程师仍是比较缺乏的,我能明显感受到国庆后多了不少高级职位,因此努力让本身成为高级工程师才是最重要的。
好了,但愿对你们有所帮助。
接下来是整理的一些Android学习资料,有兴趣的朋友们能够加我wx:X1524478394 免费获取。
①Android开发核心知识点笔记
②对标“阿里 P7” 40W+年薪企业资深架构师成长学习路线图
③面试精品集锦汇总
④全套体系化高级架构视频
Android精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!如今都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现现在市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破本身涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
上述【高清技术脑图】以及【配套的架构技术PDF】能够 加我wx:X1524478394 免费获取