- 博客(118)
- 资源 (6)
- 收藏
- 关注
原创 ByteX-shrink_r源码解析
ByteX是字节团队开源的一个字节码插桩工具,而shrink_r是其中的一个插件是用来对R文件常量内联,R文件瘦身;无用Resource资源检查;无用assets检查。就是为了解决上述问题中module工程里R文件没有被内联产生的一种方案,他通过ASM操作class文件进行操作对使用到R类变量的地方进行常量值替换,然后删除R文件从而达到减少包大小的目的。总共流程如下第一遍遍历traverse class获取到所有待替换R文件类变量的常量。
2022-12-01 09:30:55 824 1
原创 Okhttp3 链接池复用机制源码探索
前文对于http请求我们都知道开始于TCP链接的三次握手然后传输数据然后释放,如下图而当我们开启连接复用keep-alive后就是指在上一次链接不立马断开链接在超时范围内复用connection在timeout 空闲的时间内就会复用相同的Request来减少握手大幅度提高了网络请求效率;如下图而在Okhttp3中是怎么做到连接池复用的,本文从源码(版本v4.9.3)角度来进行探索Okhttp3的连接池复用、清理、回收机制连接池的代码类位于okhttp3.ConnectionPool,该类作为默
2022-05-18 13:03:55 1074
原创 ASM里如何判断是不是调用了超类方法
通过判断方法的 ower是不是当前类的superName且指令是 Opcodes.INVOKESPECIAL
2021-05-21 15:26:27 312
原创 Adnroid - startService启动过程源码分析
部分内容来自《Android开发艺术探索》ContextImplservice的启动是从ContextWrapper的startService()开始的, @Override public ComponentName startService(Intent service) { return mBase.startService(service); }方法里调用了mBase.startService(service);来启动service,而mBase的类.
2020-09-11 17:08:25 192
原创 try...catch...finally与return
场景1不走catch try { return 1 } catch (E: Exception) { return 2 } finally { return 3 }先执行try然后执行finally,最终返回3场景2走catch try { throw RuntimeException() return 1
2020-09-08 16:52:05 251
原创 Android-AsyncTask源码解析
AsyncTask 使用 public void test(){ MyAsyncTask myAsyncTask = new MyAsyncTask(); myAsyncTask.execute(""); } class MyAsyncTask extends AsyncTask<String, Integer, Boolean>{ @Override protected Boolean doInBack
2020-09-07 17:59:03 194
原创 ‘void android.view.View.dispatchDetachedFromWindow() on a null object reference’ 修复记录
线上报了一个void android.view.View.dispatchDetachedFromWindow()bug,日志如下Attempt to invoke virtual method 'void android.view.View.dispatchDetachedFromWindow()' on a null object reference1 android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:3867)2 a
2020-05-19 14:35:15 4727 2
原创 转:解决Matcher ANR
long millis = System.currentTimeMillis(); // This checkInterval produces a < 500 ms delay. Higher checkInterval will produce higher delays on timeout. Matcher matcher = createMatche...
2020-03-22 18:19:37 321
原创 SPI机制原理解析
SPI机制原理解析看了上篇spi使用后,你或许觉得spi太好用了吧,但或许也有疑问:为什么只能放在META-INF/services/目录下?为什么要用全路径命名?他的实现原理是什么?基于这两个问题,我们深入探究下ServiceLoader源码。构造函数 private ServiceLoader(Class<S> svc, ClassLoader cl) { ...
2020-03-22 17:54:46 418
原创 Android-使用@AutoService实现spi
引入(Koltin)apply plugin: 'kotlin-kapt'kapt 'com.google.auto.service:auto-service:1.0-rc6'api 'com.google.auto.service:auto-service:1.0-rc6'举例创建一个接口文件interface Book { fun name() :String}创...
2020-03-10 23:25:57 3354
原创 大话设计模式---责任链模式
责任链设计模式介绍使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它位置。----《Android设计模式》使用场景多个对象都可以处理这个请求,但具体哪个处理则在运行时决定。在请求处理者不明确的情况下向多个对象中的一个提交请求需要动态指定一组对象处理请求UML使用示例在日常开发中网络请...
2020-01-14 21:52:21 265
原创 android-apt编译时注解注意事项
最近在写APT相关,遇到一些坑,这里总结写Gradle版本不能太高我一开始用的最新版结果死活没有效果最后发现是gradle版本太高,最后我用的是 classpath 'com.android.tools.build:gradle:3.1.4'distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-b...
2019-12-22 21:23:25 243
原创 这可能是最好用、实现最简单的Android权限请求库了
为什么最好用?该工具库使用Builder设计模式,可以说是非常简单上手的工具了,使用方法如下:kotlin PermissionUtil.Builder(this) .setPermissions(Manifest.permission.RECORD_AUDIO) .setDenied { Toast.mak...
2019-12-13 21:30:38 2014
原创 从源码角度分析 - Activity.onCreate可以在子线程里更新UI么?
我们都知道字线程里更新不能更新UI,否则系统会报Only the original thread that created a view hierarchy can touch its views.错误,具体如下:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that crea...
2019-11-30 16:47:27 290
原创 从App启动理解ContentProvider的创建
ActivityThread.main我们知道app的启动是从ActivityThread.main方法开始的,所以我们先从main看起 public static void main(String[] args) { ... //创建Looper Looper.prepareMainLooper(); //创建ActivityThread Ac...
2019-11-07 20:59:17 997
原创 Android-使用ContentProvider来初始化你的sdk(一)
在日常Android开发中经常会写一些sdk来供他人或者自己调用,一般这些sdk都涉及到初始化,虽然这个初始化过程我们一般都会让调用者自己来调用完成初始化过程。但是今天我们来介绍一个不需要调用者调用sdk初始化的方法,我们自己来完成这个初始化过程。下面来介绍方法创建Library首先我们创建个简单的library,这个library的功能就很简单:需要传入context提供判断是否已初始...
2019-10-26 20:17:57 2046
原创 recyclerView item 曝光算法(Rx版本)
功能点基于rxjava封装实现了去重,不会重复曝光,可以根据 第一个、最后一个item显示高度比来算曝光/** * recyclerView item曝光计算工具类 * Create by JokAr. on 2019-09-24. */public class ThrottleTrackingBus extends RecyclerView.OnScrollListener ...
2019-09-24 21:25:13 821 1
原创 gradle 上传Jar 到maven
新建maven.gradleapply plugin: 'maven'uploadArchives {repositories {mavenDeployer {// 本地仓库路径repository(url: ‘’) {//用户名,密码authentication(userName: ‘’, password: ‘’)}/ snapshot仓库路径(没有可以不写)...
2019-06-11 13:25:01 1155
原创 android studio 上传android arr到本地maven仓库
新建一个maven.gradle文件apply plugin: 'maven'uploadArchives { repositories { mavenDeployer { // 本地仓库路径 repository(url: '') { //用户名,密码 ...
2019-06-11 11:40:00 906
原创 探究为什么Glide 可以与 Activity 生命周期绑定
用过Glide同学都知道,Glide的最大不同之处就是可以与Activity生命周期绑定,在Activity``````onDestroy时自动结束网络请求,释放资源。那么为什么Glide 可以做到与Activity绑定生命周期,并且是怎么做到到呢?我们通过一些代码来说明(代码均来自Glide源码):首先我们创建一个 LifeCycleListenerpublic interface Li...
2018-12-24 19:03:10 663
原创 android uri 解析获取文件真实路径(兼容7.0+)
主要是兼容7.0以后的fileProvider 把URI 以content provider 方式 对外提供的解析方法 public static File getFileFromUri(Uri uri, Context context) { if (uri == null) { return null; } switc...
2018-10-07 12:43:21 9524 8
原创 手撸一个 微信长按菜单 - FloatMenu
在日常开发中,长按某个view出现个菜单是很常见的需求,Google 也给我们提供了一些组件来实现,比如PopupMenu。但是在实际使用中还是发现他无法满足我们的所有需求。比如:产品要求长按菜单出现在手指按下的位置,额 这就头疼了,PopupMenu只能展示在view的底部或者头部。还有个问 题如果你的view过长超过一屏,那么 PopupMenu 就无法显示在屏幕里了。所以没办法,只...
2018-07-14 18:29:11 1089
原创 BottomSheetDialogFragment 如何设置高度和禁止滑动
主要是获取dialog 的BottomSheetBehavior 然后设置 setPeekHeight 和 BottomSheetCallback.codepublic class BottomSheetFragment extends BottomSheetDialogFragment { private Button button; private View ...
2018-07-07 19:58:31 7699
原创 Android国际化(多语言)实现,支持8.0
前言最近因为项目中使用了国际化,所以正好研究了下实现方法; 首先说下项目需求: - 可以随着系统切换语言而切换语言,不支持的语言显示默认 - 用户可以选择语言,且不会随着系统切换语言或者应用重启而还原虽然需求还是很简单的,但是实现起来还是遇到了不少的麻烦,首先看下效果图: 老规矩项目源码实现思路在application 的 attachBaseCont...
2018-04-07 22:32:42 10243 10
原创 android 使用距离传感器实现贴近息屏离开亮屏
注册权限要控制屏幕息屏需要用到WakeLock,所以需要在Manifest里注册<uses-permission android:name="android.permission.WAKE_LOCK" />代码实现注册传感器SensorManager sensorManager = (SensorManager) getSystemService(Con...
2018-03-21 12:04:30 5793
原创 mac 环境编辑编辑命令
$ cd ~$ touch .bash_profile$ open -e .bash_profile$ source .bash_profile
2018-02-25 16:24:47 318
原创 怎样在不使用room情况下把本地数据转化为DataSource.Factory?
最近使用了 google 新发布的框架 Android Architecture Components,使用起来很酷,不用操心数据的持久化,自动刷新等生命周期问题。但是却遇到了个问题,这个框架一起使用很爽,但是要是使用其中的几个就会遇到些问题,比如:不使用 room sql 框架把自己的数据库数据转换为 DataSource.Factory,下面介绍如何解决的:查看了 room 源码发现了所有...
2018-02-10 21:25:20 1301
原创 HandlerThread 源码解析
HandlerThread 是什么?系统对 HandlerThread 的解释是这么一段话:Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note that start() must still be called.从上面
2017-11-01 10:49:10 282
原创 Android 获得最近一张拍照或截屏图片
类型微信那种,拍了一张照片或者截了屏 点击聊天加号 就会有个 弹框询问是否要发送那张图片;这里只是做了获取那张最新图片的代码,没有判断时间间隔
2017-10-16 11:18:51 4493 5
原创 Glide 使用Transformation 时 placeholder、error 无效解决方法
Glide提供了Transformation 可以让图片显示成各种样式,但是使用Transformation时会有个问题,比如使用CircleCrop时预览图和加载失败后显示的图并不是圆形,查阅官方看到说 transformation比不会对此过程进行转换,所以才产生了上述问题,解决方法如下(Glide V4+版本):2018-2-26 修正 public static void lo...
2017-09-29 14:04:17 5241
原创 Swift - 使用SWRevealViewController实现侧滑菜单
侧滑菜单是很多应用常见的功能,有很多方式可以实现,本篇介绍如何使用SWRevealViewController来实现侧滑菜单为;
2017-09-16 15:49:26 1012
原创 Swift - UITableViewAutomaticDimension 不起作用的解决办法
问题学习swift过程中遇到了个问题就是UITableView的高度自适应UITableViewAutomaticDimension不起作用,并且还报了个 [Warning] [Warning] Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tablev
2017-09-11 21:22:23 5708
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人