自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 资源 (4)
  • 收藏
  • 关注

原创 OKHTTP缓存问题记录

但是在实际使用的过程中,发现非文本内容,如果不对Response中的inputstream读取,就不会缓存下来。okhttp有一个功能就是适配http协议里面cache-control头。cache.put返回的是cacheRequset。比如使用如下代码读取后才能缓存到cache目录。这里解释了为什么要读流的时候才会写入缓存了。133行附近有一个cache.put方法。然后就是cache.put下面的。从Cache.kt文件中可以找到。分析了一下源码,记录一下原因。使用okhttp的缓存功能。

2023-08-09 14:15:02 155

原创 AS snapshot不更新解决方法

1、执行./gradlew clean --refresh-dependencies2、添加configurations.all { resolutionStrategy.cacheChangingModulesFor 0, 'seconds' }

2022-05-17 15:24:56 744

原创 Uri.parse解析包含哈希路由的网址

通常情况下我们使用Uri uri = Uri.parse(requesturl);来对一个链接进行解析,通过解析后得到的uri,可以得到链接各个部分的数据但是对于包含了哈希路由的网址,使用parse方法会得到意想不到的结果如下源码为例 String requesturl = "https://my.vivo.com.cn/#/home?sign=12345678"; System.out.println("...

2021-08-04 13:26:28 763

原创 Fragment 重复创建及内存问题总结

Fragment 这个组件相对很多开发这来说都比较熟悉,但是名字熟悉不代表用的熟练在使用过程中遇到一些需要注意的地方,写在这里供自己记录,也供大家参考一:Fragment重复创建问题一般我们使用Fragment 作为页面主体 会这么写,事实上在开发过程中大量可见这种写法如果遇到切换横竖屏,或者切换国家语言等场景此时观察打印的log会发现出现了三个Fragment对象其中有一个fragment在创建后立刻销毁了这是因为Fragment 的Host 也就是..

2021-08-04 10:38:33 947

原创 Android自定义权限处理组件安全问题

组件的安全问题 其实就是调用与被调用的安全问题以广播为例当APP实现一个广播接收器,其他APP发送广播让该应用接收,在整个过程中有两个问题问题1:接收方定义了一个广播接收器,那么如果不做限制,任何人都可以给该应用发广播,那就存在应用被恶意攻击的风险解决方案:当接受方定义广播接收器时,同步定义一个限制条件,不满足该条件的人发送的广播不会被我监听到问题2:发送方作为广播的发起者,也不一定希望自己发送的广播被其他人监听到,如果是一些携带了敏感数据的广播,那么就存在被其.

2021-08-04 10:27:39 299

原创 Android AVD 模拟器实现https代理和抓包

因为某些特殊原因需要使用 Android AVD 模拟器来进行https代理和抓包,试了许久,终于成功了。在实际配置的过程中,有很多问题问题1:无法push证书,因为模拟器无法remount问题2:有些模拟器的wifi无法设置代理,需要有其他办法进行设置第一步 下载模拟器本人mac电脑,测试了API30,API29,都不能成功remount,只有API24成功,其他有兴趣的也可以逐个试试下载完成后安装模拟器,并创建模拟器,名称可以命名为API24 注意这个名称后面要使用.

2021-08-04 10:22:15 1433

原创 Okhttp请求重定向检测

HttpURLConnection的重定向处理我们都知道一般的网络框架都是可以在内部自动处理重定向,比如常见的HttpURLConnection,当我们使用HttpURLConnection来处理重定向时,HttpURLConnection提供给一个 ,setInstanceFollowRedirects(true|false)来设置当前的HttpURLConnection是否在内部处理重定向请求设置为true:内部处理重定向,返回最终的响应结果,调用方得到最终的code为200设置为false

2021-08-04 10:07:54 3503

原创 Xposed框架实战

介绍一个强大的hook框架可以编写自定义的模块来hook各种应用的api 从而达到劫持的效果(修改imei 修改地理位置等)什么是hookhook本质就是劫持函数调用Hook的难点在于寻找函数的入口点、替换函数,这就涉及到函数的连接与加载机制。基本原理xposed 原理就是修改系统的关键文件,然后当APP调用系统API时,首先经过xposed,而这些...

2020-09-03 09:51:14 2961

原创 Google Nexus 5X 8.1 Root 安装Xposed Https代理教程

一:开启开发者模式1:点击"设置"-"系统"-"关于手机"2:连续点击"版本号" 直到提示开发者模式已经打开3:退回"系统"界面 点击"开发者选项",勾选"usb调试"二:解锁1:在开发者选项钟 打开"启用OEM解锁"2:关机3:同时按住电源+音量下 进入fastboot4:连接手机到电脑5:cmd下输入 fastboot oem unlock6:根据...

2019-10-29 14:31:58 1414

原创 Android 6.0与9.0 加载WebView Resource 的区别

从前两篇文章里面我们分析了 6.0的资源管理机制和9.0的资源管理机制先说以下6.0的根据6.0 ResourceManager的代码 我们先做一个测试编写如下代码 我们将mActiveResources中保存的内容打印出来 ResourcesManager resourcesManager = ResourcesManager.getInstan...

2019-10-12 17:32:46 764

原创 View.post Handler.post 以及 IdleHandler 区别分析

先分析一下View.post 和 Handler.post 的区别在分析之前 先写一个例子public class MyView extends LinearLayout { String TAG = "MyView"; Handler handler = new Handler(); public MyView(Context context) { ...

2019-08-31 10:00:03 443

原创 OKHttp拦截器之责任链模式

OKHttp中一个比较有意思的地方就是提供了拦截器机制说起这个拦截器,它使用了一个比较冷门的设计模式,叫责任链模式我翻阅了若干设计模式的书籍,对责任链模式基本上都是一笔带过没有过多的描述关于责任链模式的写法,网上有很多,大多比较简单,而OkHttp的责任链写法比较独特。下面就采用OkHttp的写法 来实现一个简单的责任链模式,理解了这个责任链模式,也就理解了OkHttp的拦截器原理...

2019-08-28 20:57:38 354

原创 Android 9.0 WebView Resource 加载原理分析

在 “Android N 替换context的mResources后引起WebView崩溃的问题”,我们提到直接替换Activity的Resources后如果打开一个WebView,并长按网页弹出复制粘贴按钮时,会发生崩溃现象。究其原因是因为WebView中的资源并未被正确加载,导致获取字符串时获取出错在该文中,我采用了一种比较简单的方式来解决,即在替换之前,预先获取WebView的安...

2019-08-28 20:53:53 1298

原创 Android 9.0(API 28) Resources管理源码分析

从Android7.0开始Google对Resources这一块做了一个较大的调整今天我们挑取Android9.0的源码看下先看Resources.java相比于Android6.0Resources中不在维护AssertManager 而是将AssertManager与其他的一些缓存 封装成了一个ResourcesImpl看下源码public class Resource...

2019-08-28 19:52:46 999

原创 Android 6.0 (API23) Resources管理源码分析

这篇文章写的时候,Android已经迭代到10.0了 那为什么还要去看6.0的源码呢因为从6.0以后Google对Resource这一块的代码进行了一次比较大的重构迭代因此如果要想了解这一块的知识,或者说利用这些知识开发一些功能,那么6.0的源码还是要了解一下的众所周知 在Anrdoid中获取Resource一般使用的context.getResource()方法而无论是Appli...

2019-08-11 13:33:54 215

原创 Android 子线程更新TextView的text 不抛出异常原因 分析总结

今天有同事问我,在Android中子线程是不是不可以直接操作View组件我毫不犹豫的回答“是”接着他让我看一段代码 大致如下@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setConten...

2019-07-10 15:40:17 1672 1

原创 Android UI 布局分析工具 入口篇

一:HierarchyView老牌分析工具,在早期的SDK中是有快捷方式的,新版的找不到快捷方式了,后来找了很久才找到入口首先找到Android Device Monitor可以进入到sdk的安装目录下 从tools目录下点击monitor.bat 启动 Android Device Monitor然后找到下图红框位置 点击HierarchyView 按钮就可以打开 如果...

2019-06-19 21:08:04 3904 1

原创 Application的attachBaseContext方法中调用getApplicationContext返回null的原因分析

首先看源码Application extends ContextWapper所以当我们在调用Application的 getApplicationContext时 实际上调用的是ContextWapper的getApplicationContext 方法如下from ContextWapper.java @Override public Context ge...

2019-06-18 17:11:17 12433

原创 Gradle构建时的文件路径问题

问题场景:在gradle编译时,我们常常将一个配置文件放置在项目的根目录下但是某个子moudle的build.gradle需要访问根目录下的配置文件比如下面下图这个代码结构我们希望在app这个moudle的build.gradle中访问根目录下的conf/conf.file尝试编写如下代码​task testPath { File configFile =...

2019-05-10 18:11:43 5619

原创 Application,Activity启动时长 和 Activity启动到开始绘制的时长计算

Application 启动时长计算时长计算 StartTime定位查看源码,Application实例化时调用的是newApplication()方法(具体原理参考另外一篇博客,Application启动流程分析https://blog.csdn.net/binghelonglong123/article/details/88414051)form Instrumentation...

2019-05-10 14:32:12 444

原创 Android N 替换context的mResources后引起WebView崩溃的问题

最近在搞Android的换肤功能开发初始就希望换肤框架对业务代码有较低的侵入性因此决定使用对Context的mResources替换的方式,该方式的优点就是原先的代码逻辑无需太多的修改但是在开发过程中发现Android N 以上的版本在对Context的mResources进行替换后会出现使用WebView的页面在某些场景下会崩溃,比如长按WebView 弹出复制菜单的时候堆栈日志...

2019-04-30 14:56:11 2240

原创 Android TextView 文字中插入超链接且自定义点击事件

需求:1:显示一段中间带有超链接的字符串,超链接部分可以点击,且需要自定义点击事件2:该字符串需要使用40多种国家语言进行翻译分析:很多朋友第一时间想到使用Spannable来实现富文本显示但是单纯构建Spannable的方式无法解决40个国家不同语言的问题我们也不太可能为每个国家构建不同的Spannable,这样工作量太大,就算能写出来,后面也不好维护思路:优先还...

2019-04-10 15:11:10 373

原创 VirtualApk源码阅读-AndroidStub

在VirtualApk中 对系统隐藏API的调用采用了反射+Stub两种方式反射这个大家都比较好理解了比如说在对资源进行Hook时 我们可以自己生成一个Resources 并使用反射的方式替换Context的mResources重点学习下Stub在android中为了保护一些系统API 或者基于其他考虑,一些核心类是被标注为hide 的,这样我们就无法访问这些类,比如A...

2019-03-25 12:47:55 811

原创 getExternalCacheDir 导致的ANR问题分析总结

在用户上报的ANR问题当中,有一类是调用系统api时导致的ANR今天分析一下调用context.getExternalCacheDir()方法导致的ANR一般发生这种ANR 时打印的堆栈是这样 kernel: __switch_to+0x94/0xa0 kernel: binder_thread_read+0x3ac/0x10bc kernel: binder_ioctl...

2019-03-20 10:36:01 3411

原创 Android Appication及Activity的 Resource 生成代码分析

在“外销项目的小语种bug热修复方案”一文中,我们使用了替换mResource的方法来实现资源及字符串的热修复之前在写这篇文章的时候 也一直在想一些问题比如:1:为什么Application的getResource以及各个Activity的getResource获取的mResource对象不是同一个对象2:为什么Activity的getResources().get...

2019-03-18 13:43:02 1240

原创 implementation、api、compileOnly区别

gradle 从2.X升级到3.X 对依赖的处理做了细分且启用了新的命名规则,详细说明见下表3.x 2.X 区别 implementation compile 使用implementation依赖方式所依赖的库不会传递给更上一级 api compile 常用的依赖方式,没啥可说的 compileOnly prov...

2019-03-12 12:10:22 983

原创 Android Application启动流程

从系统启动开始看1:BootLoader启动内核和init进程2:init进程分裂多个与硬件相关接口的守护进程3:init进程启动Zygote进程,Zygote孵化出第一个VM,并预加载Framework和通用资源,Zygote创建了一个Socket接口,用于外部调用孵化新的VM4:启动Zygote之后,init继续启动Runtime进程5:Zygote孵化出System Se...

2019-03-12 10:19:50 480

原创 使用AIDL实现Service与Client绑定后的双向调用

今天在分析Application的启动流程ActivityThread 中的ApplicationThread 是一个stub类ActivityManagerService作为IActivityManager的stub使用 attachApplication 方法将该ApplicationThread 的 stub对象 传入,这看上去像是一个binder的双向绑定见如下代码...

2019-03-11 22:25:35 795

转载 SoftReference 为什么被 Android “放弃”

JDK 中除了默认的 Strong Reference 之外,还有三个其他的 Reference:WeakReferenceSoftReferencePhantomReference他们都是为了更高效地利用 Heap。WeakReference如果一个变量的 Reference 只剩下 WeakReference,那么 GC 会毫不留情地把这个变量回收掉。也就是说,We...

2019-03-06 09:53:59 203

原创 外销项目的小语种bug热修复方案

最近的做的外销项目 涉及几十种语言 这些小语种在我看来跟乱码一样翻译一般是由外包翻译公司翻译的这里面就容易存在一些问题问题1:翻译的流程是 客户端开发写中文---翻译成英文----外包翻译根据英文字符串翻译小语种,在这个流程中,有些多义词和一些涉及语境的词就很容易翻译错误。问题2:前面说了,翻译公司提供回来的字符串我们都看不懂,错了也不知道,几乎都是上线之后,...

2019-03-01 11:10:00 169

原创 从AIDL调用看Binder使用方法

前言:最近在看VirtualApk的源码,发现里面很多涉及到代理模式Binder调用本身就是使用一个超级复杂的代理模式而我们接触到最多的Binder调用就是AIDL因此这里分析一下AIDL的调用原理Tips:此文章不讲述Binder底层的原理,只是通过AIDL调用的分析,来借花献佛AIDLAndroid Interface Definition Language...

2019-02-16 09:02:17 412

原创 Android 最佳屏幕适配方式探索

android资源文件夹使用限定符进行命名一:创建限定符文件夹使用android studio自带的工具进行创建参考下图其中Available qualifiers 即为支持的所有限定符,用户可以选中多个限定符,生成类似values-zh-ldltr-sw360dp-xxhdpi-360x640 这种文件夹二:限定符优先级按照如下顺序排列(其实就是上图中创建限定符...

2019-02-16 08:58:51 1223

深入理解Android之Gradle

深入理解Android之Gradle 跟android相关的gradle资料本来就不多 这本算不错的

2019-03-15

从AIDL调用看Binder使用方法

最近在看VirtualApk的源码,发现里面很多涉及到代理模式 Binder调用本身就是使用一个超级复杂的代理模式 而我们接触到最多的Binder调用就是AIDL 因此这里分析一下AIDL的调用原理

2019-03-12

使用AIDL实现Service与Client绑定后的双向调用

使用AIDL实现Service与Client绑定后的双向调用,Client在绑定Service时传入自己的Binder ,Service使用这个Binder实现调用Client的方法

2019-03-11

模拟XML数据的读入

对于android中的网络开发 经常会出现服务器故障或者服务器暂时未部署完成的情况,那么对于android开发者来说只能使用模拟的数据来进行代码编写。但是更多的情况下服务器使用的xml或者json数据无法直接保存在代码的字符串里,这边提供一种解决方案

2012-05-08

空空如也

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

TA关注的人

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