android 基础

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事件分发机制详解:史上最全面、最易懂)

https://mp.weixin.qq.com/s?__biz=MzI3OTU0MzI4MQ==&mid=2247485782&idx=1&sn=ca9cbc25e708c77a96fe1c553bcf137e&chksm=eb4765c8dc30ecde052891b2386df736eddb3970530f8c86f6fe5e96da2c0c0ea2cc24bd099e&scene=21#wechat_redirect (带你一起探究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三方网络库对比:

https://www.kaelli.com/9.html 

https://mp.weixin.qq.com/s?__biz=MzUzMTM5MTc3Mg==&mid=2247484125&idx=1&sn=f881f164bf72b541837f3da71911b2f6&chksm=fa4276aecd35ffb878f2cfad82e7c8cdee27a4dc66cf5cff51a65114551354ed8d086169c413&token=970034781&lang=zh_CN#rd

picasso不支持gif, glide加强版本picasso,大小只大了几百k.

开源库GlideFresco
layout对象原生ImageView特有的SimpleDraweeView
是否需要初始化不需要Fresco.initialize(this);
能否显示加载进度不能,需自己实现Yes
图片加载质量RGB565ARGB8888
缓存级别2级,内存和磁盘缓存3级,2个内存级和1个磁盘级
缓存图像大小原始大小和针对ImageView大小的result型原始大小
圆角图像需自己实现设置RoundingParams

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值