转载请注明链接:https://blog.csdn.net/feather_wch/article/details/81135996
Android面试题的基础题部分,包括系统架构,APK打包/安装、序列化等各方面的基本题目,因为范围比较杂,难以归类,所以都放在该文章中。
本文是我一点点归纳总结的干货,但是难免有疏忽和遗漏,希望不吝赐教。
Android面试题-基础题(18题)
版本:2018-7-25(17:17)
1、Android的系统架构分为几层,大概有哪些内容?
应用层
:Acyivity、Application、Service.Binder通信层
:Binder Proxy、Binder Driver系统服务层
:WindowManagerService、ActivityManagerService运行时层
:Davlik Runtime/ART Runtime硬件抽象层
:Camera HAL, Audio HalLinux内核层
:Camera Driver,Audio Driver
Intent
2、Android中Intent传递数据的大小限制?如何解决该问题?
大小限制大约是1MB
:超过该限制可能导致 OOM。- 解决办法
- 进程内:
EventBus
、文件缓存- 进程间:通过
ContentProvider
进行进程间数据共享和传递。总结: 不要通过 Intent 在 Android 基础组件之间传递大数据(binder transaction 缓存为1MB)
APK
3、APK的打包流程分为几部分?
- 资源打包
- 代码打包
4、APK打包流程(6步)
APPT工具
对资源文件进行打包(AndroidManifest.xml、布局等)
生成R.java文件
; 通过AIDL工具
处理AIDL文件,生成对应的Java文件
。Javac工具
对R.java、项目源码、aidl对应的Java文件
这三部分进行编译,生成class文件
Dex工具
将所有class文件
转换为DEX文件
:该过程进行将Java字节码
转换为Dalvik字节码
、压缩常量池
、清除冗余信息
等工作。ApkBuilder工具
将资源文件、Dex文件
打包成APK文件
KeyStore
对APK文件
进行签名。- 正式版APK,需要用
ZipAlign工具
进行对齐处理:过程中是将APK中所有资源文件的起始地址都便宜4字节的整数倍
,通过内存映射访问APK文件的速度会更快
5、APK的安装流程(6步)
复制APK
到/data/app目录
下,解压并扫描安装包。资源管理器
解析APK
里的资源文件。- 解析
AndroidManifest
文件,并在/data/data/
目录下创建对应的应用数据目录
- 对
dex文件进行优化
,并且保存在dalvik-cache
目录下。- 将
AndroidManifest文件
解析出的四大组件信息
注册到PackageManagerService
中。- 安装完成后,发送广播
6、点击应用图标是如何启动APP的?
- 点击应用图标后会去启动应用的
LauncherActivity
- 如果
LauncherActivity
所在进程没有创建,就会创建新进程(以Socket形式通知Zygote进程
去fork新进程)。- 整体的流程就是
Activity
的启动流程。
7、PathClassLoader和DexClassLoader的区别
PathClassLoader
: 只能加载安装到Android系统的APK,即/data/data
目录,是Android默认的类加载器。DexClassLoader
: 可以加载任意目录下的dex、jar、apk、zip
文件。
Context
7、Android有哪些Context的相关类?
Context抽象类
ContextImpl
:Context的实现类ContextWrapper
:Context的包装类(内部是ContextImpl
),Applicaiton、Activity、Service
都间接或者直接继承自ContextWrapper
进程
8、Android有哪些进程
- 前台进程: 用户当前操作所必须的进程
- 可见进程:没有任何前台组件,但是任辉影响屏幕上可见内容的进程。
- 服务进程:正在运行服务(该服务通过startService()启动),且不属于上面两者的进程。
- 后台进程:包含目前对用户不可兼得Activity的进程。
- 空进程:不包含任何活动组件的进程。
9、前台进程需要满足的条件(下列条件的任意一个)
- 具有
可交互的Activity
—该Activity已经调用onResume()
- 通过
bindService
启动的Service,并且绑定的Activity处于可交互状态。此时Service
的进程就是前台进程。- 明确调用了前台Service(
Service
执行了startForeground()
方法)—高版本的Service都必须要调用startForeground
,不然很容易被杀死。- 正在执行某一生命周期的Service(
onCreate、onStart、onDestory
)- 正在执行
onReceive()
的BroadcastReceiver处于前台进程。(onReceive()
是在UI线程执行的,即使用户在Home首页,此时广播接受器接收到广播就会处于前台进程。)
10、可见进程需要满足的条件(任意一条即可)
- 具有不在前台,但是任然可见的
Activity
- 绑定到
可见或者前台Activity
的Service
11、服务进程的作用
- 不影响用户交互的内容。
- 但是执行比较重要的任务,比如
下载
12、空进程的作用
- 用于
缓存
,能缩短下一次打开组件的时间。
13、如何进行进程保活
- 提升进程优先级,降低进程被杀死的概率。
- 拉活已经被杀死的进程。
14、如何提升优先级?
监控手机锁屏事件
锁屏
是启动一个像素的Activity,在用户解锁的时候,将Activity销毁掉,前台Activity会将进程变成前台进程,且优先级最高
15、如何拉活已经杀死的进程
利用广播拉活Activity
- 手机去监听
系统广播
:如开机广播,锁屏解锁广播等。
序列化
16、什么是序列化
序列化
就是将对象
转化为二进制流
,便于存储和传输
17、Serializable和Parcelable的区别
Serilizable
是java实现的一套序列化方法,会触发频繁的IO操作,效率较低,适合将对象存储到磁盘上的情况。Parcelable
是Android
提供的序列化方法。Parcelable
将序列化后的字节流写入到一个共享内存中,其他对象可以从该共享内存中读出字节流,并反序列化成对象,效率较高,适合对象间和进程间传递信息。
其他
18、64k问题的产生原因和如何解决?
- 产生原因:
Dex文件
中class、method的索引使用short类型
,因此如果方法、类的总数超过了2字节的short-65535
就会出问题。- 解决办法:使用
Google的Multidex