《Android高级进阶》读书笔记
《Android高级进阶》是据我所知的市面上唯一一本技术工具书,比较的高大全,作者的目的是为了对全领域有个初步的概念
No1:
在Android系统中,拥有事件传递处理能力的类有以下三种
1)Activity:拥有dispatchTouchEvent和onTouchEvent两个方法
2)ViewGroup:拥有dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent三个方法
3)View:拥有dispatchTouchEvent和onTouchEvent两个方法
No2:
UI管理系统的层级关系
PhoneWindow是Android系统中最基本的窗口系统,每个Activity会创建一个。
PhoneWindow是Activity和View系统交互的接口。DecorView本质上是一个FrameLayout,是Activity中所有View的祖先。
No3:
MeasureSepc是View的一个静态内部类,用来说明应该如何测量这个View。
遍历测量ViewGroup中所有的View:measureChildren方法
测量某个指定的View:measureChild方法
No4:
Android Support Library包含以下几个系列的Jar包
另外还有Annotaion Library
No5:
@Nullable:返回值可以为空
@NonNull:返回值不可以为空
No6:
线程注解
1)@UiThread:运行在UI线程
2)@MainThread:运行在主线程
3)@WorkerThread:运行在后台线程
4)@BinderThread:运行在Binder线程
No7:
值范围注解
1)@Size(min=1):集合不可以为空
2)@Size(max=23):字符串最大字符个数23
3)@Size(2):数组元素个数2
4)@Size(multiple=2):数组大小是2的倍数
@IntRange(from=0,to=255)
@FloatRange(from=0.0,to=1.0)
No8:
权限注解:
1)@RequiresPermission(Manifest.permission.SET_WALLPAPER)
2)@RequiresPermission(anyOf={Manifest.permission.SET_WALLPAPER,Manifest.permission.SET_WALLPAPER}):需要最少一个权限
3)@RequiresPermission(allOf={Manifest.permission.SET_WALLPAPER,Manifest.permission.SET_WALLPAPER}):需要同时声明多个权限
4)@RequirePermission.Read(@RequiresPermission(Manifest.permission.SET_WALLPAPER))
@RequirePermission.Write(@RequiresPermission(Manifest.permission.SET_WALLPAPER)):读写权限
No9:
方法上加@Keep:不需要混淆
No10:
相比较Maven Central,JCenter具有如下有点
1)基于CDN分发函数库,JCenter提供了更快的下载速度
2)JCenter是最大的Java仓库,可以说Maven Central是JCenter的一个子集,托管在Maven Central中的函数库,几乎也都托管在JCenter上面
3)上传函数到JCenter上面是一件非常简单的事情,Bintray的用户界面对用户友好
4)如果想要同时将函数上传到Maven Central上面,Bintray网站上通过简单的点击操作就可以完成
但它们是由不同的提供商托管在不同的服务器上面,两者并无关系
No11:
一个完整的函数库依赖字符串包含三部分:GROUP_ID:ARTIFACT_ID:VERSION
GROUP_ID:函数库所属Group,一般为包名或组织名
ARTIFACT_ID:标识函数库的名字
VERSION:版本号
No12:
Serializable是JDK提供的接口,这种序列化方法是基于磁盘或者网络的,而Parcelable是Android SDK提供的,它是基于内存的,由于内存读写速度高于磁盘,因此在Andorid中跨进程对象的传递一般使用Parcelable。
No13:
Parcelable插件:android parcelable code generator
实现parcelable实现方法
1)describeContents:接口内容的描述,一般默认返回0即可
2)writeToParcel:序列化的方法,将类的数据写入到Parcel容器中
3)静态的Parcelable.Creator接口,这个接口包含两个方法
* createFromParcel:反序列化的方法,将Parcel还原成java对象
* newArray:提供给外部类反序列化这个数组使用
No14:
编码规范检查插件:CheckStyle
No15:
app理想架构图
No16:
开源日志记录库:Logger+LogUtils(https://github.com/pengwei1024/LogUtils)+timber(https://github.com/JakeWharton/timber)
No17:
fastjson还存在一个专门为Android定制的版本———fastjson.android(https://github.com/alibaba/fastjson/wiki/Android%E7%89%88%E6%9C%AC)
No18:
数据库:对象关系映射(ORM)框架:
greenDAO———https://github.com/greenrobot/greenDAO 推荐
Realm———https://realm.io
No19:
传统的图片缓存方案中设置有两级缓存,分别是内存缓存和磁盘缓存。在Fackbook推出的Fresco中,它增加了一级缓存,也就是Native缓存,这极大地降低了使用Fresco的app出现oom的概率
No20:
Glide和Picasso有90%的相似度,可以说就是Picasso的克隆版本,只是在细节上还是存在不少区别。
Glide为包含图片的滚动列表做了尽可能流畅的优化。除了静态图片,Glide也支持GIF格式图片的显示。
Glide提供了灵活的API可以让开发者方便的替换下载图片所用的网络函数库,默认情况下,它使用HttpUrlConnection作为网络请求模块,开发者也可以根据自己项目的实际需求灵活使用Google的Volly或者Square的okhttp等函数库进行替换
No23:
所有的插件haul方案都是使用了DexClassLoader来加载插件APK中的.class文件的
No24:
插件框架:
android-pluginmgr:使用DexMaker的动态热部署功能来生成Activity,让这个Activity继承目标插件所在的Activity
dynamic-load-apk:基于代理的方式实现插件框架的,需要按照一定的规则来开发插件apk,插件中的组件需要实现经过改造后的activity、fragmentactivity、service等的子类
DynamicApk:携程实现的一种实现多APK/DEX加载的插件框架解决方案,使用这个框架,我们可以实现Android Studio多module工程并行开发模式,同时可以实现在线热修复功能
DroidPlugin:是360手机助手实现的一种插件框架,它可以直接运行第三方的独立APK文件,完全不需要对APK进行修改或者安装
Small:目的是实现轻巧的跨平台插件化框架,他最低支持Android API Level8和IOS 7
No25:
推送方案推荐:基于MQTT协议
No26:
在android中想要建立TCP长连接,就不能使用HttpUrlConnection或者HttpClient等Http协议级别的,而要使用TCP级别的Socket
长连接通过Socket的connect方法实现,setKeepAlive(true)
No27:
META-INF存放的是签名相关的信息,用于验证APK包的完整性以及保证系统的安全
* MANIFEST.MF:主要存放APK包中每个文件的名字及每个文件的SHA1哈希值
* CERT.SF:通常每个APP会有一个特定的名字,它保存的是MANIFEST.MF的哈希值以及MANIFEST.MF文件中每一个哈希项的哈希值
* CERT.RSA:保存了APK的签名和证书的公钥信息
No28:
最终影响apk包大小的文件可分为:classes*.dex、lib目录下的so.文件、资源文件(assets目录、res目录、resources.arsc索引表文件)
No29:
android能够使用的图片编解码格式只有三种:JPEG、PNG、WEBP(首选)
No30:
图片压缩工具:无损压缩ImageOptim、有损压缩ImageAlpha、有损压缩TinyPNG
webp转换工具可以选择智图和iSparta
No31:
android sdk自带ninePatch图的编辑工具,位于sdk/tools/draw9patch中
或者在android studio右击某张图片,选择create 9-patch file进行转换
No32:
资源混淆推荐微信的AndResGuard:https://github.com/shwenzhang/AndResGuard
No33:
ButterKnife版本7.0.1依然是通过运行时反射实现View的注入,性能较低下。版本8.0.0-SNAPSHOT使用编译时注解来提升性能。
No34:
依赖注入框架的对比:
ButterKnife是纯粹的View注入框架。
RoboGuice3.0版本开始使用编译时注解提升性能,但还有很多地方用到反射机制。并且使用代码侵入性比较大。
Dagger使用编译时注解,但在对象图的构建时还是使用到了反射机制,在运行时检测依赖注入是否正常工作,耗了性能。
Dagger2完全抛弃了反射机制,转而在编译阶段完成。但没有实现动态机制,缺乏灵活性。
No35:
React Native是使用Javascript语言进行开发,同时基于ReactJS框架语法。
No36:
AOP开源框架:Hugo,gradle-android-aspectj-plugin,RoboAspetJ,gradle_plugin_android_aspectjx
No37:
gradle的替换工具:Facebook Buck(暂时只支持mac os x和linux)
No38:
网络优化:
1)避免DNS解析
2)合并网络请求
3)预先获取数据
4)避免轮询:尽量使用推送
5)优化重连机制:设定一个最大重连次数
6)离线缓存
7)压缩数据大小
8)不同的网络环境使用不同的超时策略
9)CDN的使用:内容分发网络
No39:
Proguard特性:压缩源代码,优化java字节码,混淆重命名,预校验代码
No40:
Android应用加固是指在APK的外面加一层壳,并对APK里面的dex文件进行加密,可以有效防止app被反编译。
No41:
Android调试工具:Facebook Stetho:
1)视图布局监视
2)数据库监视
3)网络监视
No42:
LeakCanary原理:
1)RefWatcher.watch()函数会为被监控的对象创建一个KeyedWeakReference弱引用对象
2)在后台线程AndroidWatchExecutor中,检查KeyedWeakReference弱引用是否已经被清除,如果还存在,则触发一次垃圾回收。垃圾回收之后,如果弱引用对象依然存在,说明发生了内存泄漏
3)接着在一个独立的进程中启动HeapAnalyzerService服务,基于唯一的reference key,HeapAnalyzer可以在heap dump中找到对应的KeyedWeakReference,并定位到发生内存泄漏的对象引用。
HeapAnalyer会计算到GC Roots的最短强引用路径,并判断是否存在泄漏,并构建出导致泄漏的对象引用链
No43:
Android单元测试框架Robolectric 3.0:设计思想是通过实现一套JVM能够运行的Android代码,从而实现脱离Android环境进行测试
No44:
Android UI自动化测试框架:Monkey,MonkeyRunner,UIAutomator,Robotium,Espresso,Appium
No45:
Android静态代码分析工具:CheckStyle,FindBugs,PMD,Lint
No46:
Jenkins全局配置需要进行JDK,Android SDK,Git,SVN和Gradle的环境配置
《Android高级进阶》读书笔记的更多相关文章
- csapp读书笔记-并发编程
这是基础,理解不能有偏差 如果线程/进程的逻辑控制流在时间上重叠,那么就是并发的.我们可以将并发看成是一种os内核用来运行多个应用程序的实例,但是并发不仅在内核,在应用程序中的角色也很重要. 在应用级 ...
- CSAPP 读书笔记 - 2.31练习题
根据等式(2-14) 假如w = 4 数值范围在-8 ~ 7之间 2^w = 16 x = 5, y = 4的情况下面 x + y = 9 >=2 ^(w-1) 属于第一种情况 sum = x ...
- CSAPP读书笔记--第八章 异常控制流
第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...
- CSAPP 并发编程读书笔记
CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- 读书笔记--SQL必知必会18--视图
读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...
- 《C#本质论》读书笔记(18)多线程处理
.NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...
- C#温故知新:《C#图解教程》读书笔记系列
一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...
- C#刨根究底:《你必须知道的.NET》读书笔记系列
一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...
- Web高级征程:《大型网站技术架构》读书笔记系列
一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...
随机推荐
- vuex——做简单的购物车功能
购物车组件 <template> <div> <h1>vuex-shopCart</h1> <div class="shop-listb ...
- vue-fetch
1.安装命令“ cnpm install --save isomorphic-fetch es6-promise 2.由于ie不支持Promise,所以需要安装promise-polyfill; cn ...
- 修改html中button显示的文字
1. <input type="button"> 实现密码输入框的可见和隐藏 直接修改value属性即可 <script type="text/jav ...
- SQL Server 数据恢复到指点时间点(完整恢复)
SQL Server 数据恢复到指点时间点(完整恢复) 高文龙关注2人评论944人阅读2017-03-20 12:57:12 SQL Server 数据恢复到指点时间点(完整恢复) 说到数据库恢复,其 ...
- Confluence 6 重新获得附件指南
每一个文件在恢复上传到 Confluence 的时候必须单独重命名,你可以通过下面说明的 3 个方法中选择一个进行操作: 选择 A - 通过文件名恢复附件 如果你知道你需要恢复的每一个文件名,尤其是你 ...
- linux学习笔记:第三单元 Linux命令及获取帮助
第三单元 Linux命令及获取帮助 11) 了解Linux命令的语法格式:命令 [选项] [参数]2) 掌握命令格式中命令.选项.参数的具体含义a) 命令:告诉Linux(UNIX)操作系统做(执行) ...
- LeetCode(109):有序链表转换二叉搜索树
Medium! 题目描述: 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: ...
- LeetCode(85):最大矩形
Hard! 题目描述: 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [ ["1","0",&quo ...
- Git使用三:git的使用流程
先创建仓库 创建一个文件夹,作为仓库使用 初始化仓库,在仓库目录的命令行下输入:git init 第一步:创建一个文件,并写入内容,这里写入内容的时候,要把编码设置为utf-8 第二步:输入命令将文件 ...
- python+selenium滑动式验证码解决办法
from selenium.webdriver import ActionChains action = ActionChains(driver) source=driver.find_element ...