目录
2. Android 系统架构: 应用层、Framework、系统运行库层(Android Runtime)、硬件抽象层(Hal),、Linux内核层
5. 进程保活的方式,如何保证一个后台服务不被杀死?比较省电的方式是什么?App中唤醒其他进程的实现方式?
6. Activity, View, Window, Surface, SurfaceView, DecorView, ViewRoot
10. android系统的低电耗模式(Doze模式)是怎么工作的
14. Android进程分类?进程和 Application 的生命周期?进程调度
1. 自定义view的过程,ViewGroup和View有什么不一样
3.1 Service生命周期, startService和BindService
4. Activity和Fragment的生命周期,各生命状态发生在什么情况下; Fragment和Activity的通信方式
Framework
1. Android 系统启动过程:
https://zhuanlan.zhihu.com/p/80806364 关于Android系统启动,你需要知道这些步骤
https://blog.51cto.com/ticktick/1659473 Android内核开发:图解Android系统的启动过程
https://www.lagou.com/lgeduarticle/82941.html Android 系统启动流程
https://www.jianshu.com/p/e084414c7e1c Android系统启动(一)-开篇
(1)Bootloader引导
(2)Linux kernel启动,寻找init.rc文件
(3)init进程启动:
init 进程是所有用户进程的鼻祖
创建一些文件夹并挂载设备; 初始化和启动属性服务;解析init.rc和其他服务的rc文件(每个服务一个rc文件, 包括native服务), 启动对应的系统级进程,包括Zygote
(4)Zygote启动:通过JNI方式调用ZygoteInit.main()进入java世界, fork System Server进程, System Server进程启动所以的Android核心服务, 接着通过ActivityManagerService启动Home
(5)launcher启动
2. Android 系统架构: 应用层、Framework、系统运行库层(Android Runtime)、硬件抽象层(Hal),、Linux内核层
3. 应用安装
(1)具体说清一个应用程序安装到手机上时发生了什么
(2)应用安装的几种方式:system/priv-app, data/app , 预装应用,应用市场应用,adb install的应用
(3)packageManagerService的启动过程
4. App启动流程,从点击桌面开始
5. 进程保活的方式,如何保证一个后台服务不被杀死?比较省电的方式是什么?App中唤醒其他进程的实现方式?
Android进程保活终极方案总结 https://blog.csdn.net/hxl517116279/article/detail
-
Android 如何保证service在后台不被kill https://www.cnblogs.com/sjm19910902/p/6396499.html
6. Activity, View, Window, Surface, SurfaceView, DecorView, ViewRoot
(1)简析Window、Activity、DecorView以及ViewRoot之间的错综关系 https://www.jianshu.com/p/8766babc40e0
ActivityThread.handResumeActivity() -> getDecorView() -> WindowManager.addView(DecorView, WindowManager.LayoutParams) -> ViewRoot.setView(DecorView, WindowManager.LayoutParams, ...) -> ViewRootImpl.performTraversals() -> activity.makeVisible() -> DecorView.setVisibility(Visible
(2)Android的Surface、View、SurfaceView、Window概念整理
http://www.360doc.com/content/19/0927/10/8335678_863480139.shtml
(3)SurfaceView、GLSrurfaceView
SurfaceView继承自View,有两个子类:GLSurfaceView, VideoView
View和宿主Window共用一个绘图表面surface; 而SurfaceView虽然也在View的属性结构中,但有自己的surface, 内部持有一个Canvas;
每一个窗口在SurfaceFlinger服务中都对应有一个Layer,用来描述它的绘图表面。对于那些具有SurfaceView的窗口来说,每一个SurfaceView在SurfaceFlinger服务中还对应有一个独立的Layer或者LayerBuffer,用来单独描述它的绘图表面,以区别于它的宿主窗口的绘图表面。
SurfaceView是用Zorder排序的,默认在宿主Window的后面,SurfaceView通过在Window上面“挖洞”(设置透明区域)进行显示。
View的绘图效率不高,用于动画变化较少的程序; SurfaceView的绘图效率较高,用于界面更新频繁的程序
SurfaceView的UI可以在一个独立的线程中进行绘制,可以不占用主线程。
SurfaceView采用双缓冲机制: frontCanvas, backCanvas
不能进行平移,缩放等变换(对SurfaceView进行ScrollBy,ScrollTo操作没有效果(还有透明度,旋转)
使用SurfaceView的步骤:
首先要继承SurfaceView,实现SurfaceHolder.Callback接口。
重写方法:
surfaceChanged:surface大小或格式发生变化时触发,在surfaceCreated调用后该函数至少会被调用一次。
surfaceCreated:Surface创建时触发,一般在这个函数开启绘图线程(新的线程,不要再这个线程中绘制Surface)。
surfaceDestroyed:销毁时触发,一般不可见时就会销毁。
利用getHolder()获取SurfaceHolder对象,调用SurfaceHolder.addCallback添加回调
SurfaceHolder.lockCanvas 获取Canvas对象并锁定画布,调用Canvas绘图,SurfaceHolder.unlockCanvasAndPost 结束锁定画布,提交改变。
————————————————
版权声明:本文为CSDN博主「lidongxiu0714」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010126792/article/details/86249399
7. IPC
(1)Binder机制
https://blog.51cto.com/ticktick/1659473
ServiceManager是什么:https://www.cnblogs.com/monsterdev/p/12685105.html
ServiceManager是binder服务的大管家,由Init进程解析init.rc文件创建,其本身也是一个Binder服务
(2)简述IPC, Binder和其他IPC的对比,
Intent中附加extras(Bundle): 只能在四大组件间的通信
共享文件,sharedPereference: 不支持高并发和即时通讯
Messager(基于Binder): 一对多的串行
ContentProvider(基于Binder): 数据源场景下的Binder
Socket: 网络交换
Binder: 支持一对多并发
(3)AIDL
(4)Parcelable: 文件序列化, Serializable: 内存序列化
(5) Messenger: https://www.cnblogs.com/linghu-java/p/8798374.html
8. 虚拟机相关
(1)JVM、Dalvik和ART
JVM 是 java虚拟机,是实现java夸平台的主要方式,可以使得java这样的高级语言编译成机器可以识别的机器语言,让java 可以一次编译,到处运行
Dalvik 是Android系统在上面运行的虚拟机,Dalvik虚拟机是专门为移动设备定制的,它允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用都是一个独立的Linux进程。独立的进程可以防止虚拟机崩溃的时所有进程都被关闭。
ART 是指 Android Runtime ,是安卓4.4之后推出替代DVM的,DVM中的应用每次运行时,字节码都需要通过即时编译器(Just In Time,JIT)转换成机器码,这会使应用的运行效率降低。而在ART中,系统在安装应用时会进行一次预编译(Ahead Of Time,AOT),将字节码预先编译成机器码并存在本地,这样应用每次运行时就不需要再执行编译了,能大大提高运行效率。
[Android Runtime (ART)和apk的预编译] https://blog.csdn.net/qq_25804863/article/details/48696619
(2)JVM内存区域划分
(3)JVM内存模型
(4)谈谈你对双亲委派模型理解
(5)逻辑地址与物理地址,为什么使用逻辑地址?
(6)Android为每个应用程序分配的内存大小是多少?Android中进程内存的分配,能不能自己分配定额内存?
9. android中UID和PID的作用及区别
PID是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID.进程中止后PID被系统回收,可能会被继续分配给新运行的程序,但是在android系统中一般不会把已经kill掉的进程ID重新分配给新的进程,新产生进程的进程号,一般比产生之前所有的进程号都要大.
UID在linux中就是用户的ID,表明是哪个用户运行了这个程序,主要用于权限的管理.而在android 中又有所不同,因为android为单用户系统,这时UID 便被赋予了新的使命,数据共享,为了实现数据共享,android为每个应用几乎都分配了不同的UID,不像传统的linux,每个用户相同就为之分配相同的UID.
如果让其他的开发者知道了我们的shareUserId,那我们的数据不是暴露了?
其实我们要使不同的程序能够相互访问,还需要拥有相同的签名,每个公司或者开发者的签名是唯一的,这样我们就不用担心了
10. android系统的低电耗模式(Doze模式)是怎么工作的
https://blog.csdn.net/qq_25804863/article/details/50229437
11. android最近几个版本的系统差异或特性
https://blog.csdn.net/qq_25804863/article/details/83348760
12. NDK
请介绍一下NDK,什么是NDK库?
13. JNI
jni用过吗?如何在jni中注册native函数,有几种注册方式?
Java如何调用c、c++语言?
jni如何调用java层代码?
14. Android进程分类?进程和 Application 的生命周期?进程调度
15.谈谈对进程共享和线程安全的认识
App部分
1. 自定义view的过程,ViewGroup和View有什么不一样
xml初始化和代码初始化
onMeasure-> onLayout -> onDraw/DispatchDraw
2. RecyclerView和ListView的性能对比
3. 四大组件,原理
Activity,Service,ContendProvider(ContendResolver, ContendObserver, Binder),BroadCast
3.1 Service生命周期, startService和BindService
startService: Service会经历onCreate->onStartCommand。stopService: onDestroy方法。调用者如果没有stopService,Service会一直在后台运行,下次调用者再起来仍然可以stopService。
bindService: Service会经历onCreate->onBind。这个时候调用者和Service绑定在一起。调用者调用unbindService方法或者调用者Context不存在了(如Activity被finish了),Service就会调用onUnbind->onDestroy。
多次调用startService,该Service只能被创建一次,即该Service的onCreate方法只会被调用一次。但是每次调用startService,onStartCommand方法都会被调用。Service的onStart方法在API 5时被废弃,替代它的是onStartCommand方法。
第一次执行bindService时,onCreate和onBind方法会被调用,但是多次执行bindService时,onCreate和onBind方法并不会被多次调用,即并不会多次创建服务和绑定服务。
3.2 ContentProvider
(1)ContentProvider:
四大组件的内容提供者,主要用于对外提供数据。实现各个应用程序之间的(跨应用)数据共享,比如联系人应用中就使用了ContentProvider,你在自己的应用中可以读取和修改联系人的数据,不过需要获得相应的权限。其实它也只是一个中间人,真正的数据源是文件或者SQLite等
一个应用实现ContentProvider来提供内容给别的应用来操作,通过ContentResolver来操作别的应用数据,当然在自己的应用中也可以
(2)ContentResolver:
内容解析者,用于获取内容提供者提供的数据,ContentResolver.notifyChange(uri)发出消息
(3)ContentObserver:
内容监听器,可以监听数据的改变状态
目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器,相应地ContentObsever也分为表ContentObserver、行ContentObserver,当然这是与它所监听的Uri MIME Type有关的
ContentResolver.registerContentObserver()监听消息
getContentResolver->ApplicationContentResolver->ContentProviderProxy<===IBidner====>Transport->NameProvider
query -> ApplicationContentResolver.acqireProvider -> ActivityThread.ActivityMnagerNative.getDefault(0.getContentProvider() -> ActivityMnagerService.getContendProviderImpl
(4)Contendprovider, COntentResolver, ContentObserver的关系
(5)ContentProvider的权限管理
3.3 BroadcastReceiver
(1)广播的分类和使用场景
(2)本地广播和全局广播有什么差别?
(3)BroadcastReceiver,LocalBroadcastReceiver 区别
4. Activity和Fragment的生命周期,各生命状态发生在什么情况下; Fragment和Activity的通信方式
Activity第一次启动:onCreate->onStart->onResume。
Activity切换到后台( 用户打开新的Activity或者切换到桌面) ,onPause->onStop(如果新Activity采用了透明主题,则当前Activity不会回调onstop)。
Activity从后台到前台,重新可见,onRestart->onStart->onResume。
用户退出Activity,onPause->onStop->onDestroy。
onStart开始到onStop之前,Activity可见。onResume到onPause之前,Activity可以接受用户交互。
在新Activity启动之前,栈顶的Activity需要先onPause后,新Activity才能启动。所以不能在onPause执行耗时操作。
onstop中也不可以太耗时,资源回收和释放可以放在onDestroy中。
5. Activity的四种launcherMode
Standard: 每次都会新建示例;
SingleTop: 默认和启动这一task。 如果task顶端中有该示例,则重用, 回调OnNewIntent;否则新建
以上两种,默认和启动者一个task,如果指定启动模式为NEW_TASK,则新建一个task。
SingleTask: 启动模式启动Activity时,首先会根据taskAffinity去寻找当前是否存在一个对应名字的任务栈
如果不存在,则会创建一个新的Task,并创建新的Activity实例入栈到新创建的Task中去
如果存在,则得到该任务栈,查找该任务栈中是否存在该Activity实例
如果存在实例,则将它上面的Activity实例都出栈,然后回调启动的Activity实例的onNewIntent方法
如果不存在该实例,则新建Activity,并入栈
此外,我们可以将两个不同App中的Activity设置为相同的taskAffinity,这样虽然在不同的应用中,但是Activity会被分配到同一个Task中去。
SingleInstance: 这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。
6. Context
深入理解 Android 中的各种 Context https://www.jianshu.com/p/31dbe3317fe1
(1) Context是个抽象类, ContextWrapper是封装Context的代理类
(2)ContextImpl继承自Context,ContextImpl 是 Context 的主要实现类,Activity、Service 和 Application 的 Base Context 都是由它创建的
(3) ContextWrapper的子类: ContextThemeWrapper(子类:Activity), Application, Service
(4) Activity的ContextImpl是在ActivityThread的创建和attach: performLaunchActivity
(5)Context的作用:
四大组件的交互,包括启动 Activity、Broadcast、Service,获取 ContentResolver 等
获取系统/应用资源,包括 AssetManager、PackageManager、Resources、System Service 以及 color、string、drawable 等
文件,包括获取缓存文件夹、删除文件、SharedPreference 相关等
数据库(SQLite)相关,包括打开数据库、删除数据库、获取数据库路径等
其它辅助功能,比如设置 ComponentCallbacks,即监听配置信息改变、内存不足等事件的发生
7. 事件分发
(1)DispatchTouchEvent -> OnInterceptEvent -> onTouchEvent
(2) InputManagerService -> WindowManagerServiece -> ViewRootImpl -> DecorView( mWindow.callback.disapatchTouchEvent )-> Activity -> PhoneWindow -> DecorView -> ViewGroup/View
8. 动画的几种类型:
(1)帧动画, 属性动画,补间动画
(2)Android动画框架实现原理
9. Android数据存储方式
10. 线程切换的方式
AsyncTask, Handler, EventBus, RxJava, IntentService