Android进阶面试题

2020-04-26  本文已影响0人  Vinson武

1. Android系统启动流程是什么?

==Android系统核心流程==:

进程启动过程:init进程 -> Zygote进程 –> SystemServer进程 –> 各种系统服务 –> 应用进程。

2. 启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么区别?

点击图标是因为启动程序(主界面也是一个app),发现了在这个程序中存在一个设置为入口的activity, 所以这个launcher会把icon提出来,放在主界面上。当用户点击icon的时候,发出一个Intent:

Intent intent = mActivity.getPackageManager().getLaunchIntentForPackage(packageName);
mActivity.startActivity(intent); 

从另一个程序跳过去,系统会根据第三方程序向系统注册的功能,为你的Intent选择可以打开的程序或者页面。

所以唯一的一点不同的是从icon的点击启动的intent的action是相对单一的,从程序中跳转或者启动可能样式更多一些。本质是相同的。

3. AMS家族重要术语解释

4. ==App启动流程==

点击应用图标后会去启动应用的Launcher Activity,如果Launcer Activity所在的进程没有创建,还会创建新进程,整体的流程就是一个Activity的启动流程。

image.png

整个流程涉及的主要角色有:

注:这里单独提一下ActivityStackSupervisior,这是高版本才有的类,它用来管理多个ActivityStack,早期的版本只有一个ActivityStack对应着手机屏幕,后来高版本支持多屏以后,就有了多个ActivityStack,于是就引入了ActivityStackSupervisior用来管理多个ActivityStack。

==整个流程主要涉及四个进程==:

有了以上的理解,==整个流程可以概括如下==:

image.png

5. ==理解Window和WindowManager==

6. 应用程序安装到手机上时发生了什么?

image.png

7. Android的打包流程?(即清点击 Android Studio 的 build 按钮后发生了什么?)apk里有哪些东西?签名算法的原理?

apk打包流程

Android的包文件APK分为两个部分:代码和资源,所以==打包方面也分为资源打包和代码打包两个方面==,下面就来分析资源和代码的编译打包原理。

image.png

==apk组成==

==为什么要签名==

什么是签名

签名是在Apk中写入一个“指纹”。指纹写入以后,Apk中有任何修改,都会导致这个指纹无效,Android系统在安装Apk进行签名校验时就会不通过,从而保证了安全性。

数字摘要

对一个任意长度的数据,通过一个Hash算法计算后,都可以得到一个固定长度的二进制数据,这个数据就称为“摘要”。

补充:

特征:

签名和校验的主要过程

签名就是在摘要的基础上再进行一次加密,对摘要加密后的数据就可以当作数字签名。

签名过程

校验过程

数字证书

如何保证公钥的可靠性呢?答案是数字证书,数字证书是身份认证机构(Certificate Authority)颁发的,包含了以下信息:

接收方收到消息后,先向CA验证证书的合法性,再进行签名校验。

注意:Apk的证书通常是自签名的,也就是由开发者自己制作,没有向CA机构申请。Android在安装Apk时并没有校验证书本身的合法性,只是从证书中提取公钥和加密算法,这也正是对第三方Apk重新签名后,还能够继续在没有安装这个Apk的系统中继续安装的原因。

keystore和证书格式

keystore文件中包含了私钥、公钥和数字证书。根据编码不同,keystore文件分为很多种,Android使用的是Java标准keystore格式JKS(Java Key Storage),所以通过Android Studio导出的keystore文件是以.jks结尾的。

keystore使用的证书标准是X.509,X.509标准也有多种编码格式,常用的有两种:pem(Privacy Enhanced Mail)和der(Distinguished Encoding Rules)。jks使用的是der格式,Android也支持直接使用pem格式的证书进行签名。

两种证书编码格式的区别:

jarsigner和apksigner的区别

Android提供了两种对Apk的签名方式,一种是基于JAR的签名方式,另一种是基于Apk的签名方式,它们的主要区别在于使用的签名文件不一样:jarsigner使用keystore文件进行签名;apksigner除了支持使用keystore文件进行签名外,还支持直接指定pem证书文件和私钥进行签名。

在签名时,除了要指定keystore文件和密码外,也要指定alias和key的密码,这是为什么呢?

keystore是一个密钥库,也就是说它可以存储多对密钥和证书,keystore的密码是用于保护keystore本身的,一对密钥和证书是通过alias来区分的。所以jarsigner是支持使用多个证书对Apk进行签名的,apksigner也同样支持。

Android Apk V1 签名原理

==V1签名和V2签名==

==v3签名key和v2还有v1有什么区别==?

  1. SignerData(签名者数据):主要包括签名者的证书,整个APK完整性校验hash,以及一些必要信息
  2. Signature(签名):开发者对SignerData部分数据的签名数据
  3. PublicKey(公钥):用于验签的公钥数据

8. 说下Android虚拟机和Java虚拟机的区别?

JVM和Dalvik虚拟机(DVM)的区别:

==Android2个虚拟机的区别==(一个5.0之前,一个5.0之后)?

Dalvik:Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它可以支持已转换为.dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik应用设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用作为独立的Linux进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。

ART:ART代表Android Runtime,其处理应用程序执行的方式完全不同于Dalvik,Dalvik是依靠一个Just-In-Time(JIT)编译器去解释字节码。开发者编译后的应用代码需要通过一个解释器在用户的设备上运行,这一机制并不高效,但让应用能更容易在不同硬件和架构上运行。ART则完全改变了这套做法,在应用安装的时候就预编译字节码为机器语言,这一机制叫Ahead-Of-Time(AOT)编译。在移除解释代码这一过程后,应用程序执行将更有效率,启动更快。

ART的优点:

ART缺点:

9. ==为什么系统不建议在子线程访问UI==?

这时你可能会问为何系统不对UI控件的访问加上锁机制呢?

10. ==怎么保证应用启动不卡顿? 黑白屏怎么处理?==

应用启动速度,取决于你在application里面时候做了什么事情,比如你集成了很多sdk,并且sdk的init操作都需要在主线程里实现所以会有卡顿的感觉。在非必要的情况下可以把加载延后或则开启子线程处理
另外,影响界面卡顿的两大因素,分别是界面绘制和数据处理。

黑白屏处理:

  1. windowIsTranslucent和windowNoTitle,将这两个属性都设置成true (会有明显的卡顿体验,不推荐)
  2. 如果启动页只是是一张图片,那么为启动页专一设置一个新的主题,设置主题的android:windowBackground属性为启动页背景图即可
  3. 使用layer-list制作一张图片launcher_layer.xml,将其设置为启动页专一主题的背景,并将其设置为启动页布局的背景。

11. 如何通过Gradle配置多渠道包?

  1. 首先在manifest.xml文件中设置动态渠道变量:
image.png
  1. 接着在app目录下的build.gradle中配置productFlavors,也就是配置打包的渠道:
image.png

最后在编辑器下方的Teminal输出命令行

  1. 执行./gradlew assembleRelease ,将会打出所有渠道的release包;
    执行./gradlew assembleVIVO,将会打出VIVO渠道的release和debug版的包;
    执行./gradlew assembleVIVORelease将生成VIVO的release包。

12. 对于应用更新这块是如何做的? (灰度,强制更新、分区域更新)

  1. 通过接口获取线上版本号,versionCode
    比较线上的versionCode
  2. 和本地的versionCode,弹出更新窗口
  3. 下载APK文件(文件下载)
  4. 安装APK

一般的处理就是进入应用就弹窗通知用户有版本更新,弹窗可以没有取消按钮并不能取消。这样用户就只能选择更新或者关闭应用了,当然也可以添加取消按钮,但是如果用户选择取消则直接退出应用。

二进制差分工具bsdiff是相应的补丁合成工具,根据两个不同版本的二进制文件,生成补丁文件.patch文件。通过bspatch使旧的apk文件与不定文件合成新的apk。 注意通过apk文件的md5值进行区分版本。

上一篇下一篇

猜你喜欢

热点阅读