自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

yang_song_song的博客

忍耐和坚持是痛苦的,但它会逐给你好处

  • 博客(29)
  • 收藏
  • 关注

原创 多Dex加载方案对比

随着业务扩张,代码量越来越大,apk中单个dex方法数超过65K,就需要dex分包,Google官方推出了MultiDex来解决65K的问题,区分不同的Android虚拟机,会有一些问题。Dalvik上,使用JIT(just in time),应用运行时,需要先将dex转换成os上可以运行的机器码,在此过程中,还会对dex文件进行优化(dexopt),因此在应用第一次启动时,会经历这些过程,a...

2018-07-02 13:34:16 1423

原创 ROBUST 完整修复流程

一.内部版本接入 内部最新版本为0.7.48,接入方式与外部版本相同,不再赘述。详情看:ROBUST接入着重讲解外部版本与内部版本的区别:外部版本需要设定补丁加载路径以及加载时机,内部则配合Env自行保存及加载。内部使用需要在Application中手动初始化Robust,如图: 根据观察的补丁加载时机以及抓包的结果来看。推测:内部补丁加载时机为Application初...

2018-07-02 13:27:21 1823

原创 Robust 接入

前言 Robust热更新系统借鉴Instant Run原理,实现了一个兼容性更强而且实时生效的热更新方案。其基本思路是,Robust热更新系统在一个方法的入口处插入一段跳转代码,当发现某个方法出现bug就跳转执行补丁中的代码,略过原有代码的执行,否则执行原有方法体逻辑。 Github:https://github.com/Meituan-Dianping/Robust/blob/master/...

2018-07-02 13:20:19 1199

原创 由Android 65K方法数限制引发的思考

没想到,65536真的很小。 Unable to execute dex: method ID not in [0, 0xffff]: 65536 PS:本文只是纯探索一下这个65K的来源,仅此而已。 到底是65k还是64k? 都没错,同一个问题,不同的说法而已。 65536按1000算的话,是65k ~ 65 1000; 65536按1024算的话,是64k = 64 1024。 重

2017-11-09 10:43:18 295

原创 android强大的SpannableStringBuilder

SpannableStringBuilder和SpannableString的区别类似与StringBuilder、String,就是SpannableStringBuilder可以拼接,而SpannableString不可拼接。主要的方法SpannableStringBuilder和SpannableString主要通过使用setSpan(Object what, int start, int e

2017-09-19 19:32:59 569 1

原创 你所不知道的RXJava2.0

我们讲Flowable的时候,说它采用了响应式拉的方式,我们还举了个叶问打小日本的例子,再来回顾一下吧,我们说把上游看成小日本, 把下游当作叶问, 当调用Subscription.request(1)时, 叶问就说我要打一个! 然后小日本就拿出一个鬼子给叶问, 让他打, 等叶问打死这个鬼子之后, 再次调用request(10), 叶问就又说我要打十个! 然后小日本又派出十个鬼子给叶问, 然后就在边上

2017-09-12 15:57:53 329

原创 你所不知道的RXJava2.0

我们有个例子, 当上游一次性发送128个事件的时候是没有任何问题的, 一旦超过128就会抛出MissingBackpressureException异常, 提示你上游发太多事件了, 下游处理不过来, 那么怎么去解决呢?我们先来思考一下, 发送128个事件没有问题是因为FLowable内部有一个大小为128的水缸, 超过128就会装满溢出来, 那既然你水缸这么小, 那我给你换一个大水缸如何, 听上去很

2017-09-12 15:53:25 277

原创 你所不知道的RXJava2.0

我们先来学习如何使用Flowable, 它东西比较多, 也比较繁琐, 解释起来也比较麻烦, 但我还是尽量用通俗易懂的话来说清楚, 毕竟, 这是一个通俗易懂的教程.**正题**我们还是以两根水管举例子: prepare.png 之前我们所的上游和下游分别是Observable和Observer, 这次不一样的是上游变成了Flowable, 下游变成了Subscriber, 但是水管之间的连接还是通

2017-09-12 15:48:29 686

原创 Android7.0解决 android.os.FileUriExposedException: file:///storage/emulated/0/

解决Android N文件访问crash android.os.FileUriExposedException file:///storage/emulated/0/xxx原因:Android N对访问文件权限收回,按照Android N的要求,若要在应用间共享文件,您应发送一项 content://URI,并授予 URI 临时访问权限。 而进行此授权的最简单方式是使用 FileProvider

2017-08-14 18:27:34 30236

原创 Java中ThreadPoolExecutor的详细介绍

从 Java 5 开始,Java 提供了自己的线程池。线程池就是一个线程的容器,每次只执行额定数量的线程。 java.util.concurrent.ThreadPoolExecutor 就是这样的线程池。它很灵活,但使用起来也比较复杂,本文就对其做一个介绍。首先是构造函数。以最简单的构造函数为例:public ThreadPoolExecutor( int coreP

2017-08-04 15:29:56 295

原创 Java多线程-工具篇-BlockingQueue

前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。认识BlockingQueue 阻塞队列,顾名思义,首先它是一个队列,而一个队列在数据结构

2017-08-02 15:53:36 339 1

原创 如何在Java中使用双重检查锁实现单例

单例类在Java开发者中非常常用,但是它给初级开发者们造成了很多挑战。他们所面对的其中一个关键挑战是,怎样确保单例类的行为是单例?也就是说,无论任何原因,如何防止单例类有多个实例。在整个应用生命周期中,要保证只有一个单例类的实例被创建,双重检查锁(Double checked locking of Singleton)是一种实现方法。顾名思义,在双重检查锁中,代码会检查两次单例类是否有已存在的实例,

2017-07-27 19:53:13 542

原创 手把手带你从源码的角度全面理解Handler、Looper、MessageQueue之间的关系

目标: 首先要明确几个目标,我们要解决以下几个问题: a.线程是如何与Looper关联起来的? b.一个线程里面可以有几个Looper? c.消息是怎么从一个线程传递到另一个线程的? d.Handler、Looper、MessageQueue三者之间的关系是怎样的?分析源码前,先举个栗子:MessageQueue相当于一个池塘,Message就是池塘里面的水,Looper就是一台抽水机,现

2017-07-27 17:45:37 275

原创 Android webView的cookie机制

原理分析:> WebView是基于webkit内核的UI控件,相当于一个浏览器客户端。它会在本地维护每次会话的cookie( 保存在data/data/package_name/app_WebView/Cookies.db)。 如图: 查看APP cookie 当WebView加载URL的时候,WebView会从本地读取该URL对应的cookie,并携带该cookie与服务器进行通信。We

2017-05-23 14:49:54 1388

原创 Http gzip的压缩原理

进入主题之前,我们先来看一下客户端与服务器通信过程中,如果服务器支持,HTTP gzip压缩是如何实现的?如图所示: request header中声明Accept-Encoding: gzip,告知服务器客户端接受gzip的数据。 服务器支持的情况下,返回gzip后的response body,同时加入以下header:Content-Encoding: gzip:表明body是gzip过的数

2017-05-23 14:29:33 3281

原创 App性能之优化

今天聊下个人比较惯用的一些App性能测试和分析工具, 先上个图: ![性能分析工具] tools_mind_node 本文暂不对工具的使用做过多的深入. 在后续的具体实例中会具体说明怎么用这些工具来达成分析目的和解决问题的. 1, 官方工具一般来说, 学习一门新的技术, 最应该做的就是阅读其官方文档, 那是最权威的. Android本身给我们提供了很多App性能测试和分析工具, 而且大部

2017-04-20 11:08:46 576

原创 从Java垃圾回收机制窥探内存优化

回答一个疑问这篇文章讲的是Java的JVM的垃圾回收机制,但是Android使用的虚拟机是Dalvik或者ART,那么下面讲的垃圾回收机制是否适用于Android呢?答案是,Yes,是可以类比的。(增补) 文章末尾有人提出了质疑: JVM 的内存模型和 Android 虚拟机是区别的?答案:是的,Android基于寄存器,jvm基于堆栈,本文其实避免了这样的探讨,那是因为在逻辑上它们其实没有太大区

2017-04-19 19:35:32 311

原创 关于RxJava最友好的文章——背压(Backpressure)

前言背压(Backpressure)可能是所有想要深入运用RxJava的朋友必须理解的一个概念。关于它的介绍,我本意是想写在RxJava2.0更新介绍的文章里的,可是写着写着发现,要完整介绍这个概念需要花费的篇幅太长,恰好目前对于背压的介绍文章比较少,所以决定单独拿出来,自成一篇。而关于RxJava2.0的文章修改之后就会发出来和大家探讨。如果对于RxJava不是很熟悉,那么在这篇文章之前,我希望大

2017-04-13 19:30:45 582

原创 Glide的正确使用

在项目中引入Glide Gradle: compile ‘com.github.bumptech.glide:glide:3.7.0’ Maven: com.github.bumptech.glide glide 3.7.0 Eclipse: 在这里 https://github.com/bumptech/glide/releases下载jar包,放到libs文件

2017-03-29 16:15:00 1486

原创 RxJava操作符

RXJAVA地址: https://github.com/ReactiveX/RxJava0.什么是观察者模式1.RXJAVA是什么2.最简单的DEMO在Rxjava当中最重要的就是操作符,RxJava当中有着庞大的操作符创建操作符:负责创建Observable对象just( ) — 将一个或多个对象转换成发射这个或这些对象的一个Observable from( ) — 将一个Iterable,

2017-03-22 16:12:00 367

原创 GET和POST本质区别

一 原理区别一般在浏览器中输入网址访问资源都是通过GET方式;在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETEURL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对

2017-03-22 15:59:13 275

原创 ThreaLocal详解

首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。 另外,说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过ThreadLocal.set()来实现的,而是通过每个线程中的new 对象 的操作来创建

2017-03-21 19:45:19 405

原创 Java虚拟机工作原理详解

一、类加载器 首先来看一下Java程序的执行过程。 从这个框图很容易大体上了解java程序工作原理。首先,你写好java代码,保存到硬盘当中。然后你在命令行中输入 [java] view plain copy javac YourClassName.java 此时,你的java代码就被编译成字节码(.class).如果你是在Eclips

2017-03-20 12:39:57 270

原创 了解 Retrofit2 的安全性

一 什么Retrofit官方标语;A type-safe HTTP client for Android and Java 语意很明显一款android安全类型的http客户端, 那么怎么样才算安全?支持https?支持本地线程安全? 发现Rertofit其内部都是支持lambda语法(国内称只链式语法),内部支持okhttp, 并且支持响应式RxJAava,当然jdk1.8 和androi

2017-03-13 15:11:16 790

原创 App性能优化浅谈

前段时间给公司的小伙伴们进行了关于app性能优化的技术分享,这里我稍微整理一下也给大家分享一下,关于性能优化这个话题很大,涉及面可以很广,也可以很深入,本人能力有限,不会给大家讲特别难懂,特别底层的东西,都是我们开发能着手去做的点,大家都在讲性能优化,但对于项目经验不够丰富的朋友很难有一个概念,做优化的时候也会比较茫然,这里我就给大家指明方向。从何讲起?笔者在做产品开发的时候,也遇到性能瓶颈,测试工

2016-04-26 17:35:38 227

原创 ViewDragHelper的使用

首先继承:java.lang.Object ↳ android.support.v4.widget.ViewDragHelper 直接父类是Object。 类概述ViewDragHelper is a utility class for writing custom ViewGroups. It offers a number of useful operations and state

2016-04-08 11:30:11 359

原创 APK的下载更新安装

一般的安卓app都有自动更新功能,实现app的更新,以让用户体验新版本的功能。 代码比较简单,当用户进入app中,首先会检验当前app的版本号与服务器的版本号,如果当前版本号小于服务器的版本号,则提示用户更新app。 /** * 获取到当前的本地版本 */ UpdateInformation.localVersion =

2016-03-23 18:18:28 466

转载 Android Studio如何查看资源或者函数在哪些类中被引用

许多人在做完Keymap匹配到Eclispe快捷键后,发现查看资源或者函数在哪些地方被引用的快捷键“Ctrl+Shift+G”不灵 了,你选中某个函数后,使用这个快捷键,发现只会光标跳到该类中引用这个函数的地方。原因是啥呢?首先这里简单分析下,选择Keymap后IDE所做的工作及选择后发生快捷键失效原因,Android Studio设置KeyMap到 Eclipse,是进行了一个快捷键的映射操作

2016-03-16 13:54:10 640

原创 FlabbyListView——显示ListView的Android类库

FlabbyListView是Android类库,用于显示不规则单元格的ListView,单元格会根据ListView的滚动出现波浪效果。 首先来看listView的布局文件 <com.ys.flabbylistviewdemo.FlabbyListView android:id="@+id/flabbyListView" android:layout_widt

2016-03-14 20:52:21 317

空空如也

空空如也

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

TA关注的人

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