• 《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:

    资源混淆推荐微信的AndResGuardhttps://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的环境配置

  • 相关阅读:
    洛谷 P2920 [USACO08NOV]时间管理Time Management
    湖南测试 1
    洛谷 P1824 进击的奶牛
    4、map 和 tuple
    -_-#【Better JS Code】插入迭代值
    -_-#【JS】defer / async
    -_-#【JS】HTML5 API
    【jQuery】jQuery API 过 一 遍
    ♫【函数】函数声明 / 函数表达式
    -_-#【Mac】命令
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/8797155.html
Copyright © 2020-2023  润新知