《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高级进阶》读书笔记的更多相关文章

  1. csapp读书笔记-并发编程

    这是基础,理解不能有偏差 如果线程/进程的逻辑控制流在时间上重叠,那么就是并发的.我们可以将并发看成是一种os内核用来运行多个应用程序的实例,但是并发不仅在内核,在应用程序中的角色也很重要. 在应用级 ...

  2. CSAPP 读书笔记 - 2.31练习题

    根据等式(2-14) 假如w = 4 数值范围在-8 ~ 7之间 2^w = 16 x = 5, y = 4的情况下面 x + y = 9 >=2 ^(w-1)  属于第一种情况 sum = x ...

  3. CSAPP读书笔记--第八章 异常控制流

    第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...

  4. CSAPP 并发编程读书笔记

    CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...

  5. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  6. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  7. 《C#本质论》读书笔记(18)多线程处理

    .NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...

  8. C#温故知新:《C#图解教程》读书笔记系列

    一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...

  9. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  10. Web高级征程:《大型网站技术架构》读书笔记系列

    一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...

随机推荐

  1. wx :swipertab切换

    <view> <view class="navbar"> <block wx:for="{{body}}" wx:key=&quo ...

  2. 细说Django的中间件

    分析Django的生命周期,我们知道所有的http请求都要经过Django的中间件. 假如现在有一个需求,所有到达服务端的url请求都在系统中记录一条日志,该怎么做呢? Django的中间件的简介 D ...

  3. ORACLE的数据类型的长度合集

    --  ORACLE的数据类型常用的数据库字段类型如下:字段类型 中文说明 限制条件 其它说明CHAR 固定长度字符串 最大长度2000 bytesVARCHAR2 可变长度的字符串 最大长度4000 ...

  4. Confluence 6 代理和 HTTPS 详细配置指南链接

    详细配置指南 更多有关连接器示例,我们提供了一些按步骤配置的指南来帮助你启用 HTTPS 并正确配置你的代理. HTTPS: Running Confluence Over SSL or HTTPS  ...

  5. Unity3D用户手册

    Unity Manual 用户手册 Welcome to Unity. 欢迎使用Unity. Unity is made to empower users to create the best int ...

  6. 使用sysbench 0.5 对mysql 进行性能、压力测试

    sysbench是一个模块化的.跨平台.多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况.目前sysbench代码托管在launchpad上,项目地址:https://launc ...

  7. C# 位移运算

    一:“<<”和“>>”运算符用于执行移位运算,分别称为左移位运算符和右移位运算符.对于X<<N和X>>N形式的运算,含义是将X向左或向右移动N位,得到的 ...

  8. python-中缀表达式转前缀表达式

    作完了中缀前缀,作一个归纳吧. https://www.cnblogs.com/unixfy/p/3344550.html # coding = utf-8 class Stack: def __in ...

  9. fputcsv导出大量数据

    <?php set_time_limit(0); ini_set('memory_limit', '128M'); $fileName = date('YmdHis', time()); hea ...

  10. T37302 P哥的桶

    题解: 比较简单的一道题 线段树+线性基 显然离线处理出位置 然后线段树updata的时候暴力合并线性基 nlogn^3 一个常数优化就是线性基已满就直接返回这个线性基 还有个优化是用快速找到第一个1 ...