自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

joker

公众号:mxszgg

  • 博客(42)
  • 资源 (2)
  • 收藏
  • 关注

原创 谈谈 View 绘制流程

注:本文使用 sdk 23 作为源码参考。前言ViewRootImpl#performTraversals() ViewRootImpl#performMeasure()ViewRootImpl#performLayout()ViewRootImpl#performDraw()some tips onDraw()dispatchDraw()前言关于 View 的绘制流

2019-06-09 23:02:31 533

原创 MainDex 优化记

tips: 本文基于 AGP 3.0.1 源码分析MainDex 打入规则分析MainDex 瘦身容易忽略的地方其它优化MainDex 打入规则分析“maindex method 超过 65536 了,咋被打爆了呢?”在过去很长一段时间内我们的应用 maindex 会被打爆,于是大佬们使用了DexKnifePlugin 来解决问题,但是后来 AGP 上了 3.0.1 以及其他问题的出现,DexKnifePlugin 已经不是能够很良好地适用于我们的 app 中了,于是巴神(公.

2019-02-07 19:23:07 1659

原创 利用 Transform 解决模块化开发服务调用问题

如果你对本文感兴趣,也许你对我的公众号也会有兴趣,可扫下方二维码或搜索公众微信号:mxszgg前言模块化开发的服务调用概念解决方案Transform APIjavassist实操前言如果读者对模块化开发的服务调用具有一定的认识可以跳过下面一小节。模块化开发中的服务调用概念模块化开发现在对于 Android 开发者来说应该是一个耳熟能详的名词了,现在应该有许多应用...

2018-10-05 17:00:35 908

原创 开源库小技巧+1,在 ContentProvider 中初始化

情景模拟调用时机优缺点后记情景模拟最近小明开源了一个 Android 三方库,接入流程很简单,开发者们只需要在应用的 Application 的 onCreate() 方法中去初始化它,然后就可以调用相应的库 API 了——public class App extends Application {  &

2018-08-28 20:15:08 1681 1

原创 写给 Android 开发者的 Gradle 系列(四)plugin 实战包体积瘦身

本文由玉刚说写作平台提供写作赞助,版权归玉刚说微信公众号所有 原作者:joker 版权声明:未经玉刚说许可,不得以任何形式转载本文插件基于 Android Gradle Plugin 3.0.1 版本 前言 日常开发中,为了避免运行时 R 文件反射失败,一般在混淆的时候都会将 R 文件 keep 住,但是因此也会导致包体积有一定的上升,那么有没有减少 R 文...

2018-05-28 08:20:06 1224

原创 写给 Android 开发者的 Gradle 系列(三)撰写 plugin

本文基于 Android Gradle plugin 3.0.1 前言 在前文中笔者阐述道 task 就相当于函数,那么这篇文章所要介绍的 plugin 就相当于函数库了。毕竟在 build.gradle 文件中撰写大量的 task 是肯定不好维护的,所以可以将 tasks 做成 plugin 然后直接 apply 就好了。 就像在 app/build.gradle 中 apply...

2018-05-20 17:18:30 834

原创 写给 Android 开发者的 Gradle 系列(二)撰写 task

本文基于 Android Gradle plugin 3.0.1前言task 撰写 task 声明 扩展task 内容格式task 依赖关系task 实战 install && launch apkhook assets后记前言在 app/build.gradle 中添加如下依赖: compileOnly ‘com.android.tool...

2018-05-14 22:15:26 2060

原创 写给 Android 开发者的 Gradle 系列(一)基本姿势

本文基于 Android Gradle plugin 3.0.1Gradle 介绍如何学习 GradleGradle taskGradle 构建周期 hook Gradle 构建过程后文 附录 Gradle 介绍 笔者认为能够戳进这篇文章的读者十之八九也是知道 Gradle 可以用来干什么,所以没必要介绍什么了,毕竟说一堆术语搞得大家都不懂很难堪(手动滑稽)。简单来说...

2018-05-11 09:24:33 6381 2

原创 聊一聊 EventBus 源码和设计之禅

前言register() 获取当前注册对象所有订阅方法信息subscribe()post() postSingleEvent()unregister()threadMode invokeSubscriber()Poster#enqueue()sticky优化操作 eventInheritanceAPT设计技巧 反射方法FindStateAsyncPoster、B...

2018-04-15 21:40:13 565

原创 友好 RxJava2.x 源码解析(三)zip 源码分析

系列文章: 友好 RxJava2.x 源码解析(一)基本订阅流程 友好 RxJava2.x 源码解析(二)线程切换 友好 RxJava2.x 源码解析(三)zip 源码分析本文基于 RxJava 2.1.9前言示例代码源码解析可视化后记前言距离前两篇文章已经过去三个月之久了,终于补上第三篇了。第三篇预期就是针对某一个操作符的源码进行解析,选择了 Observabl...

2018-03-31 23:43:22 954

原创 手摸手第二弹,可视化 RecyclerView 缓存机制

本文掘金地址:手摸手第二弹,可视化 RecyclerView 缓存机制前言一缓二缓四缓其他 谈谈 BindView(1)谈谈 BindView(2)前言开题前,笔者还是要说几句先,依旧和前文一样,文章内不涉及源码讲解,默认各位读者对源码有一定的了解,撰文的原因也如同前文,因为笔者认为当下在 ListView/RecyclerView 的源码讲解的文章中,大都是对着源码噼

2018-01-15 20:35:18 630

原创 可视化 ListView 缓存机制,手摸手带你打通任督二脉

本文掘金地址:https://juejin.im/post/5a52b0e15188257345015ad3简介痛点缓存机制解析 初始化触发第一个缓存屏幕内容数量最大化触发 Item2 的显示继续触发总结项目地址:ListViewVisualization简介本文不涉及 ListView 缓存机制的源码探析,关于 ListView 的缓存机制郭霖前辈的《Andr

2018-01-07 20:16:24 585

原创 浅谈 Java 8 接口默认方法和静态方法的设计

前言默认方法 compare with class设计目的与优势注意静态方法 compare with class设计目的与优势注意jdk 中的实现前言Java 8 对接口设计了默认方法和静态方法,但是好像并不是特别的引人注目,笔者在面试的过程中也时常被面试官一笔带过这个问题,国内深入探究其原因的文章也并不多见,知乎上关于这方面的有两个回答比较好——Java8中拥有默认方法实现

2017-11-30 20:39:56 1915

原创 友好 RxJava2.x 源码解析(二)线程切换

系列文章: 友好 RxJava2.x 源码解析(一)基本订阅流程 友好 RxJava2.x 源码解析(二)线程切换 友好 RxJava2.x 源码解析(三)zip 源码分析本文掘金地址:友好 RxJava2.x 源码解析(二)线程切换本文基于 RxJava 2.1.3前言示例代码源码解析 Observer#onSubscribe(Dispose)Observable#o...

2017-11-26 10:36:26 962 1

原创 友好 RxJava2.x 源码解析(一)基本订阅流程

系列文章: 友好 RxJava2.x 源码解析(一)基本订阅流程 友好 RxJava2.x 源码解析(二)线程切换 友好 RxJava2.x 源码解析(三)zip 源码分析本文掘金地址:友好 RxJava2.x 源码解析(一)基本订阅流程本文基于 RxJava 2.1.3前言示例代码订阅流程源码解析订阅流程 Observable#subscribe(Observer) ...

2017-11-26 10:30:49 1099

原创 CAS in java

概念比较compare with volatalecompare with Lock 锁的劣势CAS 在 java 中的应用概念CAS 英文全称 compare and swap,译为比较并交换,再通俗点 —— CAS 包含3个操作数,需要内存中的旧值 V,进行比较的值 A,以及拟写入的新值 B。当且仅当 V 等于 A 的时候,才会将 V 的值替换成 B,否则不执行任何操作。这里的“当且

2017-11-14 12:15:03 428

原创 一劳永逸修改 Android Studio .gitignore 默认模板

Android Studio 的项目中默认包含了 .gitignore 文件,但是其内容不是特别的友好,例如其 app 级别的 .gitignore 文件内容如下:*.iml.gradle/local.properties/.idea/workspace.xml/.idea/libraries.DS_Store/build/captures.externalNativeBuild但

2017-11-10 12:42:46 8526 1

原创 结合 TreeMap 源码分析红黑树在 java 中的实现

注:本文的源码摘自 jdk1.8 中 TreeMap红黑树的意义红黑树的性质左旋、右旋增删总结红黑树的意义红黑树本质上是一种特殊的二叉查找树,红黑树保证了一种平衡,插入、删除、查找的最坏时间复杂度都为 O(logn)。那么红黑树是如何实现这个特性的呢?红黑树区别于其他二叉查找树的规则在于它的每个结点拥有红色或黑色中的一种颜色,然后按照一定的规则组成红黑树,而这个规则就是我们这篇文章所想

2017-11-07 00:10:15 1074

原创 AsyncTask —— Android 原生异步通信简析

AsyncTask 与 RxJavaHello World源码简析 构造函数 mWorkermFutureexecuteAsyncTask 与 RxJava在这个 RxJava 已经遍布各个 app 的时代,作为原生的 AsyncTask 可能已经倍感压力了吧。但是无论如何 RxJava 如何流行,AsyncTask 都是我们需要掌握的,相比于 RxJava 我们需要知道 AsyncT

2017-09-01 10:28:48 627

原创 国产 Android 权限申请最佳适配方案 —— permissions4m

* 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 - 前言 - 情景再现 - permissions4m 简介 - 后记前言permissions4m 最初的设计是仅仅做成一个编译器注解框架,在1.0.0版本时,它纯粹地实现了原生 Android 请求流程,关于它的设计思路可以查看这篇如何打造一个 Android 编译时注解框架。但是当投入笔者自己项目中使用的时候,笔者

2017-08-26 13:40:01 8621 30

原创 如何打造一个 Android 编译时注解框架

前言预览permissions4m-annotationpermissions4m-processor AnnotationProcessorProxyInfoAnnotationProcessor 编码ProxyInfo 编码permissions4m-api前言近期笔者开源了一个 Android 编译时注解框架库——Permissions4M,一款处理 Android

2017-08-02 19:37:35 10212 7

原创 手摸手教你如何把项目提交到 jcenter

前言jcenter 作为 Android 开发者来说,应该是首选,因为 Android Studio 默认即是以 jcenter 为远程库,本文使用 bintray-release 插件完成项目的上传,相比于网上流传的 gradle-bintray-plugin, bintray-release 所需要编写的 gradle 代码量极少,所以即使你是一个与我一样对 gradle 不熟悉的开发人员,那也

2017-08-01 21:03:16 1080

原创 强制清除 gradle 依赖缓存

如果你正在开发一个库,并将它传上 jcenter 或者 jitpack,由于没上线,于是你一直上传 1.0 的版本,不停地覆盖远程仓库上的版本,但是你遗憾地发现本地的 gradle 出了问题,那么是由于 gradle 在下载依赖的同时自动将其缓存了一份在本地,所以等你第二次开启一个项目并依赖同一个库的同一个版本的时候,gradle 实际上只是拿了本地的缓存,但是这份小聪明,对于我前面所说的情况下的开

2017-07-30 15:01:15 49685 5

原创 Android Paint 浅坑—— Style 模式

业务场景Style 坑析业务场景近期遇到一个需求,绘制一个如下的自定义 View ——最初的想法是先绘制一个中心的灰圆,再绘制外圈的黄色圆弧,再绘制蓝绿色圆弧(此处仅为了讨论坑,不考虑最优绘制方法),于是写下如下代码:@Overrideprotected void onDraw(Canvas canvas) { // 黄弧最外半径 mMR = w * 4 / 21; /

2017-06-04 11:49:07 5480 3

原创 java 设计模式 —— 浅析代理模式

静态代理业务场景静态代理剖析动态代理业务场景动态代理剖析动态代理属性静态代理业务场景这天你早早地到了公司,打开电脑准备写代码,组里突然给你下发了一个任务,由于 java 后台组这几天有点缺人,临时需要你帮个忙,让你做一个 百度网站的爬虫,虽然你满肚子不情愿,但是又没有办法,谁让你是一个小全栈呢~幸运的是,等你来到后台组的时候,后台的大佬告诉你基本的框架已经搭建好了,你只需要完成网页爬取的代

2017-05-25 17:15:02 767 1

原创 Android 注解指南

前言一览示例详解前言日常开发中,注解能够帮助我们写出更好更优秀的代码,为了更好地支持 Android 开发,在已有的 android.annotation 基础上,Google 开发了 android.support.annotation 扩展包,共计50个注解,帮助开发者们写出更优秀的程序。官网链接:https://developer.android.google.cn/reference/

2017-04-23 18:01:20 11777 2

原创 从源码角度剖析 setContentView() 背后的机制

注:本文基于 AS 2.3,示例中的 Activity 继承自 AppcompatActivity。示例源码解析 AppCompatDelegateImplV7PhoneWindow流程一览示例日常开发中,我们在 Activity 中基本上不可避免的都会使用到 setContentView() 这行代码,而理解它背后的机制能够让我们对日常的优化有更深地理解,网上也有些许文章介绍该机制,但

2017-03-28 19:09:04 2555

原创 Layout Inspector —— Android Studio 替代 Hierarchy Viewer 的新方案

最近在研究 View 窗口机制的时候想要查看一下应用的视图结构,第一印象当然是布局查看神器 —— Hierarchy Viewer 啦!然后走进 /sdk/tools/ 目录下发现曾经的 Hierarchyviewer.bat 不见了 ——而原来的是这样的 ——我们可以看到,还是少了相当多的东西的(仅 .bat 文件),那我们就试试用 DDMS 吧,打开 DDMS,然后 Window -> Open

2017-03-27 13:14:37 31687 7

原创 从实例和源码角度理解 postInvalidate() 和 invalidate() 的区别与联系

区别与联系使用情景源码解析区别与联系postInvalidate() 方法在非 UI 线程中调用,通知 UI 线程重绘。 invalidate() 方法在 UI 线程中调用,重绘当前 UI。使用情景近期在对 View 温故而知新的学习过程中,看到一个 postInvalidate() 方法,让我很好奇,这个方法与 invalidate() 方法有什么区别和联系呢?让我们假设一个场景,当前有一

2017-03-24 23:18:49 5962 15

原创 从源码角度简析 Android 消息机制

MessageQueue 源码解析 enqueueMessage()next()Looper 源码解析 prepare()loop()quit()、quitSafely()Handler 源码解析 构造方法send() 系列post() 系列dispatchMessage()流程一览Handler 最佳写法补充MessageQueue 源码解析MessageQueue

2017-03-16 17:52:24 956 4

原创 从实例和源码角度简析 ThreadLocal

ThreadLocal 是什么ThreadLocal 的使用ThreadLocal 源码解析ThreadLocal 使用场景注:此文源码摘自 sun jdk 1.8 ThreadLocal 是什么 打开 ThreadLocal 的源码我们可以看到如下的注释:大致翻译如下:该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get

2017-03-15 15:15:16 645 1

原创 从源码角度简析 Hashtable、HashMap 和 LinkedHashMap

Hashtable 与 HashMap 不同点相同点LinkedHashMap注意:此文原文均摘自 Sun jdkHashtable 与 HashMap不同点先看类的定义——除了接口的实现是相同的,我们可以看到继承的类是不同的,我们不妨打开 Dictionary 抽象类看一下我们可以看到红色箭头指向的地方,大致翻译一下就是 —— 注意:这个类已经过时了,新的实现应该去实现 Map 接口,而不

2017-03-08 09:45:25 569

原创 从源码角度简析 LinkedList 和 ArrayList

联系与共同点不同点联系与共同点我们首先来看类的定义:ArrayList 继承自 AbstractList,而 LinkedList 是继承自 AbstractSequentialList,我们再打开 AbstractSequentialList,可以看到:可以看到,AbstractSequentialList 是继承自 AbstractList 的,那么这两个父类有什么区别呢?查看 api 文档

2017-03-04 10:01:52 541

原创 java 设计模式 —— 浅析单例模式

饿汉模式懒汉模式Double Check Lock静态内部类推荐: 静态内部类优先饿汉模式public class Singleton { private static final Singleton instance = new Singleton(); private Singleton {} public static Singleton getInstanc

2017-03-03 10:22:32 413

原创 为什么泛型类无法继承自 Throwable

问题提出场景原因后言问题提出场景近期在看《Java 核心技术卷I》第八章泛型程序设计时提到泛型类是无法继承自 Throwable,倘若我们在 IDE 中写上类似 public class CustomException<T> extends Throwable 的代码,那么 IDE 会提示我们 Genergic class may not extends ‘java.lang.Throwabl

2017-02-21 16:42:52 3090 4

原创 java 设计模式 —— 浅析状态模式

这天你早早的来到了公司,刚端上热腾腾的热茶,产品经理过来了——“小颜,咱们项目新增了两个功能,一个是点赞功能,一个是转发功能,还有我们定期会做一个抽奖活动,所以还要新增一个抽奖功能,这个你把它做了吧,有没有问题?”“经理,没有问题,不就是在点击这些按钮的时候判断一下当前的登录状态么,如果登录了,那么就可以进行这些功能,如果没有登录的话,那么点击这些功能我们就应该跳到登录的界面,对不对?”经理别有意味

2016-12-18 09:56:55 495

原创 详解 Dagger2 的 @Scope 和 @Subcomponent

个人觉得网上关于 dagger2 文章中关于 @Scope 和 @Subcomponent 解释的并不是很详细,也可能是我个人能力有限不能够理解,所以写下这篇文章,希望能够帮助后人更方便的入门。@Scope 是什么@Scpoe 的使用@Subcomponent 是什么@Subcomponent 的使用@Subcomponent 和 @Component 的实际使用场景定义@Scope 是

2016-11-26 20:35:22 2599 1

翻译 CoordinatorLayout 的滑动处理

原文地址:https://guides.codepath.com/android/Handling-Scrolls-with-CoordinatorLayout#troubleshooting-coordinated-layouts预览CoordinatorLayout 扩展了许多能实现 Google Material Design scrolling effects(滚动技巧) 的效果,目前,这个

2016-08-31 12:18:44 8370

原创 Android Drawable Importer的使用

项目地址:https://github.com/winterDroid/android-drawable-importer-intellij-plugin

2016-06-19 19:40:14 11144 4

原创 解决 genymotion 无法通过 10.0.2.2 或 127.0.0.1 访问本地 tomcat 文件

博主在使用 genymotion 访问本地 pc 搭建的 tomcat 服务器中的 json 文件时,出现了 genymotion 无法访问到该文件的情况,首先在 pc 端,我们使用 localhost:8080/update.json 访问我的 tomcat 本地 json 文件,可以正常访问,如图所示我们再使用 127.0.0.1:8080/update.json 访问我的访问我的

2016-04-19 21:41:42 5076 1

北邮数据挖掘讲义

关于数据挖掘的纯理论讲义。共分为四章节。不包含任何代码相关信息

2017-10-22

北邮算法课件

蛮力法、回溯法、分支限界法、分治法、减治法、贪心法、动态规划法

2017-10-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除