Potato icon indicating copy to clipboard operation
Potato copied to clipboard

Read the fucking source code for the Android interview

Results 73 Potato issues
Sort by recently updated
recently updated
newest added

# Android:Drawable 和 Bitmap [TOC] 这篇文章简单介绍下不同的 Drawable 和 Bitmap 的关系,以及各种的 Drawable。 ## Drawable 其中 Drawable 的注释如下: > A Drawable is a general abstraction for "something that can be drawn." Most...

CONCEPT

# Andorid IME:Custom KeyBoard 在 Android 实现自定义键盘,以及输入法用到两个系统类。 ## Keyboard 和 KeyboardView 这两个系统类用于实现自定义的键盘。 根据官方文档,在 API 29 之后弃用。开发者可以重新实现,或者从 AOSP 中直接拷贝源码即可。 ### Keyboard 该类内部有个 Key,用于记录每个键的信息,code,height,width等。持有所有的 Key,并对外提供接口。 ### KeyboardView 负责绘制所有 Key,包括背景和动画。并监听 Touch 事件,根据 Touch...

TODO

# Android Screen refresh mechanism [TOC] 这篇文章在 View 的绘制基础上,依旧从 ViewRootImpl 开始,探索与屏幕刷新之间的渊源。 ## View 的工作流程 ```java void scheduleTraversals() { if (!mTraversalScheduled) { // 同一帧不会多次调用遍历 mTraversalScheduled = true; // handler 的同步屏障,发送一条异步消息 mTraversalBarrier...

CONCEPT

# Android Network Optimization [TOC] ## 网络问题 ### 流量耗费 **过多以及没有经过处理的网络请求,会消耗用户的网络流量。**Android用户一般都会安装手机管理类App,可以方便清楚查看到每个App耗费的流量,**高流量消耗会导致经常处于非Wifi场景下的用户卸载。** ### 电量消耗 ### 用户体验差 - 应用Apk更新,Apk下载的快慢肯定会影响到应用更新流程的转换率; - 类如热修复Patch包、Hybrid资源包等的下载,肯定是越早下载到本地越好; ## 网络监控 * AS 自带的 NetWork Mnoitor ,可以看出时间段内的网络请求数量及访问速度 * Charles、Fiddler等抓包工具:更加强大 * Stetho...

CONCEPT

# Java Lock [TOC] ## 公平锁和非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁。 非公平锁是指多个获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。 Java中,ReentrantLock,通过构造很熟可以指定是否是公平锁;默认是非公平锁。非公平锁的优点在于吞吐量比公平锁大。 对于 Syncronized 而言,也是一种非公平锁;由于其并不像 ReentrantLock 是通过 AQS 来实现线程调度,所以不可能变成公平锁。 ## 可重入锁 可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。说的有点抽象,下面会有一个代码的示例。 对于Java `ReentrantLock`而言, 他的名字就可以看出是一个可重入锁,其名字是`Re entrant Lock`重新进入锁。 对于`Synchronized`而言,也是一个可重入锁。可重入锁的一个好处是可一定程度避免死锁。 ## 独享锁/共享锁 独享锁是指该锁一次只能被一个线程所持有。 共享锁是指该锁可被多个线程所持有。 对于Java...

CONCEPT

# Java Thread [TOC] 这篇文章了解一下 多线程 相关的知识。 ## 线程底层原理 java的线程是映射到操作系统原生线程之上的,如果要阻塞或唤醒一个线程就需要操作系统介入,需要在户态与核心态之间切换,这种切换会消耗大量的系统资源,因为用户态与内核态都有各自专用的内存空间,专用的寄存器等,用户态切换至内核态需要传递给许多变量、参数给内核,内核也需要保护好用户态在切换时的一些寄存器值、变量等,以便内核态调用结束后切换回用户态继续工作。 synchronized会导致争用不到锁的线程进入阻塞状态,所以说它是java语言中一个重量级的同步操纵,被称为重量级锁,为了缓解上述性能问题,JVM从1.5开始,引入了轻量锁与偏向锁,默认启用了自旋锁,他们都属于乐观锁。所以明确java线程切换的代价,是理解java中各种锁的优缺点的基础之一。 ### 用户态和内核态的概念 **内核态**:CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序 **用户态**:只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取 ### 用户态与内核态的切换 用户态程序切换到内核态, 但是不能控制在内核态中执行的指令。 这种机制叫**系统调用**, 在CPU中的实现称之为**陷阱指令**(Trap Instruction) 工作流程:...

CONCEPT

# IPC And Binder [TOC] Binder 作为 Android 中进程间通信(IPC)的一种方式, 这篇文章简要的叙述 Binder 机制。 ## Linux 的 IPC 由于 Android 系统是基于 Linux,这里有一个问题,为什么不采用 Linux 的 IPC 方法。 那么首先对 Linux 的 IPC 方式有个大概了解 1....

CONCEPT

# 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问题...

CONCEPT

# Android Multi Thread [TOC] 这篇文章了解一下 多线程 相关的知识。 ## 线程 操作系统的设计者 **巧妙地利用了时间片轮转的方式, CPU给每个任务都服务一定的时间,然后把当前任务的状态保存下来,在加载下一任务的状态后,继续服务下一任务**。**任务的状态保存及再加载, 这段过程就叫做上下文切换**。时间片轮转的方式使多个任务在同一颗CPU上执行变成了可能。 ## 线程上下文切换的原因 1. 当前执行任务的时间片用完之后,系统CPU正常调度下一个任务; 2. 当前执行任务碰到IO阻塞,调度器将此任务挂起,继续下一任务; 3. 多个任务抢占锁资源,当前任务没有抢到锁资源,被调度器挂起,继续下一任务; 4. 用户代码挂起当前任务,让出CPU时间; 5. 硬件中断; ## 线程池 由于频繁的创建/销毁线程,对内存的消耗很严重,这是就需要线程池。其优点在于: *...

CONCEPT

# 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 的内存泄露情况...

CONCEPT