android 架构 mvc mvp mvvm
详见:https://blog.csdn.net/wdr2003/article/details/79811767 (MVC, MVP, MVVM)
http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html (MVC,MVP 和 MVVM 的图示)
mvc :
mvp:
mvvm:
三者如何选择?
- 如果项目简单,没什么复杂性,未来改动也不大的话,那就不要用设计模式或者架构方法,只需要将每个模块封装好,方便调用即可,不要为了使用设计模式或架构方法而使用。
- 对于偏向展示型的app,绝大多数业务逻辑都在后端,app主要功能就是展示数据,交互等,建议使用mvvm。
- 对于工具类或者需要写很多业务逻辑app,使用mvp或者mvvm都可。
android 事件派发机制
详见 : https://www.cnblogs.com/linjzong/p/4191891.html (30分钟弄明白Touch事件分发机制)
https://blog.csdn.net/pgg_cold/article/details/79472193 (android的事件分发机制)
https://tryenough.com/android-motionevent (事件分发机制原理)
https://www.jianshu.com/p/38015afcdb58 (Android事件分发机制详解:史上最全面、最易懂)
ViewRootImpl也是有事件分发的。要知道,当用户点击屏幕产生一个触摸行为,这个触摸行为则是通过底层硬件来传递捕获,然后交给ViewRootImpl,接着将事件传递给DecorView,而DecorView再交给PhoneWindow,PhoneWindow再交给Activity,然后接下来就是我们常见的View事件分发了
android handler looper 原理
参考 : https://blog.csdn.net/guolin_blog/article/details/9991569 (Android异步消息处理机制完全解析)
https://blog.csdn.net/ly502541243/article/details/87475229 ( 一个线程可以有几个Looper?几个Handler?从Looper.prepare()来看看关于Looper的一些问题 )
android AMS WMS
AMS启动流程:https://blog.csdn.net/itachi85/article/details/76405596
android 绘制原理
Android图形系统-Choreographe: https://www.jianshu.com/p/bab0b454e39e
Android的UI刷新机制:https://www.jianshu.com/p/8812af8c8cdb
android binder
参考: https://blog.csdn.net/pgg_cold/article/details/79393839
Android Binder跨进程通信的原理 :https://www.jianshu.com/p/05120d7b8a52
android 插件化
详见:https://blog.csdn.net/pgg_cold/article/details/82814368 (android 插件化原理)
插件化中加载so库解决方案: https://www.jianshu.com/p/a4a6ed83483b
android app编译打包过程
这张图很好的讲述了android的编译打包过程,接下来就具体的分析分析,大致分为7步:
(1)aapt(Android Asset Packaging Tool,android构建工具,在android-sdk的build-tool目录下)它的主要工作就是把项目中使用到的资源文件打包成R.java文件;
(2)aidl工具会将aidl接口转换为java接口
(3)java编译器就会将上述准备好的文件和我们在项目敲得java源文件打包成.class文件
R.java文件+aidl接口+java源文件===>.class字节码文件;
(4)如果是java程序,把.class文件交给java虚拟机就可以了,但是android使用的不是java虚拟机,是davlik虚拟机,所以编译成.class文件还不行,还需要通过dex工具把.class文件打包成.dex文件,这里如果你项目中使用了第三方的库,也会在这里一起打包成.dex文件;
(5)通过apkbuilder工具将编译过的文件和那些没有编译过的文件(图片,视频等)加上上述的.dex文件一起打包成.apk文件;
(6)这时候的.apk文件还无法去使用,还需要通过Jarsigner这个工具对.apk进行签名,至于签名的原因:为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本的一致性(如自动更新不会因为版本不一致而无法安装)。
(7)签名过后的.apk文件其实就可以使用了,但是这时候的.apk文件太过杂乱,还需要Zipalign工具进行.apk文件的对其,减少内存,整理apk文件;
通过这七大步骤,一个apk生成。
详解android签名:https://www.jb51.net/article/174939.htm
android 应用安装过程
安装步骤大致分为四步:
(1) 拷贝apk文件到指定目录
在Android系统中,apk安装文件是会被保存起来的,默认情况下,用户安装的apk首先会被拷贝到 /data/app 目录下。
/data/app目录是用户有权限访问的目录,在安装apk的时候会自动选择该目录存放用户安装的文件,而系统出厂的apk文件则被放到了 /system 分区下,包括 /system/app,/system/vendor/app,以及 /system/priv-app 等等,该分区只有Root权限的用户才能访问,这也就是为什么在没有Root手机之前,我们无法删除系统出厂的app的原因了。
(2) 解压apk,拷贝文件,创建应用的数据目录
为了加快app的启动速度,apk在安装的时候,会首先将app的可执行文件(dex)拷贝到 /data/dalvik-cache 目录,缓存起来。
然后,在/data/data/目录下创建应用程序的数据目录(以应用的包名命名),存放应用的相关数据,如数据库、xml文件、cache、二进制的so动态库等等。
(3) 解析apk的AndroidManifinest.xml文件
Android系统中,也有一个类似注册表的东西,用来记录当前所有安装的应用的基本信息,每次系统安装或者卸载了任何apk文件,都会更新这个文件。这个文件位于如下目录:
/data/system/packages.xml
系统在安装apk的过程中,会解析apk的AndroidManifinest.xml文件,提取出这个apk的重要信息写入到packages.xml文件中,这些信息包括:权限、应用包名、APK的安装位置、版本、userID等等。
由此,我们就知道了为啥一些应用市场和软件管理类的app能够很清楚地知道当前手机所安装的所有的app,以及这些app的详细信息了。
另外一件事就是Linux的用户Id和用户组Id,以便他可以获得合适的运行权限。
以上这些都是由PackageServiceManager完成的,下面我们会重点介绍PackageServiceManager。
(4) 显示快捷方式
这些应用程序只是相当于在PackageManagerService服务注册好了,如果我们想要在Android桌面上看到这些应用程序,还需要有一个Home应用程序,负责从PackageManagerService服务中把这些安装好的应用程序取出来,并以友好的方式在桌面上展现出来,例如以快捷图标的形式。在Android系统中,负责把系统中已经安装的应用程序在桌面中展现出来的Home应用程序就是Launcher了
android app启动过程
性能优化
包大小优化
详见:https://blog.csdn.net/chenliguan/article/details/54176626
https://blog.csdn.net/zhuod/article/details/53301648
android内存优化
https://mp.weixin.qq.com/s/2MsEAR9pQfMr1Sfs7cPdWQ
网络
Okhttp3 总结研究 :https://blog.csdn.net/u012881042/article/details/79759203
Android初中级面试题:https://mp.weixin.qq.com/s/IKFRrcKZ9Vv90d3u74fy6g
android中高级面试:https://mp.weixin.qq.com/s/17XeoP8DEj2KTnKCBv4H_A,
https://www.jianshu.com/p/d256d8e3dbdf
android面试指引:https://www.kancloud.cn/aslai/interview-guide/1113658
跨平台:
jsBridge原理解析 https://www.jianshu.com/p/fc835051e616
跨平台开发之react-native、weex、flutter比较: https://blog.csdn.net/makercloud/article/details/81560987
android 启动模式:https://blog.csdn.net/elisonx/article/details/80397519
其它:
史上最全android面试集锦:https://blog.csdn.net/xiangzhihong8/article/details/96280254
android三方网络库对比:
picasso不支持gif, glide加强版本picasso,大小只大了几百k.
开源库 | Glide | Fresco |
layout对象 | 原生ImageView | 特有的SimpleDraweeView |
是否需要初始化 | 不需要 | Fresco.initialize(this); |
能否显示加载进度 | 不能,需自己实现 | Yes |
图片加载质量 | RGB565 | ARGB8888 |
缓存级别 | 2级,内存和磁盘缓存 | 3级,2个内存级和1个磁盘级 |
缓存图像大小 | 原始大小和针对ImageView大小的result型 | 原始大小 |
圆角图像 | 需自己实现 | 设置RoundingParams |