【Android面试】SDK相关面试题(二)
一、PathClassLoader和DexClassLoader有何区别?
根据art源码来看,两者都继承自BaseDexClassLoader, 最终都会创建一个DexFile,不同点是一个关键的参数: optimizedDirectory,PathClassLoader 为 null,DexClassLoader则使用传递进来的然后会根据optimizedDirectory判断对应的oat文件是否已经生成(null则使用/data/dalvik-cache/),如果有且该oat对应 的dex正确则直接加载,否则触发dex2oat(就是这家伙耗了我们宝贵的时间!!),成功则用生成的oat, 失 败 则 走解释执行
二、说说HttpClient与HttpUrlConnection的区别?并谈谈为何前者会被替代?
- android2.3之前,HttpUrlConnection具有一些bug, 例 如关 闭 输 入 流 时 可 能 导 致 连 接 池 关 闭 。
- android2.3之后,HttpUrlConnection才相对成熟。特 点 是 ,轻 量 、 api 少
- HttpClient一直很强大,支持get、post、delete等其他 协议。
被替代原因: 太重了,api太多;针对Android系统,不便于向后维护
三、什么是Lifecycle?请分析其内部原理和使用场景?
Jetpack的Lifecycle库:它可以有效的避免内存泄漏,解决Android 生命周期的常见难题。
内部原理:ComponentActivity 的 onCreate 方法中注入了ReportFragment,通过 Fragment 来实现生命周期监听。
使用场景:给 RecyclerView 的 ViewHolder 添加 Lifecycle 的能力。自己实现 LifecycleHandler,在 Activity销毁的时候,自动移除 Handler的消息避免 Handler导致的内存泄漏。
四、谈一谈Android的签名机制?
当面试题要考察你某个技术的理解时,除了他们两个在技术上的区别和特点之外。更希望听到的是在业务上的应 用, 技术是为业务服务的,展现你的业务能力远比展现你的技术能力要重要。
现在我将从技术和业务应用两个方面来剖析android v1和v2签名的区别。
关于v1和v2两种签名的技术上的区别上面 已经有很详细的回答了,那么我就说一说他们在业务应用方面的区别: 我们 有时候做app推广,需要记录这个APP是通过谁的推广 链接安装的,那么我我们只需要在每次通过服务器下发apk 的时候 对apk文件动一些手脚,在apk中标示这个apk是哪 个用户分享的,然后当apk安装好打开时就可以读到apk事 先存储好的 标示,从而实现我们需要的业务需求。给apk文件动手脚,v1支持,v1+v2的签名方式就不支持了。
五、谈谈安卓apk构建的流程?
- 使用aapt处理资源文件,如编译AndroidManifest.xml,编译生成resources.arsc,生成R.java等
- 使用javac等工具编译java文件,生成class格式文件
- 使用dx等工具将.class和项目依赖的jar编译成.dex
- 将生成的这些文件压缩进一个zip中
- 签名这只是最简单的过程,实际还会涉及到multidex,使用如proguard的工具处理生成的字节码,需要依赖aar文件, 需要编译kotlin,使用jack,使用jni,使用d8/r8等情况~
六、请简述Apk的安装过程?
#android面试#复制APK安装包到/data/app目录下,解压缩并扫描安装包,向资源管理器注入APK资源,解析AndroidManifest文件,并 在/data/data目录下创建对应的应用数据目录,然后针对Dalvik/ART环境优化dex文件,保存到dalvik-cache 目录,将AndroidManifest文件解析出的组件、权限注册 到PackageManagerService并发送广播。