看源码
文章平均质量分 79
为啥强制昵称
这个作者很懒,什么都没留下…
展开
-
Object.wait和Thread.sleep源码
面试被问到了wait和sleep区别,才知道这种使用场景完全不同的东西还能问区别…不过,确实没看过这俩的源码,来看一下。解释器映射op的过程我这里看的是art源码,而非jvm源码。本人对bytecode到真正执行代码的映射暂无认知,经高人指点是所有的解释器实现是在interpreter目录中。入口是interpreter.cpp#EnterInterpreterFromInvoke -> Execute -> ExecuteSwitch -> interpreter_switch_i原创 2021-12-08 17:49:03 · 275 阅读 · 0 评论 -
跨语言通信——rn TurboModule
这是rn新架构下的通信方式,基于0.64代码梳理。整体看,仍然是基于跨语言interop能力额外搭建了一套通信方式。方法定义和绑定信道建立由于用到了jsi,信道建立过程是跨语言统一的。仍然是+method和TurboModuleRegistryturboModuleProxy->(jsi)TurboModuleBinding.cpp#jsProxy->TurboModuleBinding#getModule->TurboModuleManager#installJSIBind原创 2021-11-19 14:48:42 · 2321 阅读 · 0 评论 -
跨语言通信——rn BatchedBridge
这是rn最传统的通信方式,基于0.64代码梳理。整体看,仍然是基于跨语言interop能力额外搭建了一套通信方式。方法定义和绑定信道建立双端的接口定义是割裂的,并没有一个地方做唯一类型验证。js侧用了一个很奇怪(不熟悉js语法,别的语言没见过这个写法)的+method的方式定义方法,并传给TurboModuleRegistryTurboModuleRegistry#getEnforcing->requireModule->NativeModules.js->根方法,初始化N原创 2021-11-18 18:29:20 · 1929 阅读 · 0 评论 -
跨语言通信——dart::ffi
ffi是一个比一般通信更底层的机制,接近于jni或者jsi。主要用来做dart和c++的interop。方法定义和绑定dart call c++官方demo是:import 'dart:ffi'; // For FFIimport 'dart:io'; // For Platform.isXfinal DynamicLibrary nativeAddLib = Platform.isAndroid ? DynamicLibrary.open("libnative_add.so")原创 2021-11-16 18:11:43 · 1797 阅读 · 0 评论 -
跨语言通信——flutter channel
flutter是啥就不介绍了。。。这篇主要针对flutter channel,不涉及dart::ffi。主要是dart<->c++<->java的通信。核心概念BinaryMessenger:真正的信道,用来传输数据的MethodCall:传输的数据内容,event和method都被认为是MethodCallMessageCodec:用来序列化/反序列化数据方法定义和绑定所有的绑定都是在BinaryMessenger中,由于跨语言,所以实际代码是c++的。注意,只有原创 2021-11-16 10:39:53 · 1418 阅读 · 0 评论 -
跨语言通信——GC
GC与native指针在gc的时候释放native指针。有几个方案,基本是finalize和PhantomReference。Bitmap在8.0以后,Bitmap的真实数据是存在native的,所以要有一个绑定到java对象,监听gc并释放native内存的操作。这里采用的是sun.misc中提供的一个PhantomReference的方式。代码路径如下:Bitmap.java#createBitmapBitmap.cpp#Bitmap_creatorBitmap.cpp#createBi原创 2021-08-16 11:49:04 · 157 阅读 · 0 评论 -
跨语言通信——luascriptcore
luascriptcoreluascriptcore是一个用来绑定lua、java、oc的跨语言通信开源框架。被引入到了公司的项目中。方法定义和绑定lua call java注册使用的是带方法名的回调,即LuaContext#registerMethod(String, Callable)。LuaContext持有了Java侧的Callable通过LuaNativeUtil向LuaContext.cpp注册了该方法名和LuaJavaEnv#luaMethodHandler通过LuaSess原创 2021-08-14 12:10:28 · 215 阅读 · 0 评论 -
跨语言通信——起点
现代app一定会涉及到大量的跨语言通信。常见的包括JNI、js bridge等,不常见的有flutter channel、lua binding、python binding等。框架要素更泛化一些看,网络请求也是一种跨语言通信,gRPC可以作为一个中立的跨语言通信模板来拆解要素。通信主要是方法调用,方法调用可以分解成方法定义/绑定(gRPC部分)和参数传递(pb部分),做的好的体系会有签名校验,可能是运行时、编译时甚至生成(gRPC)。方法定义需要在两个语言定义出相同的方法签名,并且告知框架将二者绑原创 2021-08-14 10:55:50 · 223 阅读 · 0 评论 -
[源码]Concurrent包之信号量
CountDownLatch计数器,适合于多线程倒数。不得不说,这种300多行,没什么算法的类还是比较适合我的。 内部使用了一个AbstractQueuedSynchronizer记录Count。AbstractQueuedSynchronizer是一个维持一个线程安全state和等待队列的基础类。AbstractQueuedSynchronizer算法(又是算法)是CLH队列锁。实现和原理基本一原创 2017-04-20 14:45:52 · 403 阅读 · 0 评论 -
[源码]Concurrent包之ConcurrentMap
ConcurrentMap extents Map,增加了一些模板方法,比如compute、forEach等,整体说就是线程安全的KV存储。 实现有三个:ConcurrentHashMap、ConcurrentNavigableMap、ConcurrentSkipListMapConcurrentHashMap大名鼎鼎的面试题,呵呵呵。全面介绍就靠别人了。JDK1.8应该是没有二次分桶了,而是用解原创 2017-04-14 14:28:23 · 395 阅读 · 0 评论 -
[源码]Choreographer
协调展示的基础类是ThreadLocal的,所有的run,都是在本Looper中frame间隔是10ms不是16ms,避免掉帧使用DisplayEventReceiver同步vSync独立的final Object作为锁对于单次任务队列,最快的实现是用链表,使用时直接通过修改next将队列分割成两个“`CallbackRecord callbacks = mHead;原创 2015-12-01 14:38:59 · 613 阅读 · 0 评论 -
[源码]Gson
尽量泛化,记录一下Gson大大小小合理的设计和编码方式。合理设计原创 2016-04-21 20:41:01 · 798 阅读 · 0 评论 -
[源码]MultiDex
判断每个dex的新旧使用SharedPreferences存时间戳和crc来决定是否更新,其实就是用一个生命周期与dex文件相同的位置去存储数据就好这个CRC是全局的CRC,减少了计算量所有secondary dex输出为zip文件,这样是为了保持和DexClassLoader和DexPathList的兼容反射是扩展了DexClassLoader中的dex入口,与一般的动态加载不太一样原创 2016-04-12 11:23:01 · 445 阅读 · 0 评论 -
[源码]从CoordinatorLayout到集合中通信
CoordinatorLayout是个挺古老的东西了,然而我才听说,愧为程序员。看一下源码,缓解一下。 一个ViewGroup,也没啥设计思路可说的,无非是:使用Mediator模式解决了集合中子元素的随意通信问题(DependOn),用Decor模式解决了无谓继承的问题(代理给出了不少View的onXXX方法)。这种高层次的思路了。合理设计做依赖,一定都形成DAG,有一个Dire...原创 2018-02-24 19:11:06 · 202 阅读 · 0 评论 -
[源码]fastjson
阿里的一个json库,刚刚看过gson,刚好对比一下。合理设计优秀编码技巧判断对象类型的方法:instanceof、getClass().isXXX()(isArray)、原创 2016-05-09 18:58:22 · 774 阅读 · 0 评论 -
Animator源码
做百分比的定时更新,发现用Handler.postDelay会卡,同样的逻辑放到Animator里就不会。拜读一下Animator是怎么做的。 主要是四个类:Animator(基类)、ValueAnimator(主要分析)、ObjectAnimator和AnimatorSet。Animator:Animator是不做线程同步的,所有方法都是口头要求同线程操作。Handler的postDelay是原创 2015-11-25 20:40:13 · 580 阅读 · 0 评论 -
Fragment生命周期的奇怪设定
线上发生了一个神奇的问题:fragment在onCreate的时候初始化数据,判断异常并finishActivity。然而居然走到了onViewCreated… 原因是Fragment的生命周期的调用关系跟臆想的不一样。在FragmentManager内部,Fragment会有几个[状态](http://grepcode.com/file/repo1.maven.org/maven2/com.go原创 2017-08-16 11:04:51 · 300 阅读 · 0 评论 -
[源码]ButterKnife代码
自己做AnnotationProcessing 用的visiter模式。看一下大牛(真是个巨大的牛)是怎么做的。项目主要功能:processing:compiler,做annotation processingplugin:plugin,复制R2用,主要是为了弱鸡的annotationlib:annotation和无后缀的butterknife库,App真正用的库,Compiler需要依赖an原创 2017-10-24 18:58:17 · 245 阅读 · 0 评论 -
[源码]TextView源码
提起TextView,脑子里想着用起来应该是很简单的,然而作为显示文字的所有控件的基类,想要完全挖掘出TextView的能力,还是很复杂的。最近做一个需求,要在限制长度的输入框里识别粘贴的淘口令,因为对TextView了解太肤浅,bug无数,特意看一下源码学习一下(听iOS同学说,各个平台的对外接口都比较接近,这也是一个认知文字系统的好方法)。 主要关注TextView对外暴露的set接口,以及原创 2018-01-18 16:24:25 · 967 阅读 · 0 评论 -
[java-design-patterns]Enum和Factory模式的替换
设计模式合集git笔记系列。abstract factory模式的介绍中创建了KingdomFactory的接口分别实现了ElfKingdomFactory和OrcKingdomFactory为每个KingdomFactory声明了相应的enum声明了KingdomFactory的Factory,根据enum返回对应的KingdomFactory这个流程,诞生自Java还是弱原创 2018-01-10 11:01:43 · 447 阅读 · 0 评论 -
[源码]Meepo路由
之前设计框架、面试、调研等等的时候,一直觉得ARouter这种完全靠字符串 + 野性Builder的模式太随性。后面YY出来两个可行的方案:为每个页面/Uri生成一个Builder类,用专有Builder进行编译期校验。现存的是https://github.com/joyrun/ActivityRouter为每个页面/Uri构造一个interface方法,用Retrofit的套路做跳转。现...原创 2018-04-23 11:54:46 · 191 阅读 · 0 评论 -
ButterKnife 是怎么解决 library 的 R 问题的
问题Annotation 中必须引用 final 的值(编译期已经有最终值),而 ButterKnife 中引用的 R (在 library 工程中)是非 final 的。ButterKnife 的 tricks生成 R2既然 R 不是 final 的,生成一个呗。所以 butterknife 实现了一个 plugin,把 R 拷贝出了一个 final 版本: R2。这个非常直接有...原创 2018-07-03 17:10:31 · 2378 阅读 · 0 评论 -
读java Timer源码
需要在Python实现一个Timer,初想肯定是用优先队列,但是原创 2014-05-31 17:47:01 · 1122 阅读 · 0 评论 -
[源码]DownloadManager
各家APP都有自己的下载工具,都不用系统的,然而貌似系统的下载各方面都要好一些,看一下,为自己写下载组件做准备。方法下载肯定会有IPC,也肯定会有日志系统。DownloadManager使用的是ContentProvider的形式。业务调用的都是DownloadManager对于ContentProvider的封装ContentProvider事实上是个非常厉害的存在,可以做任何简原创 2016-05-11 10:34:18 · 3244 阅读 · 0 评论 -
[源码]OKHttp及Http协议笔记
合理设计使用Builder把成员变量的setter从复杂的逻辑对象里剥离出来,让结构清晰一些,也做到了对象的immutable——OkHttpClient.Builder 但是,可能有个FieldWrapper更加方便:Buildee中需要Builder配置的所有Field都放到FieldWrapper中。Builder在构造函数中new一个FieldWrapper,在build时,把Field原创 2016-06-21 19:37:36 · 2626 阅读 · 0 评论 -
ListView源码
RecycleBin代码ListView Item重用时有三个机制: 如果有StableID,直接保存ID与View的映射,复用ID相同View如果数据没变,保存位置与View的映射,复用位置相同的View按ItemType复用原创 2015-10-23 16:47:21 · 1031 阅读 · 2 评论 -
ArrayMap源码阅读
Android源码中的一个Map(实现的Map接口),号称能够比hashmap更省内存。因为hashmap原创 2014-07-19 23:21:40 · 5405 阅读 · 0 评论 -
Fragment笔记和源码阅读
官方说明为了自动恢复Fragment状态,Fragment需要有(三选一): idtag容器有idFragmentTransaction 是一个标准的Command模式,将transaction压栈,供后续back时进行revert操作,不调用addToBackStack将会导致Fragment的引用被释放commit不是立即执行,而是向UI Handler post了一个runnabl原创 2015-05-13 10:11:09 · 523 阅读 · 0 评论 -
Android ArrayDeque源码
使用循环队列实现的Deque接口,号称: -当stack比stack快 -当queue比linkedlist快Iterator是Fail fast的,在创建时保存tail位置,next时检查tail是否改变,如果改变则exception。满篇风骚的位操作 -寻找大于numElements的最小二的整次幂:initialCapacity = numElements; in原创 2015-04-21 11:29:28 · 1090 阅读 · 0 评论 -
AsyncTask源码
0. 1.6以后使用线程池技术,3.0以后每个task都独占一个thread原创 2014-08-04 15:12:34 · 467 阅读 · 0 评论 -
CopyOnWriteArrayList源码阅读
又遇到了一个新的 数据结构,原创 2014-07-23 22:47:04 · 574 阅读 · 0 评论 -
ArrayList源码阅读笔记
这是个很简单的数据结构,基本是个数组,原创 2014-05-26 22:10:00 · 407 阅读 · 0 评论 -
SparseArray源码阅读
SparseArray是安卓里用来做Integer到object映射的数据结构。介绍说原创 2014-07-21 22:04:53 · 796 阅读 · 0 评论 -
读nanohttpd源码
最近在想在安卓上做一个服务器,没想到已经有很多人做了,有一个原创 2014-05-09 21:19:14 · 2633 阅读 · 0 评论 -
Android存储基础及相关源码
Key-Value:getPreferences()是Activity的接口,getSharedPreferences()是Context。前者是以Activity.getLocalClassName()为Key的public SharedPreferences More ...getPreferences(int mode) { return getSharedPreferen原创 2015-09-16 15:05:58 · 439 阅读 · 0 评论 -
LocalBroadcastManager源码
代码官方使用的DCL单例并没有使用volatile,看样子关系不大使用的是Handler+MainLooper,所有调用都是在UIThread注册是synchronized,线程安全对ArrayList进行删除时,从后向前比较,效率会高一点点为了避免对同一个Intent的多次广播,在匹配一次后,会给filter置位,后续不进行匹配,全部结束后进行重置(line:200)。貌似比不置位用Ar原创 2015-08-06 20:12:56 · 439 阅读 · 0 评论 -
[源码]SQLiteDatabase
不是sqlite源码!!!本人sql太渣,通过SQLiteDatabase 学习一下硬知识SQLiteSessionWAL:https://zh.wikipedia.org/wiki/%E9%A2%84%E5%86%99%E5%BC%8F%E6%97%A5%E5%BF%97在开启WAL之后,sqlite支持并行的读和写事务;否则,只有只读事务可以并行。具体解释套嵌事务的成功必须是每个子事务都是原创 2016-08-24 15:51:16 · 426 阅读 · 0 评论 -
[源码]LeakCanary
LeakCanary 源码原创 2016-12-19 13:56:03 · 303 阅读 · 0 评论 -
[源码]Android-Architecture及对MVP的理解
Android-Architecture是Google给出的MVP架构及其变种示例todo-mvp:原生态的MVP,其实就是说明了一下,在使用Fragment时MVP和Android组件是怎么对应的。 Model:纯Bean,既是View Model,又是Biz Model。Model不负责存取和转换逻辑View:对应着Fragment和Android View,主要负责事件到Presente原创 2017-02-06 15:46:21 · 296 阅读 · 0 评论 -
[源码]ARouter
ARouter是大阿里开源的Android App“架构”类框架。最主要的就是解除依赖的,包括了页面的依赖、功能的依赖;还有hook、降级、绑定用的语法糖等。结构合理设计不想使用运行时反射,就在编译时,用Annotation把信息都生成到一个Config文件中。这其实类似于js的eval,是个很好的办法——RouterProcessor技巧原创 2017-03-16 17:44:46 · 508 阅读 · 0 评论