![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
学基础
文章平均质量分 81
为啥强制昵称
这个作者很懒,什么都没留下…
展开
-
sonar与指标解读
ios/android/flutter sonar配置填坑原创 2022-11-16 10:20:11 · 1569 阅读 · 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 · 156 阅读 · 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 · 212 阅读 · 0 评论 -
跨语言通信——起点
现代app一定会涉及到大量的跨语言通信。常见的包括JNI、js bridge等,不常见的有flutter channel、lua binding、python binding等。框架要素更泛化一些看,网络请求也是一种跨语言通信,gRPC可以作为一个中立的跨语言通信模板来拆解要素。通信主要是方法调用,方法调用可以分解成方法定义/绑定(gRPC部分)和参数传递(pb部分),做的好的体系会有签名校验,可能是运行时、编译时甚至生成(gRPC)。方法定义需要在两个语言定义出相同的方法签名,并且告知框架将二者绑原创 2021-08-14 10:55:50 · 220 阅读 · 0 评论 -
[源码]Concurrent包之信号量
CountDownLatch计数器,适合于多线程倒数。不得不说,这种300多行,没什么算法的类还是比较适合我的。 内部使用了一个AbstractQueuedSynchronizer记录Count。AbstractQueuedSynchronizer是一个维持一个线程安全state和等待队列的基础类。AbstractQueuedSynchronizer算法(又是算法)是CLH队列锁。实现和原理基本一原创 2017-04-20 14:45:52 · 402 阅读 · 0 评论 -
[源码]Concurrent包之ConcurrentMap
ConcurrentMap extents Map,增加了一些模板方法,比如compute、forEach等,整体说就是线程安全的KV存储。 实现有三个:ConcurrentHashMap、ConcurrentNavigableMap、ConcurrentSkipListMapConcurrentHashMap大名鼎鼎的面试题,呵呵呵。全面介绍就靠别人了。JDK1.8应该是没有二次分桶了,而是用解原创 2017-04-14 14:28:23 · 394 阅读 · 0 评论 -
[源码]Gson
尽量泛化,记录一下Gson大大小小合理的设计和编码方式。合理设计原创 2016-04-21 20:41:01 · 795 阅读 · 0 评论 -
[源码]OKHttp及Http协议笔记
合理设计使用Builder把成员变量的setter从复杂的逻辑对象里剥离出来,让结构清晰一些,也做到了对象的immutable——OkHttpClient.Builder 但是,可能有个FieldWrapper更加方便:Buildee中需要Builder配置的所有Field都放到FieldWrapper中。Builder在构造函数中new一个FieldWrapper,在build时,把Field原创 2016-06-21 19:37:36 · 2625 阅读 · 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 · 424 阅读 · 0 评论 -
[造轮子]Android动态加载框架总结
用了一周多,做了一个Android动态加载的小玩具DCommand。支持下载APK,获取其中的资源、执行代码、启动Activity(这个是抄的,非常粗糙)。 最开始只是觉得动态加载逻辑代码很有用,如果MVP模式使用合理的话,对于大部分的逻辑更新、线上bug修复直接使用动态下发APK,更新P端的逻辑即可。后来越来越复杂,最后基本所有方面都可以动态使用,如果再深入开发的话,做个MVP框架也是可以的(当原创 2016-02-25 20:27:57 · 977 阅读 · 0 评论 -
[基础]Java内存和GC汇总
Java内存结构主要来自JVM 8 定义。运行时数据区生命周期一部分与JVM绑定,一部分与线程绑定pc寄存器与线程绑定。指向当前方法地址(非native)或未定义(native)JVM栈与线程绑定栈中都是帧(Frame)[的指针]Frame可以是new出来的,用来存储函数调用中的临时结果栈只有push和pop堆与JVM绑定。用来放new出来的实例函数区与JVM绑定。用来保存编译后的中间代码。原创 2017-04-21 16:16:26 · 248 阅读 · 0 评论 -
Theme读取的工具类
用TypedArray读Theme很麻烦,很机械。可以用annotation来搞定。 public static void fillObject(Context context, Object object) { Class clazz = object.getClass(); ResIds ids = (ResIds) clazz.getAnnotation(ResIds.cla原创 2017-08-15 16:00:33 · 268 阅读 · 0 评论 -
那些年我踩过的坑——Java
Java基础复用构造器:只能在构造函数第一行调用其他构造函数,且只能调用一个接口适合用来实现mixin(将一个类变量完全复制到另一个类中)类被load时,static初始化->内存申请->默认初始化->调用构造器Arrays类用来对数组进行操作,Collections对CollectionMap中的key需要有equals方法,HashMap要有hashCode,T...原创 2015-07-10 14:03:44 · 1179 阅读 · 0 评论 -
AspectJ 生成的代码粗读
拜读大神的Hugo代码,代码很简单,就是AOP加日志。然而日志必然影响性能,特意反编译AOP之后的代码,了解一下AspectJ AOP的一些皮毛。 这里只是AOP一个普通方法的影响。主要关注内存和反射。探索编译期会把原始方法改名,把真实方法改成调用AOP对应的方法。初始化会为每一个AOP方法生成一个StaticPartImpl,里面是编译器拿到的一些信息。此处没有反射。StaticPartImpl原创 2017-10-25 14:04:27 · 621 阅读 · 0 评论 -
AOP Observable
在公司重构的过程中,希望用KVO的方式传递数据变化的事件。然而,在传统Android的写法中,Bean是没有setter的,就没有时机来notifyObservers了。 值得庆幸的是AspectJ能够切入Field access事件,用AOP就是一个非常好的解决方法了。项目](https://github.com/pouloghost/AOPObservable),使用方法见README.md,原创 2017-11-10 15:03:21 · 230 阅读 · 0 评论 -
我用过的代码生成方式综述
这段时间,做了很多开发效率相关的事情,涉及到了不少代码生成的方法和思路,总结如下。生成代码分两部分:代码分析生成工具和代码模板工具按编写难度排序live template这个是intellij的一个简单工具,看起来就是对freemarker或者正则替换做了一些封装。代表方案当然就是内置的那些了。 创建很简单:https://www.jetbrains.org/intellij...原创 2018-03-22 14:57:07 · 707 阅读 · 0 评论 -
怎样发布同一个库到多个repo中
问题在开发过程中,有时需要同时发布一份aar/jar到远程和本地的repo,这样可以保证在没有网的情况下编译成功。解决不可能在uploadArchive任务中设置多个repo,因为源码里明显写的只有单个repository对象。所以需要手写一个Upload task的子类。 里面有的坑是configuration需要手动设置成project的archives,否则打包不过。 推荐在...原创 2018-05-23 18:24:08 · 542 阅读 · 0 评论 -
快手组件化之术——IoC自注册
自己在公司简书上的文章,转一发:https://www.jianshu.com/p/ea944773cbd5道势术,以势养道,以术谋势。 —— 《道德经》阅读本文需要对 Java 组件化、Annotation processing 和 Javassist 有一定了解。 当一个 App 发展到多业务组合的阶段,组件化都是必经之路,此为道。实践中组件之间的通信,方案大多是接口 +...原创 2018-07-10 10:18:15 · 851 阅读 · 1 评论 -
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 评论 -
为什么getWidth取不到
这是个很初级的问题,解决办法有三个: - postDelay 延时大法 - 重载View#onSizeChange - 使用OnGlobalLayoutListener 追究这个原因呢,也没什么太大价值,只是记录一下吧。那为什么呢?首先,getWidth返回的是mRight - mLeft,getMeasuredWidth返回的是 mMeasuredWidth & MEASURED_SIZE原创 2017-04-13 14:49:38 · 1208 阅读 · 0 评论 -
Android超时控制方法及场景
刚刚和同事进行了一个非常有益的脑力训练——怎样控制超时。之前经常用,但并没有仔细想过,这次梳理了一下。 想到了三个流派:Future/Callable/FutureTaskFuture和Callable自带等待属性,(FutureTask中)带时间的get使用的是LockSupport做的等待(park、unpark)。这个方法的问题在于,需要用到Executor接口才能从Callable中拿到一原创 2017-03-20 12:02:46 · 2212 阅读 · 0 评论 -
这些年我踩过的坑——Android
PD如果经常要求改入口,使用Adapter + ViewHolder来实现解耦: 这两个配合模拟FragmentManager + Fragment的逻辑Adapter只负责管理View、对ViewHolder中的生命周期函数进行回调ViewHolder不仅保存View的引用,还完整包含与该View有关的所有逻辑,对外暴露相同的生命周期回调函数,例如onViewCreated、onBind...原创 2016-01-29 18:29:50 · 5209 阅读 · 0 评论 -
URLClassLoader源码笔记
在搜索加载Jar文件时,满屏都是URLClassLoader,简直是被玩坏了。作为不求甚解的人,都觉得太过不去了,看看源码吧。Classloader基础关于resourceURLClassLoader的最终基类是ClassLoader。支持并发的ClassLoader需要在初始化时,调用registerAsParallelCapable()注册自己对于由ClassLoaderA读入的cla原创 2015-09-07 16:51:17 · 949 阅读 · 0 评论 -
一个由泛型和Auto Unbox引发的Crash
出了个神奇的Crash,复盘一下: public boolean foo(HashMap map){ ... return null != map && map.get("a_key"); } 这段代码居然有空指针,出在最后一行。这个空指针的原因还是很神奇的。 当“a_key”不在map中时,map会返回null。按照本屌的理解,实际调用的流程应该是: b原创 2015-09-09 14:07:59 · 438 阅读 · 0 评论 -
Singleton效率测试
JDK 1.7 64位,i5-3230m,win7 64位企业版。100万次getInstance,单例使用Object。 - synchronized方法: 实验号 时间 0 86 1 41 2 18 3 22 4 43 5 18 6 17 7 17 8 18 9 17- Double Check 实验号原创 2015-05-14 09:54:32 · 312 阅读 · 0 评论 -
我遇到的JAVA异常和解决方法
0.could not find the main class. program will exit 编译和执行的JDK版本不一致,jar包的编译版本要高于当前JDK版本。换jar包或者换JDK版本。原创 2013-02-22 21:23:36 · 359 阅读 · 0 评论 -
Java的inet_aton inet_ntoa
public static String inet_ntoa(long add) { return ((add & 0xff000000) >> 24) + "." + ((add & 0xff0000) >> 16) + "." + ((add & 0xff00) >> 8) + "." + ((add & 0xff)); } public static long inet_a原创 2013-07-10 20:43:42 · 4002 阅读 · 0 评论 -
A Java Fork/Join Framework by Doug Lea
综述本文描述了一个java框架的设计、实现和性能。这个框架支持将分而治之的并行计算方法。总体设计可以看做是为Cilk设计的work-stealing框架的变体。主要的实现包括了有效地创建和管理任务队列和工作线程。可计量的性能表现出了并行计算的优越性,但也提出了需要的改良。1.简介Fork/Join 并行化是最简单有效的获得良好并行性能的设计方法之一。Fork/Join 算法是熟悉的分而翻译 2012-05-08 15:40:30 · 1890 阅读 · 0 评论 -
win7+cygwin+hadoop0.20.2+cluster+eclipse
配置hadoop环境0 安装cygwin 和sshcygwin需要安装vim openssh openssl sed包http://wengm.diandian.com/post/2010-12-19/60053331 安装hadoop 下载0.20.2(集群上的版本) 把相应的。jar插件拖到eclipse的dropin中。配置文件http://java.chinai原创 2012-12-05 14:06:14 · 1367 阅读 · 0 评论 -
Classloader笔记
读这个文章http://www.onjava.com/pub/a/onjava/2005/01/26/classloading.html,记一下。0.类的方法(应该还有原创 2014-07-31 18:00:39 · 348 阅读 · 0 评论 -
解释器模式的一个应用
需求做产品的时候,有一个需求:对于一个字符串要在提交之前做校验,但是校验标准需要可配置。最合理的方案就是使用正则表达式+表达式组合。基础数据结构配置的数据结构如下package com.example.ayizty.myapplication.reg;import java.util.HashMap;public class Configure { public HashMap<String原创 2015-11-04 20:47:39 · 2256 阅读 · 0 评论 -
反射
原文反射的一大好处是解除类(Module)之间的直接依赖getDeclaredXXX是取得包括private、protected类型的XXX,**仅限于在该类中声明的**XXXgetFields返回本类及其基类的public field,getDeclaredFields**仅返回本类的所有field**是没有办法load一个Array class的,其构造函数也没办法被反射出来。对Arra原创 2015-10-14 11:23:26 · 297 阅读 · 0 评论 -
那些年我看到过的牛逼设计
React:重分抽象了展示的过程,展示就是把数据放到View上的过程,View变化一定是某个数据变化。所以这种变化可以以状态机的形式存在,所有影响View显示的数据作为一个状态。通过对于状态的kvo,可以实现更为高层次的数据绑定,并不是一个View对应一个String这么简单。其实data-binding都是一样的,但是抽象成状态机会非常容易理解。原创 2016-08-26 16:41:24 · 520 阅读 · 0 评论 -
Android雷达图变种的一个实现
遇到需求,要做一个雷达图类似的图。大概就是一个正n边型,每个顶点有一个View,多边形外接圆圆心有一个View。原创 2016-06-21 19:51:47 · 687 阅读 · 0 评论 -
[造轮子]Android多线程下载
初以为,下载是个极其简单的东西,想试一下。因为知道某些app的下载失败率很高,所以搞了个小聪明讨个巧,分块下载,每块一个md5,如果分块校验失败,则对本块重新下载(貌似古时候的FlashGet就是这么搞的)。模块理想情况下,还是分层的:对外接口:为使用下载功能暴露的接口,启停、取消之类的系统接口:监听系统事件控制下载过程下载:执行下载的部分日志:记录下载的状态,保证下载可以在中断后恢复存储原创 2016-06-13 17:40:51 · 603 阅读 · 0 评论 -
一个文件级循环队列的Journal实现
准备做一个比较靠谱的下载组件,这是第一步,Journal。 最开始想的比较多,希望新增和更新单个消息都尽量少的进行磁盘操作(后来想想,特别是看了Android官方的下载之后,觉得完全没必要,数据库足矣),不希望用数据库(理论上,没有index,会读全部数据)。 想来想去,做了一个循环队列的方法,尽量减少文件操作,当然肯定还是不如数据库+index来的快。是个思路,也是个教训。思路基本与最最简单的原创 2016-05-18 16:51:15 · 717 阅读 · 0 评论 -
Git使用总结
Git实际上是一个状态机,每个状态都是一个commit。一个commit里包含着文件的内容、关系,commit间的关系等。分支是一个指向一系列commit组成链表的尾节点的指针。而remote和local是由git维护的两个可以同步结构的状态机,可以由这个方式来理解git。 指针是依靠sha1值来指向不同分支的。文件状态转换: 各种命令init:初始化,可以传template_diradd:准原创 2016-03-23 17:06:46 · 334 阅读 · 0 评论 -
类和加载
原文类二进制格式cafe babe开头minor version + major version常量池:包括了所有使用到的类名、方法名、签名、字符串常量等本类的常量引用(本类类名、方法名等)成员变量和方法的信息(struct)类加载Java在编译时没有link过程,jar包只是class打的一个包,并没有太大用处Link发生在类加载过程中,提供了动态提供实现的可能性类加载发生在运行原创 2015-10-09 20:01:49 · 331 阅读 · 0 评论 -
用 Javassist 进行类转换
原文是用反射处理命令行参数可取的是先确定调用方法和逻辑,设计好接口,再做细节设计不明白为什么要用反射,如果用反射处理参数,应该是用反射做参数到handler的映射而不是反射设置对应类的成员变量值原创 2015-10-14 17:33:06 · 518 阅读 · 0 评论 -
函数直接调用与反射性能对比
最近发现反射甚是好用,但是性能差距有多大呢。实验环境是win8.1 64位系统,jre8,i7-4770cpu,8g内存。方法很简单,对于一个类,分别使用直接调用和函数反射的方式调用同一个函数,看运行时间,时间使用System.currentTimeMillis()。函数仅申请一个int型局部变量并赋值。实验结果如下表:次数1000010000原创 2014-08-10 21:14:11 · 1780 阅读 · 0 评论