- 博客(42)
- 收藏
- 关注
原创 常用编译tips
常用编译tips1.INSTALL_FAILED_TEST_ONLY2.jcenter仓库慢1.INSTALL_FAILED_TEST_ONLY在项目中的gradle.properties中设置:android.injected.testOnly=false2.jcenter仓库慢替换成阿里云buildscript { repositories { googl...
2020-03-31 14:16:35
173
原创 RxJava在网络请求中的应用
利用RxJava实现串行请求class Serial { class Student constructor(var id: Int) { } fun request1(): Observable<Student> { return Observable.just(Student(123)) } fun request2(i...
2019-09-23 14:43:51
225
原创 第一个gradle插件
建立插件首先新建立一个空工程,如下图之后再新建一个module,Android Studio->File->New->New Module,在弹出的对话框中选择java module我们用groovy编写gradle plugin,所以把java目录删掉之后分两部分1:main目录下新建groovy目录,在groovy目录下新建包如com.netease.lib...
2019-09-10 18:03:27
116
原创 SurfaceView
SurfaceSurface继承于Parcelable,内部拥有一系列native方法和一个canvasprivate final Canvas mCanvas = new CompatibleCanvas();private Matrix mCompatibleMatrixCompatibleCanvas是Surface的内部类,主要包装了Canvas的Matrix方法Surface...
2019-08-28 17:28:11
221
原创 blockcanary源码
blockcanary项目名称AndroidPerformanceMonitor,内含4个模块1 blockcanary-android-no-op2 blockcanary-analyzer3 blockcanary-android4 blockcanary-sample本篇文章主要分析blockcanary-analyzer和blockcanary-androidBlockCana...
2019-08-16 09:24:03
250
原创 ServiceManager源码流程
ServiceManager启动于单独的进程,要早于zygote启动,启动时首先运行到service_manager.c的main函数,对binder进行初始化并进入binderloopint main(int argc, char **argv){ bs = binder_open(128*1024); binder_become_context_manager(bs); binde...
2019-08-14 21:12:21
520
原创 SystemServer启动流程
SystemServer被zygote启动后会运行到main函数,在这里面直接运行到run方法 public static void main(String[] args) { new SystemServer().run(); }在run方法中,会做一些初始化,之后启动其他服务,最终进入Loop循环private void run() { Looper.p...
2019-08-13 21:22:57
329
原创 Zygote源码分析
Android启动从init.rc开始,最开始启动ServiceManagerservice servicemanager /system/bin/servicemanager class core user system group system critical onrestart restart healthd onrestart resta...
2019-08-12 21:34:48
463
原创 七层网络模型与UDP
七层网络模型常用端口FTP(文件传输协议): TCP 20 21SSH(安全shell协议): TCP 22telnet(远程登录协议):TCP 23DNS(域名解析系统):UDP 53HTTP(超文本传输协议):TCP 80SMTP(简单邮件传输协议):TCP 25POP3(邮局协议3代):TCP 110HTTPS:TCP 443UDP无连接数据包括源端口和目的...
2019-08-12 20:08:25
236
原创 线程池源码
ExecutorsExecutors是concurrent包下的工具类,通过静态方法产生各种线程池产生固定线程数量的线程池 public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, ...
2019-08-11 18:54:29
104
原创 AQS和CAS
CASConmpare And Swap,它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新的给定值。 这是作为单个原子操作完成的。java中的Atomic包内部包含Unsafe类,Unsafe(C++)类内部实现原理就是CASABACAS可以解决并发问题,但是如果1,2连个线程同时操作数据x,1将x修改为y,再次修改成x,此时2对x进行更新此时2线程可以...
2019-08-11 16:38:31
942
原创 原子性
原子性原子性是指一个操作不可中断,要么完全成功,要么失败Atomic包,竞争激烈,性能好,但只能维持一个值synchrinized,不可中断,适合竞争不激烈的环境Lock,可中断,竞争激烈Atomic内部包含一个用volatile修饰的变量private volatile int value;实际操作的是unsafe类private static final Unsafe ...
2019-08-11 15:08:05
141
原创 重排序与volatile
重排序为了提高编译器和处理器的能力,对代码编译执行顺序进行修改// a和b没有依赖关系,编译时可能会是b先执行在执行aint a = 1int b = 2 // 下面由于b依赖于a,所以不会进行重排序int a = 1int b = a + 1volatile当一个线程对共享变量进行修改,其他线程可以立即知道新的共享变量的值,防止重排序每次使用时立即从主内存刷新read,...
2019-08-11 14:17:43
134
原创 class,dex,Dalvik,ART
Class文件基本信息class文件的作用是记住类的所有信息8位字节对齐每个类和接口单独占一个class文件缺点内存占用大堆栈加载方式,加载速度慢文件IO多,类查找慢Dex文件记住整个工程所有类文件信息8字节对齐整个应用所有java文件放在一个dex文件中分为文件头,索引区,数据区Dalvik虚拟机执行文件为dex基于寄存器(JVM基于栈)运行时将字...
2019-08-11 13:46:50
110
原创 classloader源码
DexClassLoaderDexClassLoader继承于BaseDexClassLoader,可以加载自定义目录下的Dex文件,内部只有一个方法 public DexClassLoader(String dexPath, String optimizedDirectory, String libraryPath,ClassLoader parent) { super(dexPa...
2019-08-09 20:57:08
306
原创 classloader概览
虚拟机根据类名加载二进制流的过程是由类加载器实现的,也就是classloader,java提供了三种classloaderBootStripClassLoader:加载jre/lib/rt.jarExtensionClassLoader:加载jre/lib/ext/*.jarAppClassLoader:加载CLASS_PATH目录下和应用程序类的加载采用双亲委派机制appcla...
2019-08-09 20:09:17
161
原创 类在虚拟机中的加载流程
加载-》连接(验证-》准备-》解析)-》初始化1)加载:通过类的全名获取类的二进制流,将类的数据结构转化为方法区的结构,在内存中生成一个代表这个类的class对象2)连接:验证:确保class信息正确无害准备:在方法区初始化变量的初始值,对象为nullstatic int a =1 (初始化为0)static final int a = 10 (初始化为10)解析:将类的符号引用转...
2019-08-09 18:53:58
356
原创 IntentService源码
IntentService继承自Service,在onCreate方法中创建HandlerThread并启动线程,利用HandlerThread在子线程中的Looper生成一个在子线程中工作的ServiceHandler HandlerThread thread = new HandlerThread("IntentService[" + mName + "]"); thread.sta...
2019-08-08 21:14:18
270
原创 HandlerThread源码
HandlerThread继承于线程,内部包含一个Looper,Looper在run方法中初始化并进入Loop循环public void run() { mTid = Process.myTid(); Looper.prepare(); Looper.loop();}外部使用时,利用这个Looper生成Handler,这样这个Handler的dispatchmessage方法就...
2019-08-08 20:58:34
515
原创 垃圾回收算法
判定对象为垃圾对象的方法引用计数法对象每被引用一次,计数器加1,每减少一个引用,计数器减1,当计数器为0,可视为垃圾对象,可以被GC掉可达性分析从虚拟机栈,本地方法栈,方法区出发遍历整个堆区,处于连通区的对象是不可回收的,不处于连通区的是可以GC的对象回收策略标记清除算法分为两个过程,首先标记出可清除的区域,之后进行清除,缺点产生大量内存碎片复制算法将内存分为...
2019-08-08 20:44:41
134
原创 kotlin内部类
内部类:默认静态内部类,用inner修饰为非静态内部类class InnerClass{ // 默认静态 class SubClass{} // 加inner修饰变为非静态 inner class InnerSubClass{}}fun main(args:ArrayList<String>){ // 静态可以直接new ...
2019-08-08 18:59:18
1198
原创 kotlin属性代理
属性代理是指属性完全被代理类来实现,var的代理类需要实现setValue和getValue,而val的代理类只需要getValue方法即可var i:Int by IntDelegate()val j:Int by ValIntDelegate()class IntDelegate{ operator fun getValue(thisRef: Any?, property: K...
2019-08-08 18:32:19
242
原创 kotlin扩展方法
扩展方法是指不改变类的源码的情况下为类增加自定义的方法fun String.times(times: Int): String { var builder = StringBuilder() for (i in 0 until times) { // 这里的this只得调用者本身 builder.append(this) } ret...
2019-08-08 18:08:53
1155
原创 kotlin可见性关键字
在kotlin文件中修饰方法,默认为public,不能用protectedprivate fun test1() {}internal fun test3() {}// public 为默认public fun test4() {}// protected会报错protected fun test2() {}fun main(args:ArrayList<String>...
2019-08-08 17:46:33
694
原创 ThreadLocal源码
threadlocal机制的实现与thread和threadlocalmap密不可分ThreadLocalMapThreadLocalMap是ThreadLocal的静态内部类,内部由数组实现,默认大小16private static final int INITIAL_CAPACITY = 16;private Entry[] table;Entry继承自WeakReferenc...
2019-08-07 18:47:02
92
原创 ArrayList源码
ArrayList内部由数组构成,初始容量0private static final int DEFAULT_CAPACITY = 10;private static final Object[] EMPTY_ELEMENTDATA = {};private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};trans...
2019-08-06 21:24:34
150
原创 Vector源码
Vectorvector内部由数组构成 protected Object[] elementData; protected int elementCount; protected int capacityIncrement;默认大小为10public Vector() { this(10);}内部采用数组拷贝elementData = Arrays....
2019-08-06 21:08:50
98
原创 Java内存模型
概述java虚拟机分为线程共享区和线程私有区,共享区包括堆,方法区,私有区域包括程序计数器,虚拟机栈,本地方法栈,共享区是所有线程共享,私有区是每个线程独自拥有,java内存模型可以理解成一套规则,这套规则规定了私有区和共享区之间如何进行数据交互,保证数据正确交互八种操作锁定作用于主内存,把主内存的变量标记为某个线程独享读取把主内存中的变量读取出来载入把读取的变量存放到工作...
2019-08-06 20:25:15
93
原创 虚拟机内存
线程共享区包括堆和方法区堆 存放对象的区域 垃圾收集器工作区域 分为新生代,老年代方法区 常量 静态变量 编译后的代码线程私有区包括虚拟机栈,本地方法栈,程序计数器虚拟机栈 栈帧:一个方法拥有一个栈帧,每调用一个方法,就将栈帧压入栈,方法执行完成出栈。栈帧中存储局部变量表,操作数栈,方法出口等本地方法栈 为native方法服务程序计数器类似于指针,记录jav...
2019-08-06 20:04:45
193
原创 具名参数,默认参数,可变参数
class TestObj { /** * 变长参数可以写在任何位置,前中后 * 一个函数只能有一个变长参数 * */ fun test1(data1: Int, vararg data2: String, data3: Int) {} fun test2(vararg data1: Int, data2: String, data3: Int...
2019-08-06 18:29:25
704
原创 if表达式和for循环
fun test(): Unit { /** * if 表达式可以直接将结果返回给变量 * */ var x = 2; var result = if(x%2==0) "偶数" else "奇数" /** * 循环可以加标签,通过@定位标签 ...
2019-08-06 18:15:50
220
原创 变量var和常量val以及懒加载
// const 声明的在编译时就已知道值,类似C中的宏// const 修饰的可以写在类的最外层,或者companion object中const val constStr:String = "134"class TestObj{ companion object{ const val constStr2:String = "134" } // ...
2019-08-06 18:02:51
271
原创 ==和===
/** * == 比较内容 * === 比较内容+地址 * */ fun testEqus() { var src1:Int = 134 var src2:Int = 134 // true Log.d("test", (src1 == src2).toString()) // t...
2019-08-05 21:00:56
87
原创 is关键字用法
open class Parent { fun hello():Boolean { return true }}class Son : Parent() {}fun main(arrayList: Array<String>) { var parent: Parent = Son() if (parent is Pare...
2019-08-05 20:15:28
745
原创 as关键字使用
open class Parent{}class Son:Parent(){}fun main(arrayList: Array<String>) { var parent:Parent = Son() // 失败 抛出异常 var son:Son = parent as Son // 失败 返回为空 var ...
2019-08-05 20:07:10
595
原创 Kotlin回调写法
接口声明public interface CallBack { void onCallBack();}Java回调写法public class TestJava { public void setCallBack(CallBack callBack) { } public void test() { setCallBack(new Ca...
2019-06-28 15:31:18
3071
原创 Kotlin判空
Java判空public class TestJava { public void test(String data) { if (data != null) { Log.d("TestJava", "TestJava"); } } public void testArray(ArrayList<String...
2019-06-28 15:14:51
967
原创 Kotlin单例写法
Java 单例的写法public class Single { private static Single sInstance = null; private Single() { } public static Single getInstance() { if (sInstance == null) { sInst...
2019-06-28 14:59:20
651
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人