- 博客(76)
- 资源 (32)
- 收藏
- 关注
转载 【无标题】
我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 。而最近这几个月,我也发现国内越来越多的人开始提及 RxJava 。有人说『RxJava 真是太好用了』,有人说『RxJava 真是太难用了』,另外更多的人表示:我真的百度了也谷歌了,但我还是想问: RxJava 到底是什么?鉴于 RxJava 目前这种既火爆又神秘的现状,而我又在一年的使用过程中对 RxJava 有了一些理
2022-07-14 15:06:32
250
原创 Android稳定性优化
要保证稳定性,需要保证减少crash和anr,对于减少crash,需要进行代码审核,但是人工审核难免也会漏掉,可以使用FindBugs(当前已经被SpotBugs替代),CheckStyle,PMD,Android Lint,可以使用这几种工具对代码进行检测FindBugs,PMD 主要是侧重于检测代码缺陷CheckStyle 主要规范代码风格Andriod Lint 是全方位的检查,...
2019-12-12 22:56:24
660
原创 Andriod APK体积优化
随着项目的不断迭代,功能越来越多,构建出来的apk文件的大小也会越来越大,这样会导致在移动网络情况下下载时,使用的网络流量会增大,并且apk太大,导致下载的时间也增加,虽然当前每个人的手机的流量都很多,对用户流量影响不大,但是据一些网站统计,安装包越大,用户的转化率是在降低的,所以减少apk的体积,可以让更多的用户愿意去下载和体验产品。所以,对apk体积进行瘦身还是很有必要的。在对apk体积进行瘦...
2019-12-09 14:23:56
777
原创 Android存储优化
关于存储的操作,一切的核心优化都在以下三个方面:1.避免在主线程I/O2.减少I/O读写量3.减少I/O的操作次数从这三个方面,下面介绍如何针对不同的存储方式进行相应的优化:针对SharedPreferences,需要做到如下的优化:SP文件没有被加载到内存时,调用getSharedPreferences方法会初始化文件并读入内存,建议在Application中初始化,重写at...
2019-12-05 08:57:07
371
原创 Glide 4.x和3.x区别和使用介绍
基础使用添加4.x版本的依赖implementation 'com.github.bumptech.glide:glide:4.4.0'annotationProcessor 'com.github.bumptech.glide:compiler:4.4.0'相比于Glide 3,这里要多添加一个compiler的库,这个库是用于生成Generated API的。使用:Request...
2019-11-29 10:38:47
1496
原创 Glide添加图片下载进度监听
对于项目开发中,如果遇到加载大图,重网络上下载并在本地显示这个大图,会稍微耗时一点,这时,就会想给出一个下载进度的显示,这样用户体验会更好,但是Glide是没有提供下载进度监听的api的,为了解决这个问题,这篇文章的介绍将基于上篇文章 中,对Glide的自定义模块时,使用Okhttp替换了默认的HttpUrlConnection作为网络情况的组件。基于这个OkHttp,可以通过添加拦截器的方式来...
2019-11-28 23:42:28
1693
原创 Glide自定义模块
通过自定义模块,可以灵活配置内存缓存的大小,磁盘缓存的大小,磁盘缓存的地址,以及异步请求的的线程的数量,BitmapPoll缓存的大小,网络请求的组件等。由于Glide本身就已经默认对这些进行了配置,并且这些配置也是非常合理的,但是,没个项目都可能有自己的特殊需求,如果能够自己定制模块,更改这些默认配置,则就能够满足项目的特殊需求,下面来看看如何自定义模块。其实自定义模块很简单,只需要定义一个类实...
2019-11-28 15:29:11
1223
原创 Glide的图片转换
前面几篇文章介绍了Glide的基本使用,源码分析,和高级使用,这篇文章继续介绍|Glide的高级使用方法,自定义图片转换,其实Glide是默认的实现了几种图片转换的。比如DrawableRequestBuilder类的fitCenter()和centerCrop()方法其实就是对图片进行了转换。在介绍如何自定义图片转换前,先来看看Glide自身提供的图片转换的使用。1.首先准备一个布局文件,在布...
2019-11-27 16:43:06
751
原创 Glide的高级用法
自定义的target上篇文章在分析Glide.with(this).load(url).into(iv);这行代码的源码过程中,在分析到into方法时,这个into(ImageView view)方法其实GenericRequestBuilder的into方法。这个into(ImageView view)方法又调用了GenericRequestBuilder类的into(Y target)方法,...
2019-11-26 21:29:43
2235
原创 Glide源码分析
Glide的常用方式:Glide.with(this).load(url).into(iv);通过这一几个链式调用的方法就完成了从网络上加载一个图片在本地显示的功能,下面分析一下,内部的具体实现逻辑:首先看看Glide.with()方法:public class Glide { ... public static RequestManager with(Activity ac...
2019-11-25 18:51:56
332
原创 Glide基本使用
glide使用:第一步:添加依赖:dependencies { compile 'com.github.bumptech.glide:glide:3.7.0'}第二步:添加权限<uses-permission android:name="android.permission.INTERNET" />第三步:Glide的常用方式:String url = ...
2019-11-21 17:40:26
812
原创 Android 常用图片框架对比
在Android中,进行内存优化,最重要的优化处理是对图片进行内存的优化处理,毕竟图片占用的内存是非常大的,对于图片的内存处理,是android中内存优化的重中之重。目前开源的4大图片处理框架都对图片的内存方面处理都是非常优秀的,但是对于这么多的框架,如何选择适合自己项目需求的框架,就需要先了解每个框架的特性,下面就来分析一下每个框架的特点。Universal-Image-Loader(UIL)...
2019-11-20 17:51:38
1789
原创 LruCache原理
对于Android的内存优化 ,特别是图片的优化,当使用内存缓存时,一般很容易想到是用LruCache,下面分析下LruCache的使用原理。在分析原理之前,请务必注意分析的LurCache源码的是哪个包下的,不同Android api下的LruCache的源码有些不同,主要是不同版本的LruCache类中的trimToSize方法写的不同,导致笔者在分析时,感觉其中的逻辑矛盾,走了不少弯路。...
2019-11-15 15:35:00
468
原创 LeakCanary原理解析
上篇文章Leakcanary的使用演示了LeakCanary的使用,这篇文章分析下,LeakCanary(基于1.6.1版本)的原理。在使用LeakCanary时,需要在自定义的Application中,调用LeakCanary.install(this);下面看看LeakCanary类的install方法的具体实现:#LeakCanary.javapublic final class Lea...
2019-11-14 18:08:29
287
原创 Android优化之内存优化一:检查内存泄漏工具使用
内存优化,不仅可以减少OOM,还可以减少GC的频率,GC频率减少后,这样就会使应用使用更加流畅。减少内存占用,可以提高应用在后台运行时的存活率。当然还可以减少异常的发生和减少代码的逻辑隐患。所以进行内存优化是非常有必要的。在进行内存优化之前,需要先了解对象在内存中的生命周期以及垃圾回收的原理,可以参考Java虚拟机部分知识点,因为内存优化过程中,涉及到了内存泄漏的排查,这个排查过程,就需要了解对...
2019-11-13 19:08:40
230
原创 Android Studio 3.4中Memory Profiler工具使用
Memory Profiler 是 Android Profiler 中的一个组件,可帮助您识别可能会导致应用卡顿、冻结甚至崩溃的内存泄漏和内存抖动。它显示一个应用内存使用量的实时图表,让您可以捕获堆转储、强制执行垃圾回收以及跟踪内存分配。要打开 Memory Profiler,请按以下步骤操作:依次点击 View > Tool Windows > Profiler(您也可以点击...
2019-11-07 16:12:17
2828
原创 常见内存泄漏案例及解决方案
内存泄漏产生的原因: 一个长生命周期的对象持有一个短生命周期对象的引用,通俗点讲就是该回收的对象,因为引用问题没有被回收,最终会产生 OOM。内存泄漏的常见场景1.非静态内部类的静态实例持有外部类的实例的引用。代码举例:public class InnerClassLeakActivity extends AppCompatActivity { private static Le...
2019-11-07 13:34:35
953
原创 Leakcanary的使用
LeakCanary是Android查找内存泄漏的主要工具,由Square公司开发,可以直接在手机端查看内存泄露的工具。其使用方法如下:第一步: debugCompile 'com.squareup.leakcanary:leakcanary-android:1.6.1' releaseCompile 'com.squareup.leakcanary:leakcanary-and...
2019-11-06 16:53:26
917
原创 Android 绘制优化
绘制原理View 的绘制流程有3个步骤,分别是measure 、layout 和draw ,它们主要运行在系统的应用框架层,而真正将数据渲染到屏幕上的则是系统Native层的SurfaceFlinger服务来完成的。绘制过程主要由CPU来进行Measure 、Layout 、Record 、Execute的数据计算工作, GPU负责栅格化、渲染。CPU 和GPU 是通过图形驱动层来进行连接的,...
2019-11-06 00:19:54
292
原创 Apk安装之——PMS解析apk过程分析
在android的apk安装过程中,PMS会调用installPackageLI方法对apk进行解析,下面看看这个方法的具体实现:http://androidxref.com/9.0.0_r3/xref/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.javaprivate voi...
2019-11-04 14:32:36
656
原创 Apk安装之——PMS安装apk过程分析
上篇文章Apk安装之——点击安装确认页面的确认按钮,到将安装过程交给PMS的过程分析分析到apk安装的流程,交给了PMS,这篇文章继续分析,PMS是如何安装apk包的。首先调用PMS的installStage进行安装。下面看看这个方法:http://androidxref.com/9.0.0_r3/xref/frameworks/base/services/core/java/com/andr...
2019-11-01 14:51:27
1005
原创 Apk安装之——点击安装确认页面的确认按钮,到将安装过程交给PMS的过程分析
上篇文章Apk安装之——安装确认页面的初始化,讲解了apk包安装的一个小的阶段,展示安装确认页面的过程。这篇文章,继续分析,点击这个页面的确定按钮,开始安装apk的过程。下面是触发点击事件的具体代码:http://androidxref.com/9.0.0_r3/xref/packages/apps/PackageInstaller/src/com/android/packageinstalle...
2019-10-31 11:25:15
1736
原创 Apk安装之——安装确认页面的初始化
APK的安装场景主要有以下几种:通过adb命令安装:adb 命令包括adb push/install,没有安装界面用户下载的Apk,通过系统安装器packageinstaller安装该Apk。packageinstaller是系统内置的应用程序,用于安装和卸载应用程序,有安装界面。系统开机时安装系统应用,没有安装界面。电脑或者手机上的应用商店自动安装,没有安装界面。apk的四种安装方...
2019-10-30 22:54:10
6822
原创 Android so文件的加载原理
先说说so的编译类型Android只支持3种cpu架构分为:arm,mips,x86,目前用的最多的是arm体系cpu,x86和mips体系的很少用到了。arm体系中,又分32位和64位:armeabi/armeabi-v7a:这个架构是arm类型的,主要用于Android 4.0之后的,cpu是32位的,其中armeabi是相当老旧的一个版本, 缺少对浮点数的硬件支持,基本已经淘汰,可...
2019-10-29 17:46:45
2458
原创 Android apk打包流程,混淆,差分包的生成和合并新的apk
Android apk打包流程:通过aapt工具,将manifest文件编译后,生成manifest.java文件,为res目录下的资源生成R.java文件并使用aidl工具,将aidl文件生成相应的java文件通过javac工具,将项目中的业务逻辑的java文件,和前面生成的java文件编译成class文件proguard混淆,同时生成proguardMapping.txt文件,这一步...
2019-10-29 10:12:59
3214
原创 Android 插件化之—— 加载插件中的资源
Android 资源分类:res目录下的资源res目录下的资源可以通过Resource对象进行访问,通过分析Resource源码可知,Resource访问res目录下的资源其实还是调用的AssetManager类的方法访问的。assets目录下的资源assets目录的访问,通常在Activity中,是获取到AssetManager对象后,使用AssetManager来访问asset中的资...
2019-10-28 14:50:42
1813
原创 Android 插件化之——给插件中的ContentProvider发送请求
ContentProvider的插件化,可以借鉴静态广播的思路,在宿主中创建一个代理ContentProvider,第三方的app向插件中的ContentProvider发送增删改查数据的请求,都先找宿主的代理的ContentProvider,代理的ContentProvider在将实际的增删改查的请求转发给插件中的ContentProvider。这就是ContentProvider插件化的基本思...
2019-10-27 11:12:57
490
原创 Android 插件化之——给插件中的静态注册的BroadcastReceiver发送广播
为了演示静态广播的插件化,我们首先想到的也是使用类似Activity的占坑方案,但是,由于广播的action是不确定的,就无法确定占坑的广播的action,这样就无法使用在宿主中预先使用占坑广播的方案,还有一点,就是,静态广播是在apk安装时就被PMS解析,并将manifest文件中的关于四大组件的配置信息都保存起来,当然也包括了广播的信息。由于插件apk是没有被安装的,所以,插件apk中的静态...
2019-10-24 17:20:28
529
原创 android 手动分包,将指定class打包到主dex中
插件化开发时,想要使app启动很快,需要将主dex中只是包含首页以及基础模块的功能,其他的功能放到从dex文件中,这样就可以加快app的启动速度。那如何将核心首页以及基础模块的class文件打包到主dex文件中呢?下面来实现这个过程。1.首先要是项目支持multidex,要是项目支持multidex,需要完成下面两个步骤a.需要在module级别的build.gradle文件中配置andro...
2019-10-24 11:44:24
6364
4
原创 Android 插件化之——给插件BroadcastReceiver发送广播
广播从注册方式上可以分为静态广播和动态广播。他们的区别如下:静态注册的广播,需要在manifest文件中声明,这样,在应用的apk包安装时或者Android系统重启时,PMS(PackageManagerService)就会解析apk的manifest文件,并将这些信息保存起来,所以,静态注册的广播是保存在PMS中的。动态注册的广播是通过代码在程序中注册的,通过调用Context类的re...
2019-10-22 20:00:54
364
转载 android:exported、enabled属性
android:exported:android:exported 是Android中的四大组件 Activity,Service,Provider,Receiver 四大组件中都会有的一个属性。代表是否能被其他应用隐式调用。如:在Activity中,该属性用来标示,当前Activity是否可以被另一个Application的组件启动:true允许被启动;false不允许被启动。在Ser...
2019-10-22 16:14:07
2122
原创 Android插件化之—— 绑定和解绑插件Service
上篇文章Android 插件化之——启动和停止插件Service讲解了启动插件service的演示,这篇文章,继续绑定插件service和解绑插件service的演示。和上篇启动插件service的原理类似,也是使用代理转发,通过Hook AMS,在AMS的bindService方法中,将要启动的插件service变换成代理service,这样绑定的其实就是代理service,然后将插件servi...
2019-10-22 14:49:11
661
3
原创 Android 插件化之——启动和停止插件Service
由于启动service后,再次启动这个service时,是不会再次创建这个service的实例的,所以,如果有多个插件service要启动,如果只是按照启动插件activity的思想,只使用一个占坑的service,是不能满足需求的,因为,按照启动插件activity思想,每次启动一个插件activity,如果启动的activity是标准启动模式,则每次都会创建一个新的activity,而serv...
2019-10-21 15:42:52
857
原创 Android 启动插件Activity的原理以及案例演示
当应用的apk文件安装到手机系统时,这个文件会被解压后存储到data/dalvik-cache 这个目录下,当app应用程序启动时,如果app所在的进程未创建,则会通过Zygote进程去fork一个子进程作为要启动的app的进程,并创建PathClassLoader。app进程启动后,会通过通过ClassLoader来完成dex文件的加载。PathClassLoader是继承BaseDexClas...
2019-10-16 23:05:23
509
原创 代理模式
概述代理模式是结构化设计模式中的一种,平时我们生活中都有类似的代理模式,比如代购,网上购物,打官司。定义:为对象提供一种代理以控制对象的访问,这种方式就称为代理模式。代理模式的结构图中,Subject:抽象主题类,声明真实主题的共同接口方法。RealSubject:真实主题类,定义了代理所表示的对象。客户端通过代理类间接的调用真实主题对象的方法。Proxy:代理类,持有真实主题的类的...
2019-10-12 11:57:11
395
转载 java泛型中 ? 和 T 有什么区别
java泛型中 <?> 和 有什么区别T 代表一种类型加在类上:class SuperClass{}加在方法上:public void fromArrayToCollection(T[] a, Collection c){}方法上的代表括号里面要用到泛型参数,若类中传了泛型,此处可以不传,调用类型上面的泛型参数,前提是方法中使用的泛型与类中传来的泛型一致。class Pe...
2019-10-11 14:11:44
137
原创 Java虚拟机部分知识点
概述我们常说的JDK(Java Development Kit)java开发工具包,它是包含JRE(Java Runtime Environment)和开发工具和Java语言,而JRE又包含Jvm和核心类库。下面是三者之间的关系:JDK java development kit java开发工具包JRE java runtime environment java运行环境JRE = ...
2019-10-10 15:57:01
399
转载 Lambda表达式详细总结
转载:https://blog.youkuaiyun.com/wangboxian/article/details/41963205(一)输入参数在Lambda表达式中,输入参数是Lambda运算符的左边部分。它包含参数的数量可以为0、1或者多个。只有当输入参数为1时,Lambda表达式左边的一对小括弧才可以省略。输入参数的数量大于或者等于2时,Lambda表达式左边的一对小括弧中的多个参数质检使用逗号(...
2019-10-09 10:02:30
4273
3
原创 Android 9.0 ContentProvider的启动过程分析
ContentProvider主要用于对外共享数据,也就是通过ContentProvider将应用中的数据共享给其他应用访问。这样其他应用就可以通过ContentProvider来访问指定应用中的数据。ContentProvider分为自定义的和系统的。系统提供的ContentProvider有联系人,图片等。其他应用可以通过ContentResolver来访问联系人和图片中的数据。下面看看如何...
2019-10-08 18:33:53
807
原创 android 9.0 广播的注册,发送,接收过程分析
广播的注册分为静态注册和动态注册,静态注册是通过PackageManagerService(PMS)来完成整个的注册过程的,当然,除了广播外,其它三个组件也是在应用安装时通过PMS来完成解析和注册的。下面已动态注册为例分析广播的注册过程。在Activity中动态注册广播的代码如下:IntentFilter intentFilter = new IntentFilter("com.android....
2019-09-30 15:41:56
3051
1
android 多渠道 sourceset main文件夹下和其他渠道下的java文件重复 exclude方式解决
2022-01-29
app 研 发 录
2018-09-25
openfire_3_8_1
2015-10-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人