自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(157)
  • 收藏
  • 关注

原创 Android App抓包、Mock数据探索

一、背景 客户端在开发过程中,经常遇到以下问题:服务经常挂掉 制造数据的过程繁琐 正在发布,需慢慢等 服务端正忙,事情优先级靠后 服务端修改数据,会影响测试过程 只定义好了接口,客户端进度被Block二、收益 客户端在开发过程中,Mock数据的意义:团队可以并行工作 前后端人员定义好接口文档,就可以开始并行工作,互不影响。有利于整个产品质量以及进度的保证。隔离系统 构造的虚拟请求响应,不会造成服务端接口真实数据的污染...

2022-01-16 22:24:45 2789

原创 Android App—适配arm64-v8a的探索

目前华为、小米、三星、OPPO、VIVO等的应用商店已经支持32位和64位APP,Google Play已经强制要求上传64位的APP,而且Google明确了在Android 12上只支持64位的APP,32位App将被抛弃。随着手机CPU采用arm64-v8a架构达到了90%以上,剩余的基本是32位架构的armeabi-v7a,而armeabi、x86、x86_64基本已经没有在使用的真实设备。虽然我们依旧可以在arm64-v8a架构的设备上运行只适配了32位armea...

2021-08-03 01:40:03 3840

原创 Android编译提速—Win环境篇

一、SSD将JDK、SDK、Code、Android Studio全部迁移到SSD。二、杀毒软件某些防病毒软件会干扰 Android Studio 构建过程,从而导致 build 运行速度明显变慢。当您在 Android Studio 中运行 build 时,Gradle 会编译应用的资源和源代码,然后将编译后的资源打包在一个 APK 中。在此流程中,系统会在计算机上创建多个文件。如果您的防病毒软件启用了实时扫描功能,那么在每次创建一个文件后,防病毒软件都会扫...

2021-07-05 00:30:54 235

原创 EventBus拾遗—索引

EventBus 是 Android 中基于 观察者模式 实现的 发布-订阅事件总线 第三方开源框架。其优势如下: 轻量级框架,执行效率高 使用简单,工程代码保持简洁优雅 简化了组件之间的通信,将事件的发送者和接收者解耦 一、基础回顾1.自定义配置2.订阅方法格式3.事件的继承4.避免OOM二、源码回顾1. 关键的类SubscriberMethod: 对订阅方法的相关信息的封装类(Method,...

2021-01-31 23:39:07 107

原创 Android App 授权机制简析

一、申请方式1.运行时权限从Android M开始,之后的版本有了些许调整,但对危险权限的处理方式是一致的。无论是亲自编码实现,还是引用第三方框架,技术都已经很成熟了,在此不做过多的论述。2.android.uid.system不同于通过install方式安装的App,将该属性添加到AndroidManifest.xml中后,做为预置App集成到ROM中,便可直接使用在清单文件中声明的权限。至于App是否需要采用系统签名,与FWK的实现有关。3.default permission对于那

2020-12-31 01:33:32 1980 2

原创 应用基准化分析—Benchmark

一、简介谷歌在 I/O 2019 发布了 Benchmark 库的第一个 alpha 版。Jetpack Benchmark 是一个运行在 Android 设备上的标准 JUnit 插桩测试 (instrumentation tests),它使用 Benchmark 库提供的一套规则进行测量和报告。Jetpack Benchmark 可以在 Android Studio 中快速对 Kotlin 或 Java 代码进行基准化分析。该库会处理预热,衡量代码性能,并将基准化分析结果输出到 Android

2020-12-10 01:22:00 2104

原创 Android App 与 蓝牙服务 通信变更

首先,让我们来回顾下Google官方 在 Android 5.0 引入的媒体应用框架:Android MediaSession框架简析。然后,由于支持 蓝牙音乐 的音乐类App,也是基于MediaBrowserService 实现的功能,所以音乐类App会根据Android系统的版本,进行客户端MediaBrowser连接服务端MediaBrowserService 的初始化操作。最后,若连接成功、获取到MediaController,则下发相应的指令经MediaBrowse...

2020-12-01 01:33:14 992

原创 Android Handler拾遗 - 屏障消息

一、消息分类二、如何使用三、原理简析四、实际应用

2020-11-23 01:17:15 366

原创 应用启动优化—App Startup

一、简介App Startup 是 Android Jetpack 家族的成员,提供了一种在应用程序启动时,简单、高效的初始化组件的方法。无论是App开发人员,还是Library开发人员都可以使用App Startup来简化启动过程,并显式地设置初始化顺序。App Startup 不需要为每个组件的初始化定义单独的 ContentProvider,它提供了一个 ContentProvider 来运行所有依赖项的初始化,从而显著的提高了应用程序的启动速度。二、启动优化手段三、App..

2020-08-09 00:10:18 1996

原创 匿名内部类的内存泄漏—JVM

1. 普通类、静态类、单例类、内部类,在JVM的哪个区域存储?什么时候?2. 普通代码块、构造代码块、静态代码块、同步代码块、构造方法, 在JVM的哪个区域存储?什么时候?3. 成员变量、局部变量、静态变量、常量、静态常量、普通方法、静态方法, 在JVM的哪个区域存储?什么时候?...

2020-08-02 23:46:44 964

原创 Android组件化—Java SPI机制

一、SPI是什么SPI(Service Provider Interface),是JDK提供的一套用来被第三方实现或者扩展的API,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用。SPI机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是解耦。SPI整体机制如下:Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。SPI与API区别:API是调用并用于实现目标的类、接口、方法等的描述; SPI是扩展

2020-07-26 14:05:19 1145

原创 简析Linux mmap知识点

一、I/O 的三种方式标准 I/O:平时用到 read/write 操作都属于标准 I/O,也就是缓存 I/O(Buffered I/O)。 mmap:由于与Page Cache做过内存映射,只需要从磁盘拷贝一次,不需要再拷贝回用户空间。 直接 I/O:减少了一次数据拷贝和一些系统调用的耗时,很大程度降低了 CPU 的使用率以及内存的占用,在 open() 文件的时候需要指定 O_DIRECT 参数。二、什么是虚拟地址空间在Linux上为了做进程隔离,让每个进程都运行在自己的单独的虚拟

2020-07-12 18:56:47 115

原创 Android MediaSession框架简析

q

2020-06-21 18:11:53 1736

原创 Android启动过程性能分析工具Bootchart

Bootchart是一个用于GNU/Linux启动过程的性能分析和可视化呈现的开源软件工具。在系统启动过程中,自动收集CPU占用率、磁盘吞吐率、进程等信息,然后生成PNG、SVG或EPS编码的图表。Android系统已经集成了Bootchart工具,位于源码的system/core/init/bootchart.cpp,特别值得关注的是system/core/init/README.md,在里面有详细的使用说明。

2020-06-04 23:35:06 1242

原创 拓扑排序的算法实现

111

2020-05-31 13:32:13 392

原创 图的表示及遍历

一、什么是图二、图的表示1.邻接表2.邻接矩阵三、图的遍历1.广度优先遍历a.基于邻接表的实现b.基于邻接矩阵的实现2.深度优先遍历a.基于邻接表的实现b.基于邻接矩阵的实现...

2020-05-24 22:43:28 301

原创 ThreadLocal解析

一、ThreadLocal简介二、ThreadLocal实现原理三、InheritableThreadLocal类四、ThreadLocal常见问题脏数据内存泄漏父子线程共享线程变量五、ThreadLocal使用建议...

2020-05-09 23:14:11 202

原创 Android单元测试框架-设计思路

一、测试金字塔小型测试是指单元测试,用于验证应用的行为,一次验证一个类。 中型测试是指集成测试,用于验证模块内堆栈级别之间的交互或相关模块之间的交互。 大型测试是指端到端测试,用于验证跨越了应用的多个模块的用户操作流程。 沿着金字塔逐级向上,从小型测试到大型测试,各类测试的保真度逐级提高,但维护和调试工作所需的执行时间和工作量也逐级增加。因此,编写的单元测试应多于集成测试...

2020-04-27 00:45:53 696

原创 Android中assets各级目录的遍历及小结

一、文件特性单个文件需要小于1M 文件只能读,不能做写操作 自带隐藏的3个文件夹资源:images 、sounds 、webkit 不会被映射到R中,不能通过R.XXX.ID的方式访问,仅能通过AssetManager读取 打包进apk时,不进行压缩,可以有多级目录(raw文件夹也不压缩,不可以有多级目录,会被映射到R中,放置多媒体文件) APK安装之后会放在"/data/app/*...

2020-03-27 23:38:13 1075

转载 Java并发编程包中atomic的实现原理

一、引子 在多线程的场景中,我们需要保证数据安全,就会考虑同步的方案,通常会使用synchronized或者lock来处理,使用了synchronized意味着内核态的一次切换。这是一个很重的操作。 有没有一种方式,可以比较便利的实现一些简单的数据同步,比如计数器等等。concurrent包下的atomic提供我们这么一种轻量级的数据同步的选择。二、...

2020-02-29 21:34:48 266

原创 RemoteViews的作用及原理

一、RemoteViews是什么? RemoteViews表示远程View,用于跨进程更新UI,主要用于系统通知栏(Notification)和桌面小部件(App Widget)中。RemoteViews没有继承View, 却实现了parcelable这个接口。 在通知栏上显示通知是通过NotificationManager的notify()方法实现的,如果...

2020-02-27 22:21:08 599

原创 PrecomputedTextCompat用法及原理

一、官方介绍 文本展示非常复杂,其涵盖的特性有:多种字体、行间距、字间距、文本方向、断行、字符连接等。为了测量及布局给定文本,TextView 必须做很多工作,例如读取字体文件、查找字形、决定形状、测量边界框以及将文本缓存在内部文本缓存中。更重要的是,所有这些工作都在 UI 线程中进行,这就有可能导致 app 帧数下降。 我们发现文本测量花费的时间占据文本设置的90...

2020-02-18 23:06:19 1065

原创 RemoteViews布局和类型限制源码分析

一、官方文档二、类的定义三、RemoteView注解 在RemoteViews源码中声明了如下注解: 从注解类型来看为运行时注解,作用于类或接口,结合注释可知此注解用于View的子类,用来标识该View是否可以作为远程视图使用。由此可以推断出,并非所有View都可以作为远程视图,只有声明了RemoteView注解的View才可以。 ...

2020-01-21 23:09:25 418

原创 Android代码加固技术

一、对抗反编译工具二、对抗apk重打包三、对抗安卓模拟器四、对抗IDA调试so

2019-07-27 14:54:27 1055

原创 Android应用安全之JNI混淆

简介JNI全称为Java Native Interface,是使Java方法与C\C++函数互通的一座桥梁。通俗的讲,它的作用就是使Java可以调用C\C++写的函数、使C\C++可以调用Java写的方法。特点1、性能众所周知,Android程序一般是基于Java语言开发的,虽然Google随后推出了Kotlin语言,但是Kotlin语言依然运行在J...

2019-03-06 00:38:11 2690 1

原创 JNI函数的2种书写方式

一、静态注册原理:根据函数名来建立 java 方法与 JNI 函数的一一对应关系; 以Java为前缀,并且用“_”下划线,将包名、类名以及native方法名连接起来;实现流程:编写 java 代码; 利用 javah 指令生成对应的 c 文件; 对 c 文件中的声明进行实现; public class MainActivity extends AppCompatActivity...

2019-02-18 23:20:52 830

原创 Android应用上架变更

符合 Google Play 的目标 API 级别要求https://developer.android.com/distribute/best-practices/develop/target-sdk?hl=zh-cn 华为移动应用软件高API等级公告https://developer.huawei.com/consumer/cn/notice/20180831 Go...

2019-02-14 23:57:22 231

原创 Android M、O权限变更

       在 Android 8.0 之前,如果应用在运行时请求权限并且被授予该权限,系统会错误地将属于同一权限组并且在清单中注册的其他权限也一起授予应用。        对于针对 Android 8.0 的应用,此行为已被纠正。系统只会授予应用明确请求的权限。然而,一旦用户为应用授予某个权限,则所有后续对该权限组中权限的请求都将被自动批准。        例如,假设某个应用在其清单中...

2019-01-15 18:15:52 591

转载 android 6.0禁用了权限却返回0

android 6.0 开始加入了动态权限申请,但今天却发现了一个很奇怪的问题,以打电话为例,明明在系统设置的权限管理中把demo的打电话权限禁止了,却仍然返回0int result= checkSelfPermission(permission.CALL_PHONE);                        if(result==0)                       ...

2019-01-15 18:10:29 448

转载 Vivo手机的权限管理

       最近搞的项目里遇到了权限管理的问题,由于手上的测试用机只有华为和vivo,所以这里仅以这两款机型讨论。调试代码时发现了一个问题,跟我在前面的一篇博客里写的一样,就是发现vivo手机上用android原生的api去检查权限(就以相机权限为例吧)发现是有这个权限的,但是我明明在设置(比较新的vivo手机上i管家和设置里的权限管理已经合为一套了)里禁止了该权限;在华为手机上则是正常的,禁止...

2019-01-15 18:00:01 2451

原创 Url追加参数方法,考虑#、?、$的情况

public static String addParamToUrl(String url, String param) { if (url.contains(param)) { return url; } else if (url.contains("?")) { return url.contains("#") && url.i...

2019-01-12 15:18:40 2933

原创 Android O上获取Adaptive Icon的Bitmap对象

常见场景:通过BitmapFactory.decodeResource的方式,设置Notification的LargeIcon,当APP适配了自适应Icon后,获取不到Bitmap对象。方式一:public Bitmap getAppIcon(Context context) { if (context == null) { return null; ...

2018-12-01 15:42:39 2396

原创 AsyncTask经验小结

1. AsyncTask对象的创建代码必须在主线程中调用;2. 直接new AsyncTask对象可能导致内存泄漏;3. execute方法必须在主线程中调用;4. execute方法在Android1.6之前串行,Android1.6之后并行,Android3.0后串行;5. 由于在Android3.0后,execute()方法使用内部定义的默认线程池顺序执行, 可能出现等待很久...

2018-11-15 18:11:21 92

原创 Android Launcher Icon适配

一、Legacy Icon系统API < 25 桌面图标大小定义为48 x 48dp 参照Iphone,大部分为圆角矩形 早期放置于drawable-*目录,后改为mipmap-*目录 二、Round Icon系统API == 25 桌面图标大小定义为48 x 48 dp 桌面图标放置于为mipmap-*目录<application            ...

2018-11-10 23:34:19 1378

原创 如何获取泛型的类型

@Overridepublic void loadImage(@NonNull Context context, @Nullable String url, @Nullable Options options, @Nullable ILoaderListener<T> listener) { Type type = listener.getClass().get...

2018-10-24 11:57:36 594

原创 Map排序工具类

public class MapUtil { public static Map<String, String> sortByKey(Map<String, String> map) { if (map == null || map.isEmpty()) { return null; } ...

2018-10-23 10:27:40 939 1

原创 SHA256加密工具类

public class SHA256Util { /** * 用java原生的摘要实现SHA256加密 * * @param str 加密前的报文 * @return */ public static String getSHA256String(String str) { String encodeStr =...

2018-10-23 10:21:02 8688

原创 自定义标题栏View

    1.设置标题栏透明度    setAlpha(@FloatRange(from = 0.0, to = 1.0) float alpha)2.设置标题栏背景色    setBackgroundColor(@ColorInt int color)    setBackgroundResource(@DrawableRes int resId)3.设置左侧操作区域1    ...

2018-08-13 23:17:24 218

原创 Android 4.4~8.1 状态栏适配

一、状态栏着色API<19:不执行API=19:黑灰渐进透明的状态栏API>=20:系统会自动生成一个半透明的状态栏。当API>=21时,能够调用系统API直接对状态栏着色1.沉浸式模式StatusBarUtils.setColorBar(activity, barColor);系统状态栏与标题栏、ActionBar、ToolBar颜色相同。2.透明...

2018-08-12 21:26:43 926

原创 TextView设置android:gravity="center"失效

1.在程序中调用TextView的方法:setIncludeFontPadding (boolean includepad)2.或者在xml中加入下句:android:includeFontPadding="false" 参考:android:includeFontPadding的使用:清除TextView字体周边空白http://stackoverflow.com/q...

2018-08-10 14:33:15 4365

空空如也

空空如也

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

TA关注的人

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