
Android
文章平均质量分 76
一杯苦芥
这个作者很懒,什么都没留下…
展开
-
Android App抓包、Mock数据探索
一、背景 客户端在开发过程中,经常遇到以下问题:服务经常挂掉 制造数据的过程繁琐 正在发布,需慢慢等 服务端正忙,事情优先级靠后 服务端修改数据,会影响测试过程 只定义好了接口,客户端进度被Block二、收益 客户端在开发过程中,Mock数据的意义:团队可以并行工作 前后端人员定义好接口文档,就可以开始并行工作,互不影响。有利于整个产品质量以及进度的保证。隔离系统 构造的虚拟请求响应,不会造成服务端接口真实数据的污染...原创 2022-01-16 22:24:45 · 3866 阅读 · 0 评论 -
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 · 8920 阅读 · 0 评论 -
Android编译提速—Win环境篇
一、SSD将JDK、SDK、Code、Android Studio全部迁移到SSD。二、杀毒软件某些防病毒软件会干扰 Android Studio 构建过程,从而导致 build 运行速度明显变慢。当您在 Android Studio 中运行 build 时,Gradle 会编译应用的资源和源代码,然后将编译后的资源打包在一个 APK 中。在此流程中,系统会在计算机上创建多个文件。如果您的防病毒软件启用了实时扫描功能,那么在每次创建一个文件后,防病毒软件都会扫...原创 2021-07-05 00:30:54 · 547 阅读 · 0 评论 -
EventBus拾遗—索引
EventBus 是 Android 中基于 观察者模式 实现的 发布-订阅事件总线 第三方开源框架。其优势如下: 轻量级框架,执行效率高 使用简单,工程代码保持简洁优雅 简化了组件之间的通信,将事件的发送者和接收者解耦 一、基础回顾1.自定义配置2.订阅方法格式3.事件的继承4.避免OOM二、源码回顾1. 关键的类SubscriberMethod: 对订阅方法的相关信息的封装类(Method,...原创 2021-01-31 23:39:07 · 316 阅读 · 0 评论 -
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 · 4784 阅读 · 2 评论 -
Android App 与 蓝牙服务 通信变更
首先,让我们来回顾下Google官方 在 Android 5.0 引入的媒体应用框架:Android MediaSession框架简析。然后,由于支持 蓝牙音乐 的音乐类App,也是基于MediaBrowserService 实现的功能,所以音乐类App会根据Android系统的版本,进行客户端MediaBrowser连接服务端MediaBrowserService 的初始化操作。最后,若连接成功、获取到MediaController,则下发相应的指令经MediaBrowse...原创 2020-12-01 01:33:14 · 2107 阅读 · 0 评论 -
Android Handler拾遗 - 屏障消息
一、消息分类二、如何使用三、原理简析四、实际应用原创 2020-11-23 01:17:15 · 545 阅读 · 0 评论 -
应用基准化分析—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 · 3111 阅读 · 0 评论 -
应用启动优化—App Startup
一、简介App Startup 是 Android Jetpack 家族的成员,提供了一种在应用程序启动时,简单、高效的初始化组件的方法。无论是App开发人员,还是Library开发人员都可以使用App Startup来简化启动过程,并显式地设置初始化顺序。App Startup 不需要为每个组件的初始化定义单独的 ContentProvider,它提供了一个 ContentProvider 来运行所有依赖项的初始化,从而显著的提高了应用程序的启动速度。二、启动优化手段三、App..原创 2020-08-09 00:10:18 · 2602 阅读 · 0 评论 -
Android组件化—Java SPI机制
一、SPI是什么SPI(Service Provider Interface),是JDK提供的一套用来被第三方实现或者扩展的API,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用。SPI机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是解耦。SPI整体机制如下:Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。SPI与API区别:API是调用并用于实现目标的类、接口、方法等的描述; SPI是扩展原创 2020-07-26 14:05:19 · 1583 阅读 · 0 评论 -
匿名内部类的内存泄漏—JVM
1. 普通类、静态类、单例类、内部类,在JVM的哪个区域存储?什么时候?2. 普通代码块、构造代码块、静态代码块、同步代码块、构造方法, 在JVM的哪个区域存储?什么时候?3. 成员变量、局部变量、静态变量、常量、静态常量、普通方法、静态方法, 在JVM的哪个区域存储?什么时候?...原创 2020-08-02 23:46:44 · 1402 阅读 · 0 评论 -
简析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 · 288 阅读 · 0 评论 -
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 · 2955 阅读 · 4 评论 -
Android MediaSession框架简析
q原创 2020-06-21 18:11:53 · 2917 阅读 · 0 评论 -
ThreadLocal解析
一、ThreadLocal简介二、ThreadLocal实现原理三、InheritableThreadLocal类四、ThreadLocal常见问题脏数据内存泄漏父子线程共享线程变量五、ThreadLocal使用建议...原创 2020-05-09 23:14:11 · 331 阅读 · 0 评论 -
Android单元测试框架-设计思路
一、测试金字塔小型测试是指单元测试,用于验证应用的行为,一次验证一个类。 中型测试是指集成测试,用于验证模块内堆栈级别之间的交互或相关模块之间的交互。 大型测试是指端到端测试,用于验证跨越了应用的多个模块的用户操作流程。 沿着金字塔逐级向上,从小型测试到大型测试,各类测试的保真度逐级提高,但维护和调试工作所需的执行时间和工作量也逐级增加。因此,编写的单元测试应多于集成测试...原创 2020-04-27 00:45:53 · 976 阅读 · 0 评论 -
Android中assets各级目录的遍历及小结
一、文件特性单个文件需要小于1M 文件只能读,不能做写操作 自带隐藏的3个文件夹资源:images 、sounds 、webkit 不会被映射到R中,不能通过R.XXX.ID的方式访问,仅能通过AssetManager读取 打包进apk时,不进行压缩,可以有多级目录(raw文件夹也不压缩,不可以有多级目录,会被映射到R中,放置多媒体文件) APK安装之后会放在"/data/app/*...原创 2020-03-27 23:38:13 · 2550 阅读 · 0 评论 -
Java并发编程包中atomic的实现原理
一、引子 在多线程的场景中,我们需要保证数据安全,就会考虑同步的方案,通常会使用synchronized或者lock来处理,使用了synchronized意味着内核态的一次切换。这是一个很重的操作。 有没有一种方式,可以比较便利的实现一些简单的数据同步,比如计数器等等。concurrent包下的atomic提供我们这么一种轻量级的数据同步的选择。二、...转载 2020-02-29 21:34:48 · 378 阅读 · 0 评论 -
RemoteViews的作用及原理
一、RemoteViews是什么? RemoteViews表示远程View,用于跨进程更新UI,主要用于系统通知栏(Notification)和桌面小部件(App Widget)中。RemoteViews没有继承View, 却实现了parcelable这个接口。 在通知栏上显示通知是通过NotificationManager的notify()方法实现的,如果...原创 2020-02-27 22:21:08 · 974 阅读 · 0 评论 -
PrecomputedTextCompat用法及原理
一、官方介绍 文本展示非常复杂,其涵盖的特性有:多种字体、行间距、字间距、文本方向、断行、字符连接等。为了测量及布局给定文本,TextView 必须做很多工作,例如读取字体文件、查找字形、决定形状、测量边界框以及将文本缓存在内部文本缓存中。更重要的是,所有这些工作都在 UI 线程中进行,这就有可能导致 app 帧数下降。 我们发现文本测量花费的时间占据文本设置的90...原创 2020-02-18 23:06:19 · 1678 阅读 · 0 评论 -
RemoteViews布局和类型限制源码分析
一、官方文档二、类的定义三、RemoteView注解 在RemoteViews源码中声明了如下注解: 从注解类型来看为运行时注解,作用于类或接口,结合注释可知此注解用于View的子类,用来标识该View是否可以作为远程视图使用。由此可以推断出,并非所有View都可以作为远程视图,只有声明了RemoteView注解的View才可以。 ...原创 2020-01-21 23:09:25 · 668 阅读 · 0 评论 -
View中的getScrollX、getScrollY与getLeft、getRight 以及 MotionEvent中的getX、getY与getRawX、getRawY
一、Android中的坐标原点 屏幕的左上角:坐标系统原点(0,0) 原点向右延伸:X轴正方向 原点向下延伸:Y轴正方向 二、View中的getScrollX、getScrollY getScrollX():当前视图相对于屏幕原点在X轴上的偏移量 getScrollY():当前视图相对于屏幕原点在Y轴上的偏移量原创 2016-06-09 23:34:33 · 1058 阅读 · 0 评论 -
mipmap目录和drawable目录的区别
官方文档:Mipmapping for drawablesUsing a mipmap as the source for your bitmap or drawable is a simple way to provide a quality image and various image scales, which can be particularly useful if you原创 2016-06-26 15:40:27 · 417 阅读 · 0 评论 -
解决在onCreate()过程中获取View的width和Height为0的4种方法
很经常当我们动态创建某些View时,需要通过获取他们的width和height来确定别的view的布局,但是在onCreate()获取view的width和height会得到0.view.getWidth()和view.getHeight()为0的根本原因是控件还没有完成绘制,你必须等待系统将绘制完View时,才能获得。这种情况当你需要使用动态布局(使用wrap_content或match_par转载 2016-06-27 22:10:27 · 407 阅读 · 0 评论 -
ContentUris类常用方法介绍
ContentUris是一个工具类,主要是用来处理使用 "content" 约束的Uri对象。一、parseId(uri) 从路径中获取ID部分: static longparseId(Uri contentUri) Uri uri = Uri.parse(Contract.SCHEMA + Contract.A原创 2016-07-10 10:41:53 · 799 阅读 · 0 评论 -
Android怎么找到最优适配资源
当我们将一些提供了不同的资源文件可供Android系统选择的时候,Android会在运行时会根据一套适配的规则选择最符合当前配置的资源。为了说明Android怎么选择资源,假设我们有以下可选的资源文件目录,每一个目录都包含同一张图片的不同版本。drawable/drawable-en/drawable-fr-rCA/drawable-en-port/drawable-en-noto翻译 2016-06-27 22:12:00 · 476 阅读 · 0 评论 -
将Bitmap压缩成指定大小的缩略图
最近公司的项目需要开发类似友盟的社会化分享组件,在编码中发现QQ、微信、新浪、钉钉等分享SDK,对byte数组或者bitmap形式的缩略图有大小限制,否则会报分享失败。下面是具体的代码:/** * 图片的缩放方法 * * @param bitmap :源图片资源 * @param maxSize :图片允许最大空间 单位:KB * @return */public sta原创 2016-06-30 23:51:56 · 5606 阅读 · 0 评论 -
WebViewClient与常用事件监听
一、WebViewClient1、概述前面我们虽然实现了交互,但可能我们会有一个很简单的需求,就是在开始加载网页的时候显示进度条,加载结束以后隐藏进度条,这要怎么做? 这些简单的需求,Android开发的老人们肯定都已经想到了,这些有关各种事件的回调都被封装在WebViewClient类中了,在WebViewClient中有各种的回调方法,就是在某个事件发生时供我们监听 使用方转载 2016-07-16 16:26:00 · 893 阅读 · 0 评论 -
Android中各种Span的用法
Android中各种Span的用法前言SpannableStringBuilderURLSpanUnderlineSpanTypefaceSpanTextAppearanceSpanTabStopSpanStandardSuperscriptSpanSubscriptSpanStrikethroughSpanScaleXSpanStyleSpanRelativeSizeSpanQuoteS转载 2016-07-17 00:13:49 · 443 阅读 · 0 评论 -
解决android数据库降级时,sqlite不支持drop column的问题
由于存在用户从高版本apk强制安装低版本apk的情况,所以需要重写SQLiteOpenHelper类的onDowngrade方法,对db进行降级操作。当drop表字段时,会报如下错误: drop删除表字段的操作语句如下:db.execSQL("ALTER TABLE " + Contract.Tables.FAVORITE + " DROP COLUM原创 2016-08-05 00:02:42 · 1662 阅读 · 1 评论 -
TextView两端对齐
public class AlignTextView extends TextView { private int mWidth; // textView的宽度 private float mTextHeight; // 单行文字高度 private float mTextLineSpaceExtra = 0; // 额外的行间距 private List mSp原创 2016-07-17 18:42:51 · 1812 阅读 · 2 评论 -
Android虚拟按键遮挡Listview的FooterView问题
首先,在最外层的Layout里添加 android:fitsSystemWindows="true"属性。如果在Listview的其它位置有出现偏差,再对布局做些适当的调整即可。调整前的效果:调整后的效果:原创 2016-07-31 23:31:29 · 684 阅读 · 0 评论 -
在Android6.0手机上,已声明却无法获取READ_PHONE_STATE权限
一、异常Log信息二、在AndroidManifest.xml中已添加READ_PHONE_STATE权限,能在android6.0以下的系统正常运行三、处理办法:调用动态获取权限API原创 2016-08-01 00:35:29 · 15964 阅读 · 0 评论 -
解决android.os.DeadObjectException问题
解决办法:在AndroidManifest.xml文件的application标签中,添加android:hardwareAccelerated="false"(禁用硬件加速)。原创 2016-08-05 22:36:40 · 11135 阅读 · 2 评论 -
ListView设置Selector失效的问题
今天接了一个小需求:为listview添加灰色点击效果,要求在点击弹出底部popupwindow后,保持item的置灰效果,直到popupwindow消失时才恢复原状。但是在点击后Selector并没有生效,debug后知道是因为子view覆盖了listSelector属性导致的,所以在layout中添加drawSelectorOnTop属性并设置为true,最终解决问题。效果图:原创 2016-08-02 23:20:57 · 1676 阅读 · 0 评论 -
Base64编解码及flags参数
/** * bitmap转为base64 * * @param bitmap * @return */public static String bitmapToBase64(Bitmap bitmap) { String result = null; ByteArrayOutputStream baos = null; try { if (bit原创 2016-08-03 00:04:12 · 8113 阅读 · 0 评论 -
ListView添加HeadView后布局紊乱的问题
今天在做项目的时候需要开发一个顶部内容固定、可跟随ListView滑动的功能,虽然使用为ListView添加HeadView的方法实现了效果。但在开发的过程中,却遇到了给ListView添加HeadView之后,App界面的显示会发生紊乱的问题。在定位后没有发现事件冲突的问题,而不设置HeadView却是正常显示的,最终发现问题的根源和界面的生命周期有关。ps:在listview.setadapt原创 2016-08-07 01:15:23 · 1727 阅读 · 1 评论 -
Android应用开发性能优化完全分析
1 背景其实有点不想写这篇文章的,但是又想写,有些矛盾。不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结、我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用,啥啥啥该咋用等,却很少有较为系统的进行真正性能案例分析的,大多数都是嘴上喊喊或者死记住规则而已(当然了,这话我自己听着都有些刺耳,实在不好意思,其实关于性能优化的优质博文网上也转载 2016-09-06 22:23:10 · 890 阅读 · 0 评论 -
Android 4.x上适配设置DialogFragment背景透明--可拓展实现悬浮关闭按钮
方法一:设置style -- 无效 @Override public Dialog onCreateDialog(Bundle savedInstanceState) { LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.i原创 2016-08-18 00:00:20 · 1564 阅读 · 0 评论 -
HttpURLConnection获取网页内容,解决乱码的通用方法
由于网页内容的字符集编码不一定都采用UTF-8编码,所以通过HttpURLConnection获取的网页内容经常会出现乱码的问题。 网页内容的编码可能是UTF-8,也可能是GBK、GB2312,甚至其它编码方式。 从下面的截图可以看出,服务器会在HTTP头里面包含原始字符集编码信息,我们可以通过URLConnection类的getContentType()方法的返回值,然后用正则表原创 2016-08-25 00:09:51 · 7895 阅读 · 4 评论