Android
如火也如荼
stay hungery, stay foolish. self control and smart is a new sexy,
展开
-
“一表四图”读懂Android插件化
一、Android插件化发展历程序号插件方案名发布时间厂商特点开源地址1dynamicApkLoader2012年7月大众点评(屠毅敏)利用Fragment代理实现页面跳转,首次使用了通过反射AssetManager来调用addAsset()方法实现处理插件中的资源https://github.com/mmin18/AndroidDynamicLoader2dynamic-load-apk百度(任玉刚)利用壳Activity来代理实现插件中的Plugin原创 2020-08-08 15:28:04 · 228 阅读 · 0 评论 -
子线程真的不能弹Toast吗?
一、背景:做Android开发的工程师都知道一条金科玉律(在主线程操作UI的更新与变化)。我们经常在做工程业务的时候,会使用封装的ToastUtils来统一做toast。如下所示:public class ToastUtils{ private static Toast sToast; private static Handler sMainHandler; private ToastUtils(){ throw new UnsupportedOperation原创 2020-05-14 21:00:23 · 612 阅读 · 1 评论 -
SharedPreferences的commit()和apply()区别与剖析
背景:对于Android开发者而言,经常需要在开发中使用SharedPreferences做一些数据的持久化。一般场景是一些标记或者配置数据。而在针对一些场景到底该使用commit()和apply()中的哪一个来持久化数据的时候,只知道commit是以同步的方式在写数据,可能会造成主线成的卡顿,apply()是异步的写数据,不会造成卡顿。那么实际情况是这样吗?接下来,我们分析一下源码。【以下SharedPreferences简称SP】跟踪源代码:一般我们使用SharedPreferences原创 2020-05-13 15:44:42 · 553 阅读 · 0 评论 -
Dynamic-load-apk插件原理解析
一、背景:插件化的第一代目,任玉刚大神的dynamic-load-apk。目前插件化的方案主要有以Dynamic-load-apk为代表的的静态代理方案,以及以张勇的DroidPlugin为代表的动态代理hook系统AMS和PM的方案第一种方案,使用静态代理插件的方案,来代理插件apk中Activity的生命周期管理。第二种方案,使用动态代理hook系统AMS的方式,来拦截AM...原创 2020-04-26 16:47:29 · 782 阅读 · 0 评论 -
Android编程巧用注解
keep在编写混淆规则的时候,直接带keep注解的可以在混淆规则脚本中,可以直接如此来keep//比如keep主该cass@keepclass Bean{ ...}#保留注解,如果不添加此行会导致我们的@Keep注解失效-keepattributes *Annotation*-keep @android.support.annotation.Keep class **...原创 2020-04-22 11:19:57 · 262 阅读 · 0 评论 -
Java多线程读写文件
一、背景知识多线程可以提高任务的执行效率,尤其是CPU计算密集型任务读写文件是IO密集型任务过多的线程执行同一个任务,并不一定能提高效率,因为线程切换,需要耗时。再比如IO密集型任务,IO是瓶颈,并不是线程越多,IO会越快。开多线程去执行任务,需要综合考虑实际情况。二、问题最近项目中遇到,安装APK(其中有拷贝apk文件到具体路劲的逻辑),考虑到优化,缩短这里的apk文件拷贝时间。...原创 2020-04-17 20:56:56 · 3266 阅读 · 0 评论 -
Android单元测试
Android单元测试单元测试单元测试理解Java的单元测试Android客户端的单元测试单元测试说到测试,主要分为,冒烟测试,集成测试,单元测试。单元测试是保证基础模块、单元工作正常的一种保证手段。在互联网短平快的敏捷开发的开发模式中,常常因为业务繁多,而忽视了单元测试,造成积重难返的局面。编程好比造房子,砖块好比每一个单元,只有保证每一块砖的坚实耐用,才能保证整个房子的坚固可靠。而在业务繁...原创 2019-12-29 18:23:47 · 285 阅读 · 1 评论 -
Glide源码分析
Glide操作EngineJob中两个线程池:都是FifoPriorityThreadPoolExecutor 负责缓存decode的DiskCacheService负责网络请求的 SourceServicewith() 返回一个 RequestManager (实现了LifeCyleListener,且创建了一个FifoPriorityThreadPoolExecutor) 创...原创 2019-09-19 11:44:02 · 101 阅读 · 0 评论 -
NDK开发sourceSet配置
首先明确两点:Android Studio默认识别的jni目录在app下(此时生成的so在libs目录,所以需要在build.gradle中指明jniLibs.srcDir=['libs']),默认识别的so文件在src/main/jniLibs(这种情况,需要在main下面建立jni目录,但是AS识别不到,所以需要在build.gradle中指定jni目录) externalNativeB...原创 2019-09-18 22:02:47 · 1767 阅读 · 0 评论 -
Gradle笔记(android)
看依赖树gradlew :app:dependencies依赖传递:默认依赖传递是true,transitive= true。比如A依赖了B,B依赖了C,C依赖了D。则A会依赖BCD配置全局的依赖不传递configurations.all { transitive = false}配置单个依赖的依赖不传递androidTestCompile('com.android...原创 2019-09-18 21:40:03 · 148 阅读 · 0 评论