| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> 2020面试题合集之吊打面试官系列(一),农民工看完都会了 -> 正文阅读 |
|
[移动开发]2020面试题合集之吊打面试官系列(一),农民工看完都会了 |
因此,Java提供ReferenceQueue来处理引用对象的回收情况。当SoftReference所引用的对象被GC后,JVM会先将softReference对象添加到ReferenceQueue这个队列中。当我们调用ReferenceQueue的poll()方法,如果这个队列中不是空队列,那么将返回并移除前面添加的那个Reference对象。 推荐文章:Java中的四种引用类型:强引用、软引用、弱引用和虚引用(https://segmentfault.com/a/1190000015282652#articleHeader3) 3、Apk的大小如何压缩 ? 参考回答:一个完整APK包含以下目录(将APK文件拖到Android Studio):
减少res,压缩图文文件:图片文件压缩是针对jpg和png格式的图片。我们通常会放置多套不同分辨率的图片以适配不同的屏幕,这里可以进行适当的删减。在实际使用中,只保留一到两套就足够了(保留一套的话建议保留xxhdpi,两套的话就加上hdpi),然后再对剩余的图片进行压缩(jpg采用优图压缩,png尝试采用pngquant压缩) 减少dex文件大小:
减少lib文件大小:由于引用了很多第三方库,lib文件夹占用的空间通常都很大,特别是有so库的情况下。很多so库会同时引入armeabi、armeabi-v7a和x86这几种类型,这里可以只保留armeabi或armeabi-v7a的其中一个就可以了,实际上微信等主流app都是这么做的。 只需在build.gradle直接配置即可,NDK配置同理 4、如何通过Gradle配置多渠道包? 参考回答:首先要了解设置多渠道的原因。在安装包中添加不同的标识,配合自动化埋点,应用在请求网络的时候携带渠道信息,方便后台做运营统计,比如说统计我们的应用在不同应用市场的下载量等信息 这里以友盟统计为例:
最后在编辑器下方的Teminal输出命令行:
推荐文章:美团Android自动化之旅—Walle生成渠道包(https://github.com/Meituan-Dianping/walle) 5、插件化原理分析 参考回答:插件化是指将 APK 分为宿主和插件的部分。把需要实现的模块或功能当做一个独立的提取出来,在 APP 运行时,我们可以动态的载入或者替换插件部分,减少宿主的规模
而热修复则是从修复bug的角度出发,强调的是在不需要二次安装应用的前提下修复已知的bug。 类加载机制:Android中常用的两种类加载器,DexClassLoader和PathClassLoader,它们都继承于BaseDexClassLoader,两者区别在于PathClassLoader只能加载内部存储目录的dex/jar/apk文件。DexClassLoader支持加载指定目录(不限于内部)的dex/jar/apk文件 插件通信:通过给插件apk生成相应的DexClassLoader便可以访问其中的类,可分为单DexClassLoader和多DexClassLoader两种结构。
资源加载:原理在于通过反射将插件apk的路径加入AssetManager中并创建Resource对象加载资源,有两种处理方式:
推荐文章: Android动态加载技术 简单易懂的介绍方式(https://segmentfault.com/a/1190000004062866) 深入理解Android插件化技术(https://yq.aliyun.com/articles/361233) 为什么要做热更新(https://www.cnblogs.com/baiqiantao/p/9160806.html) 6、组件化原理 参考回答:引入组件化的原因:项目随着需求的增加规模变得越来越大,规模的增大导致了各种业务错综复杂的交织在一起, 每个业务模块之间,代码没有约束,带来了代码边界的模糊,代码冲突时有发生, 更改一个小问题可能引起一些新的问题, 牵一发而动全身,增加一个新需求,需要熟悉相关的代码逻辑,增加开发时间
组件化开发流程就是把一个功能完整的App或模块拆分成多个子模块(Module),每个子模块可以独立编译运行,也可以任意组合成另一个新的 App或模块,每个模块即不相互依赖但又可以相互交互,但是最终发布的时候是将这些组件合并统一成一个apk,遇到某些特殊情况甚至可以升级或者降级 举个简单的模型例子: App是主application,ModuleA和ModuleB是两个业务模块(相对独立,互不影响),Library是基础模块,包含所有模块需要的依赖库,以及一些工具类:如网络访问、时间工具等。 **注意:**提供给各业务模块的基础组件,需要根据具体情况拆分成 aar 或者 library,像登录,基础网络层这样较为稳定的组件,一般直接打包成 aar,减少编译耗时。而像自定义 View 组件,由于随着版本迭代会有较多变化,就直接以源码形式抽离成 Library 推荐文章:干货 | 从智行 Android 项目看组件化架构实践(https://mp.weixin.qq.com/s?__biz=MjM5MDI3MjA5MQ==&mid=2697268363&idx=1&sn=3db2dce36a912936961c671dd1f71c78) 7、跨组件通信 跨组件通信场景:
跨组件通信方案分析:第一种组件之间的页面跳转实现简单,跳转时想传递不同类型的数据提供有相应的 API即可。 第二种组件之间的自定义类和自定义方法的调用要稍微复杂点,需要 ARouter 配合架构中的 公共服务(CommonService) 实现:
如何管理过多的路由表?
ARouter路由原理:ARouter维护了一个路由表Warehouse,其中保存着全部的模块跳转关系,ARouter路由跳转实际上还是调用了startActivity的跳转,使用了原生的Framework机制,只是通过apt注解的形式制造出跳转规则,并人为地拦截跳转和设置跳转条件。 常见的组件化方案如下: 8、组件化中路由、埋点的实现 参考回答:因为在组件化中,各个业务模块之间是各自独立的, 并不会存在相互依赖的关系, 所以一个业务模块是访问不了其他业务模块的代码的, 如果想从 A 业务模块的 A 页面跳转到 B 业务模块的 B 页面, 光靠模块自身是不能实现的,这就需要一种跨组件通信方案—— 路由(Router) 路由主要有以下两种场景:
其原理在于将分布在不同组件module中的某些类按照一定规则生成映射表(数据结构通常是Map,Key为一个字符串,Value为类或对象),然后在需要用到的时候从映射表中根据字符串从映射表中取出类或对象,本质上是类的查找。 埋点则是在应用中特定的流程收集一些信息,用来跟踪应用使用的状况:
推荐文章:安卓组件化开源方案实现(https://juejin.im/post/5a7ab8846fb9a0634514a2f5) 9、Hook以及插桩技术 参考回答:Hook是一种用于改变API执行结果的技术,能够将系统的API函数执行重定向(应用的触发事件和后台逻辑处理是根据事件流程一步步地向下执行。而Hook的意思,就是在事件传送到终点前截获并监控事件的传输,像个钩子钩上事件一样,并且能够在钩上事件时,处理一些自己特定的事件,例如逆向破解App) image.gif Android 中的 Hook 机制,大致有两个方式:
插桩是以静态的方式修改第三方的代码,也就是从编译阶段,对源代码(中间代码)进行编译,而后重新打包,是静态的篡改; 而Hook则不需要在编译阶段修改第三方的源码或中间代码,是在运行时通过反射的方式修改调用,是一种动态的篡改 推荐文章: Android插件化原理解析——Hook机制之动态代理(http://weishu.me/2016/01/28/understand-plugin-framework-proxy-hook/) android 插桩基本概念(https://blog.csdn.net/fei20121106/article/details/51879047) Android逆向之旅(http://www.520monkey.com/) 10、Android的签名机制? 参考回答:Android的签名机制包含有消息摘要、数字签名和数字证书
推荐文章:一篇文章看明白 Android v1 & v2 签名机制(https://blog.csdn.net/freekiteyu/article/details/84849651) 11、v3签名key和v2还有v1有什么区别 参考回答:在v1版本的签名中,签名以文件的形式存在于apk包中,这个版本的apk包就是一个标准的zip包,V2和V1的差别是V2是对整个zip包进行签名,而且在zip包中增加了一个apk signature block,里面保存签名信息。 v2版本签名块(APK Signing Block)本身又主要分成三部分:
v3版本签名块也分成同样的三部分,与v2不同的是在SignerData部分,v3新增了attr块,其中是由更小的level块组成。每个level块中可以存储一个证书信息。前一个level块证书验证下一个level证书,以此类推。最后一个level块的证书,要符合SignerData中本身的证书,即用来签名整个APK的公钥所属于的证书 推荐文章: APK 签名方案 v3(https://source.android.google.cn/security/apksigning/v3) Android P v3签名新特性(https://xuanxuanblingbling.github.io/ctf/android/2018/12/30/signature/) 12、Android5.0~10.0之间大的变化 Android?5.0新特性:
Android?6.0新特性
Android?7.0新特性
Android** 8.0(O)**新特性
Android?**9.0(P)**新特性
Android?**10.0(Q)**新特性
推荐文章:Android Developers 官方文档(https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels) 13、说下Measurepec这个类 参考回答:作用:通过宽测量值widthMeasureSpec和高测量值heightMeasureSpec决定View的大小 组成:一个32位int值,高2位代表SpecMode(测量模式),低30位代表SpecSize( 某种测量模式下的规格大小)。 三种模式:
决定因素:值由子View的布局参数LayoutParams和父容器的MeasureSpec值共同决定。具体规则见下图: 14、请例举Android中常用布局类型,并简述其用法以及排版效率 参考回答:Android中常用布局分为传统布局和新型布局 传统布局(编写XML代码、代码生成):
新型布局(可视化拖拽控件、编写XML代码、代码生成):约束布局(ConstrainLayout): 14、请例举Android中常用布局类型,并简述其用法以及排版效率 参考回答:Android中常用布局分为传统布局和新型布局 传统布局(编写XML代码、代码生成):
新型布局(可视化拖拽控件、编写XML代码、代码生成):约束布局(ConstrainLayout): |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 13:35:59- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |