自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Gradle插件实战之编译期修改代码

背景在工作中我们经常会用到第三方库,不可避免这些库中会有各种问题,没办法只有给开源库作者提issue,但是这种效率很低,而且作者不一定会去修改,因此只有自己去改。解决方案我们可以把项目chone下来修改,但是这种效率很低,也可能会遇到不可预知的问题,这样大大增加了开发成本。开发Gradle插件,利用Javassit动态修改class中已有的方法,这种方法效率很高,不会影响到源码。Javassitjavassist是一个动态修改java字节码的开源库,它可以在编译好的class文件中添加/修改

2021-01-24 17:03:24 3818 10

原创 Android埋点之圈点选择

前言在上一篇博客中基于滴滴DroidAssist插件实现了无痕埋点,这样用户的操作路径就通过了接口上传到了服务器,然后后台制作图表,产品经理进而分析和优化产品后续的体验,也可以为产品的运营提供数据支撑。但是现在我们上传的View路径都是这样的MainActivity/LinearLayout[0]/LinearLayout[7]/TextView[2],这些路径别人是看不懂的,所以就需要给这些路...

2019-07-19 22:56:05 712 2

原创 基于滴滴DroidAssist插件实现无痕埋点方案

无痕埋点概念无痕埋点也叫无埋点、全埋点,它是一种数据采集的重要方法。由于业务更新迭代快、代码量大,手动埋点错误率高并且还费时费力,所以手动埋点不是明智的选择。这时候就需要无痕埋点,它不需要开发人员手动的写数据采集的代码,而是通过动态插入代码的方式,大大地减少了程序员的工作量。无痕埋点方案方式一:全局Hook App中的View方式二:AOP编程(Aspect-Oriented Progr...

2019-07-02 22:05:43 2411

原创 Flutter侧滑删除控件

在android实现类似微信的侧滑删除比较复杂,需要使用到ViewDragHelper,各种手势判断。而在flutter中实现却很简单,几种控件组合起来就可以实现,先看一下效果图。使用方法:@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( ti...

2019-06-23 21:45:21 7081 9

原创 深入理解Kotlin协程

异步调用是否发生,取决于resume函数与对应的挂起函数的调用是否在相同的调用栈上,切换函数调用栈的方法可以是切换到其他线程上执行,也可以是不切换线程但在当前函数返回之后的某一个时刻再执行。test方法一调用直接return返回了,没有发生挂起操作,test2方法使用suspendCoroutine获取当前所在协程的Continuation的实例作为参数将挂起函数当成异步函数来处理,然后开启了一个thread执行resume操作,因此无法同步执行,会进入挂起状态,直到结果返回。

2022-09-28 13:57:02 1117 1

原创 Cmake常用命令

最低支持的版本生成静态库和动态库批量导入源码文件引入头文件导入静态库或动态库(第一种方式)导入静态库或动态库(第二种方式)搜索指定的预构建库并将路径存储为变量链接第三方库或者系统库到目标库添加一个子目录并构建该子目录目录结构如下:变量列表条件判断一元测试命令:EXIST:判断文件或者目录是否存在,存在时为真。需要提供全路径;如果文件或者目录是符号链接(例如软连接),则只有当链接的目标存在时返回真。格式为:if(EXISTS path-to-file-or-

2022-07-04 14:33:14 2913

原创 Android使用addr2line定位native崩溃堆栈

Android在开发native层代码是时很容易报 错误,这种问题单看报错日志是很难定位到问题的。比如如下错误是我在开发过程中遇到的,Android Studio也不知道抽什么风断点调试也不能用,好在之前听说过 这个工具,但一直没有用过,没办法只好用这个工具试试。addr2lineaddr2line命令来自于英文词组”address to line“的缩写,其功能是将函数地址解析成文件名或行号的工具。给出一个可执行文件中的地址或一个可重定位对象中的偏移部分的地址,使用调试信息来找出与之相关的文件名和

2022-06-21 17:10:04 2611

原创 组件化开发

单工程遇到的问题随着项目逐渐发展,业务越来越多,代码量也越来越多,耦合严重,层次混乱,页面互相之间的跳转有着极强的关联性,所有代码都写在app module中,编译一次都要5-6分钟,为了方便以后项目的开发/测试以及提高编译性能就需要进行组件化了。组件化的优势降低耦合度:每个业务模块无不关联,可自由拆卸、自由组装,重复利用加快编译速度:每个组件可以单独编译运行,发布时也可以合并成一个app。提高协作效率:团队中每个人负责自己的组件,不会影响其他组件,降低团队成员熟悉项目的成本。组件如何划分

2022-03-31 16:01:02 5328

原创 Binder机制

前言作为Android开发者一定知道Binder机制,Binder是Android系统提供的一种IPC机制(进程间通讯机制),比如在Android中的四大组件都会涉及到AMS通信,而这种跨进程通信都是由Binder来完成的,我们通常说Binder就是Android中的血管系统。而Binder机制是非常复杂的,要想完完整整搞懂是非常不容易的,作为应用层开发者来说理解其基本的原理就可以了,因此本文不会涉及到Native层和Kernel层。多进程的优势一般我们开发的app都是默认一个进程的,但是虚拟机给每个

2022-03-31 15:54:22 3791

原创 Android程序员需掌握的JVM知识

什么是JVMJVM 全称 Java Virtual Machine,它是一种规范。JVM 是一个虚拟化的操作系统,类似于 Linux 或者 Windows 的操作系统,只是它架在操作系统上,接收字节码,把字节码翻译成操作系统上的机器码且进行执行。为什么需要学习JVMAndroid的运行环境都是在ART虚拟机或者是Dalvik虚拟机上,为什么Android程序员需要学习JVM,理解JVM可以帮助我们更好的了解Java内存区域、对象的创建和内存分配、垃圾的回收以及常见的垃圾回收算法等等,然后将其运用到An

2021-11-29 10:15:07 6900

原创 Kotlin协程及在Android中的应用

什么是协程协程并不是kotlin中才有的概念,在Python、Go等中也有协程。初学kotlin协程对这个概念很迷惑,比如官方文档上说:协程是一种轻量级的线程,我们很容易将协程和线程联系起来产生误解,认为协程也是一种线程。其实协程的实现也是离不开线程的,它也是跑在线程中,可以是单线程也可以是多线程,简单来说协程就是一个线程的框架。我们可以在实际的开发中去理解它,在android中避免不了要使用网络请求数据,网络请求必须要在子线程中执行,获得的数据必须要在主线程更新UI,这就一定会在子线程和主线程之间来回

2021-02-26 17:11:30 456

原创 Android Studio调试Gradle插件

在开发gradle插件在遇到问题时需要断点调试代码,由于Android Studio不能直接调试Plugin,每次都要println输出,这样的效率特别低,很浪费时间。其实要想使用Android Studio调试也不是不可以,但是需要做一些配置。配置1.点击Edit Configurations2.点击+号,选择Remote3.随意输入名称,其他参数不要动4.然后在Terminal中输入如下命令./gradlew --no-daemon -Dorg.gradle.debug=true :a

2021-01-25 18:27:03 1323

原创 快捷修改AndroidManifest中configChanges属性

问题最近在使用我们的app发现了一个问题,当打开app使用系统的分屏功能时页面会重新加载,导致体验不好。通过查阅Android文档,原因是在运行时发生配置变更时,默认情况下会关闭 Activity 并将其重启。可以在configChanges属性申明配置来防止Activity重启。以下内容摘自文档:值描述“density”显示密度发生变更 — 用户可能已指定不同的显示比例,或者有不同的显示现处于活跃状态。此项为 API 级别 24 中的新增配置。“fontScale”字体

2020-12-02 16:30:57 690

原创 EditText在ScrollView中获取焦点自动滚动问题

问题:在实际开发中会遇到表单页面,表单中有很多选项,包括EditText等,这样会导致一屏显示不下,我们通常都会添加一个ScrollView使其页面可以上下滑动。 <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent"

2020-09-03 16:27:17 1647 2

原创 自定义ViewGroup中child绘制顺序

背景在项目中需要显示一组用户头像(见下图),右边的图片有一部分在左边的图片下面,依次叠加。我们可以使用LinearLayout,然后每个图片向左偏移-xdp,但是这样做你会发现实现的效果并不是这样,而是右边的头像在左边的头像上面。这是因为ViewGroup绘制子view的顺序导致的,先添加的view先绘制,我们可不可以改变ViewGroup的绘制顺序呢,当然可以,在View中有一个方法setTranslationZ(float translationZ),translationZ值越大优先级就越低

2020-08-22 10:37:02 616

原创 IdleHandler原理及应用

2019-12-03 11:47:18 2400

原创 Waiting for another flutter command to release the startup lock...

今天在Clone Flutter项目时,在执行 flutter pub get命令时提示 Waiting for another flutter command to release the startup lock…,并且一直卡在那里,无论等多久或者重启多少次都是没用的。zhangyujiudembp:flutter_aide zhangyujiu$ flutter pub getWai...

2019-09-02 23:11:20 352

原创 Fragment.startActivityForResult不回调onActivityResult

问题前段时间在开发中遇到一个问题,在Fragment中启动一个Activity并返回数据,但是结果并没有回调onActivityResult方法,代码很简单应该没什么问题呀。在网上查资料,都是说是因为调用activity.startActivityForResult造成的,应该fragment.startActivityForResult,试了下发现确实可以解决问题,但是原理是什么呢?原理我...

2019-08-10 15:57:15 1383

原创 Jetpack系列组件之ViewModel

Jetpack简介在2018年Google I/O大会发布了一系列辅助android开发者的实用工具,统称Jetpack,Jetpack 是一套库、工具和指南,可帮助开发者更轻松地编写优质应用。这些组件可帮助您遵循最佳做法、让您摆脱编写样板代码的工作并简化复杂任务,以便您将精力集中放在所需的代码上。ViewModel这篇文章主要讲ViewModel的使用及原理。ViewModel主要用来管理...

2019-07-28 13:21:00 1076

原创 Flutter项目Wanandroid

最近公司准备使用Flutter开发自己内部项目,自学了一周的flutter后使用了鸿洋大神开源的api开发了Flutter版Wanandroid项目,感谢鸿洋大神的无私奉献,由于是练手写的项目,开发的比较简陋,界面比较难看。项目主要页面截图主要第三方开源库shared_preferencesdiosqflitepath_providerflutter_...

2019-07-21 20:55:19 606

原创 Android自定义TabLayout无效

今天要实现这样的一个效果,下面的indicator是一个不规则的矩形,所以使用原生的TabLayout必须用定制的CustomView,在切换的时候动态更换CustomView的背景。方法很简单,代码如下: val tabTitles = arrayOf("全部", "合格证", "发票", "打款凭证", "其他票据")tabTitles.forEach { va...

2019-07-14 15:02:15 1488

原创 Flutter实现类似Android中的PopupWindow控件

最近在网上看到一段话。产品有三宝-弹窗,浮层加引导,设计有三宝-透明,阴影加圆角,运营有三宝-短信,push加红包。在日常开发中经常会遇到弹窗、浮层之类的效果,这些在Android中实现很简单,可以用PopupWindow完成。但是在flutter中怎么做呢,起初我是用flutter中的PopupMenuItem来做,但是这种效果体验特差,不能自定义内容、不能自定义位置,所以放弃了该方案。于是我看...

2019-06-29 13:40:19 8749 2

原创 Glide自定义缓存失效之signature

发现问题今天测试提了一个bug,说Android图片显示的和IOS不一样,于是我就看了下代码,发现字段和IOS用的是一样的啊,这就让我感到很郁闷了。于是我仔细看了下接口返回的图片地址发现地址有点奇怪,图片的地址是https://sxbkj-test.oss-cn-hangzhou.aliyuncs.com/shop/public/bg.png,这个图片地址的命名是以bg.png命名的,公司的图片...

2019-06-24 21:53:03 2294

原创 RxPermissions原理解析

为什么需要申请动态权限android在6.0之前申请权限是在manifest中配置的,但在6.0版本了保护用户隐私引入了一种新的权限模式,这种模式权限分为两种:非敏感权限:这种权限是不需要动态申请,只需要在manifest中配置,和6.0之前请求权限是一样的。敏感权限:在用户需要使用一些敏感权限需要向系统动态申请,这种权限是分组的,一组权限只要申请了其中的一个,同组的其他权限也就被申...

2019-06-23 17:34:54 991

空空如也

空空如也

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

TA关注的人

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