美团24秋招 客户端一面
之前面的到家事业部,好像不合适。被转到了点评这边,目前美团已经OC了,之前太忙没顾得写面经,现在来回馈平台,写面经攒人品!顺便许愿其他的流程能OC
一面时间:2023.09.04
面试内容:
- Android账号体系实现多端密码验证同步怎么做?
- 请求后使用SharedPreferences保存token,然后以后的网络请求时,客户端先查询本地的token
- 在token保存时候,再打一个时间戳,或者设置一个时间变量,保证它的时效性
- 当Token过期的时候,可以分为手动处理和自动处理,手动处理跳转到重新登录的页面,自动处理调用请求函数重新获取,存储
- 当一端修改完密码后,让服务端发送请求给客户端,客户端接收到请求后,请求验证token时效性。如果请求错误,调用重新登录页面。
- 同时可以使用定时器,去定时更新Token的时效性
- 可以使用java.util.Timer
- Android 实现三方登录流程
- 客户端接入第三方SDK,也可以用集成框架,如SharedSDK;
- 发起登录授权请求:当用户选择第三方登录时,你的应用需要调用相应 SDK 提供的方法发起登录授权请求。
- 客户端使用上一步获得的授权,向认证服务器申请令牌。
- 认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
- 获取用户信息:使用授权码或访问令牌,在你的应用中向提供商发送请求,获取用户的相关信息,如用户ID、昵称、头像等
- 使用插件化的时候,如何解决资源冲突的问题?
- 在做插件化过程中,宿主需要用到插件的资源,涉及到加载插件的资源;因为插件是以apk的方式存在的,所以插件的ID和宿主的ID可能导致重复;
- Android项目中的资源常规是通过R文件来索引的。打包的时候aapt将工程中的资源名与id在R文件中映射起来。使用资源时是通过Resources获取的
- 经过上述的处理后,插件的资源和宿主的资源是混合再一起的,因为所有的资源索引不做处理时都是以0x7faabbbb格式按顺序生成的。所以会存在插件资源ID和宿主资源ID冲突的情况
- 资源隔离:资源隔离就是宿主和插件使用不同的Resources对象,这样使用的资源文件不同,不存在冲突。
- 宿主和插件的资源无法共享,使用起来不太方便
- 修改资源ID:
- Android的资源id是aapt生成的,修改aapt,让插件中的资源id不从0x7f开始,比如从0x6f开始
- 生成插件apk后,修改插件apk中resources.arsc文件。
- 难度太大
- 免资源固定方案:
- 处理 java 代码中引用宿主的资源
- 需要在编译过程中处理 R.jar,移除 class 中所有的 final 字段,就可以保证插件中引用宿主的资源 id 全部通过 R 进行引用
- 处理 xml 代码中引用宿主的资源
- 通过反编译修改插件中的public.xml文件中的索引值,以及修改smali中的R类值
- App打包的流程
- AIDL,将项目中的
aidl
文件编译为java
文件,AIDL用于进程间通信 - 生成buildconfig:在项目中配置了
buildConfigField
等信息,会在BuildConfig class类里以静态属性的方式展示 - 合并Resources、assets、manifest、so等资源文件:
- 资源处理使用的是aapt2.0
- AAPT 工具负责编译项目中的这些资源文件,所有资源文件会被编译处理.
- XML 文件(drawable 图片除外)会被编译成二进制文件,所以解压 apk 之后无法直接打开 XML 文件
- 但是 assets 和 raw 目录下的资源并不会被编译,会被原封不动的打包到 apk 压缩包中
- 资源文件编译之后的产物包括两部分:resources.arsc 文件和一个 R.java。前者保存的是一个资源索引表,后者定义了各个资源 ID 常量
- 编译java文件(用到的工具 javac )
- java文件包含之前提到的AIDL 生成的java文件
- java代码部份:通过
Java Compiler
编译项目中所有的Java
代码,包括R.java
、.aidl
文件生成的.java
文件、Java
源文件,生成.class
文件。在对应的build
目录下可以找到相关的代码 - kotlin代码部份:通过
Kotlin Compiler
编译项目中的所有Kotlin
代码,生成.class文件
- 将class文件打包成dex文件
- Android Studio 3.4之后,默认开启 R8(最早是dx,后续有D8,R8)
- 生成APK文件
- 而在
AGP3.6.0
之后,使用zipflinger
作为默认打包工具来构建APK
,以提高构建速度。(之前是apkbuilder) - zipalign(对齐处理)
- zipalign 对 apk 中的未压缩资源(图片、视频等)进行对齐操作,让资源按照 4 字节的边界进行对齐。这种思想同 Java 对象内存布局中的对齐空间非常类似,主要是为了加快资源的访问速度。
- APK签名(涉及不同版本的签名)
算法题:实现二叉树的层序遍历,用的队列
问的东西都比较结合实际开发,感觉如果只是看过一些文章,没实际上手,有一些细节很难回答