sunwen
sunwen
# Android:Drawable 和 Bitmap [TOC] 这篇文章简单介绍下不同的 Drawable 和 Bitmap 的关系,以及各种的 Drawable。 ## Drawable 其中 Drawable 的注释如下: > A Drawable is a general abstraction for "something that can be drawn." Most...
# Andorid IME:Custom KeyBoard 在 Android 实现自定义键盘,以及输入法用到两个系统类。 ## Keyboard 和 KeyboardView 这两个系统类用于实现自定义的键盘。 根据官方文档,在 API 29 之后弃用。开发者可以重新实现,或者从 AOSP 中直接拷贝源码即可。 ### Keyboard 该类内部有个 Key,用于记录每个键的信息,code,height,width等。持有所有的 Key,并对外提供接口。 ### KeyboardView 负责绘制所有 Key,包括背景和动画。并监听 Touch 事件,根据 Touch...
# Android Screen refresh mechanism [TOC] 这篇文章在 View 的绘制基础上,依旧从 ViewRootImpl 开始,探索与屏幕刷新之间的渊源。 ## View 的工作流程 ```java void scheduleTraversals() { if (!mTraversalScheduled) { // 同一帧不会多次调用遍历 mTraversalScheduled = true; // handler 的同步屏障,发送一条异步消息 mTraversalBarrier...
# Android Network Optimization [TOC] ## 网络问题 ### 流量耗费 **过多以及没有经过处理的网络请求,会消耗用户的网络流量。**Android用户一般都会安装手机管理类App,可以方便清楚查看到每个App耗费的流量,**高流量消耗会导致经常处于非Wifi场景下的用户卸载。** ### 电量消耗 ### 用户体验差 - 应用Apk更新,Apk下载的快慢肯定会影响到应用更新流程的转换率; - 类如热修复Patch包、Hybrid资源包等的下载,肯定是越早下载到本地越好; ## 网络监控 * AS 自带的 NetWork Mnoitor ,可以看出时间段内的网络请求数量及访问速度 * Charles、Fiddler等抓包工具:更加强大 * Stetho...
# Java Lock [TOC] ## 公平锁和非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁。 非公平锁是指多个获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。 Java中,ReentrantLock,通过构造很熟可以指定是否是公平锁;默认是非公平锁。非公平锁的优点在于吞吐量比公平锁大。 对于 Syncronized 而言,也是一种非公平锁;由于其并不像 ReentrantLock 是通过 AQS 来实现线程调度,所以不可能变成公平锁。 ## 可重入锁 可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。说的有点抽象,下面会有一个代码的示例。 对于Java `ReentrantLock`而言, 他的名字就可以看出是一个可重入锁,其名字是`Re entrant Lock`重新进入锁。 对于`Synchronized`而言,也是一个可重入锁。可重入锁的一个好处是可一定程度避免死锁。 ## 独享锁/共享锁 独享锁是指该锁一次只能被一个线程所持有。 共享锁是指该锁可被多个线程所持有。 对于Java...
# Java Thread [TOC] 这篇文章了解一下 多线程 相关的知识。 ## 线程底层原理 java的线程是映射到操作系统原生线程之上的,如果要阻塞或唤醒一个线程就需要操作系统介入,需要在户态与核心态之间切换,这种切换会消耗大量的系统资源,因为用户态与内核态都有各自专用的内存空间,专用的寄存器等,用户态切换至内核态需要传递给许多变量、参数给内核,内核也需要保护好用户态在切换时的一些寄存器值、变量等,以便内核态调用结束后切换回用户态继续工作。 synchronized会导致争用不到锁的线程进入阻塞状态,所以说它是java语言中一个重量级的同步操纵,被称为重量级锁,为了缓解上述性能问题,JVM从1.5开始,引入了轻量锁与偏向锁,默认启用了自旋锁,他们都属于乐观锁。所以明确java线程切换的代价,是理解java中各种锁的优缺点的基础之一。 ### 用户态和内核态的概念 **内核态**:CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序 **用户态**:只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取 ### 用户态与内核态的切换 用户态程序切换到内核态, 但是不能控制在内核态中执行的指令。 这种机制叫**系统调用**, 在CPU中的实现称之为**陷阱指令**(Trap Instruction) 工作流程:...
# IPC And Binder [TOC] Binder 作为 Android 中进程间通信(IPC)的一种方式, 这篇文章简要的叙述 Binder 机制。 ## Linux 的 IPC 由于 Android 系统是基于 Linux,这里有一个问题,为什么不采用 Linux 的 IPC 方法。 那么首先对 Linux 的 IPC 方式有个大概了解 1....
# Android ANR Summary [TOC] ## 什么情况下会出现ANR问题 ANR(Application Not responding)。Android中,主线程(UI线程)如果在规定时内没有处理完相应工作,就会出现ANR。 具体来说,ANR会在以下几种情况中出现: * 输入事件(按键和触摸事件)5s内没被处理 * BroadcastReceiver的事件(onRecieve方法)在规定时间内没处理完(前台广播为10s,后台广播为60s). * service 前台20s后台200s未完成启动 * ContentProvider的publish在10s内没进行完 ## ANR机制的实现原理 1. 在进行相关操作调用hander.sendMessageAtTime()发送一个ANR的消息,延时时间为ANR发生的时间(如前台Service是当前时间20s之后)。 2. 进行相关的操作 3. 操作结束后向remove掉该条message。如果相关的操作在规定时间没有执行完成,该条message将被handler取出并执行,就发生了ANR。 ## 如何分析ANR问题...
# Android Multi Thread [TOC] 这篇文章了解一下 多线程 相关的知识。 ## 线程 操作系统的设计者 **巧妙地利用了时间片轮转的方式, CPU给每个任务都服务一定的时间,然后把当前任务的状态保存下来,在加载下一任务的状态后,继续服务下一任务**。**任务的状态保存及再加载, 这段过程就叫做上下文切换**。时间片轮转的方式使多个任务在同一颗CPU上执行变成了可能。 ## 线程上下文切换的原因 1. 当前执行任务的时间片用完之后,系统CPU正常调度下一个任务; 2. 当前执行任务碰到IO阻塞,调度器将此任务挂起,继续下一任务; 3. 多个任务抢占锁资源,当前任务没有抢到锁资源,被调度器挂起,继续下一任务; 4. 用户代码挂起当前任务,让出CPU时间; 5. 硬件中断; ## 线程池 由于频繁的创建/销毁线程,对内存的消耗很严重,这是就需要线程池。其优点在于: *...
# Android Performance Optimization Tool [TOC] Android 性能优化工具的汇总 ## StrictMode Android 2.3 引入的工具,可以帮助开发者发现代码中的不规范问题。 使用严格模式,系统检测出主线程违例的情况会做出相应的反应,如日志打印,弹出对话框亦或者崩溃等。换言之,严格模式会用不同的策略对应用的违例细节做监控,通过一定的方式暴露给开发者方便优化与改善。 StrictMode通过策略方式来让你自定义需要检查哪些方面的问题,主要有两种策略: * ThreadPolicy:线程方面的策略 * VmPolicy:VM方面的策略 ```java detectNetwork():用于检查UI线程中是否有网络请求 detectDiskReads()和detectDiskWrites():是磁盘读写检查 detectCustomSlowCalls():主要用于帮助开发者发现UI线程中调用的哪些方法执行的比较慢,要和StrictMode.noteSlowCall配合使用,只有通过 StrictMode.noteSlowCall标记“可能会”执行比较慢的方法,只有标记过的方法才能被检测到,日志中会记录方法的执行时间(注意:只有在主线程中执行的方法才会显示执行时间,在其他线程中执行的方法,就算是使用StrictMode.noteSlowCall标记,在日志中也不会打印执行时间) ``` ```java detectActivityLeaks() 用户检查 Activity 的内存泄露情况...