自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

许进进的博客

学到的知识,要记录;重复的问题,勿再犯。

  • 博客(305)
  • 收藏
  • 关注

原创 浅析Java虚拟机中的ZGC

垃圾回收是Java开发中的关键机制,负责自动管理内存,防止内存泄漏,提高开发效率和应用程序的稳定性。

2024-01-22 16:28:44 468

原创 鸿蒙开发ArkUI -常用布局

在设置Grid的行列数量与占比时,如果仅设置行、列数量与占比中的一个,即仅设置rowsTemplate或仅设置columnsTemplate属性,网格单元按照设置的方向排列,超出Grid显示区域后,Grid拥有可滚动能力。当使用懒加载方式渲染网格时,为了更好的滚动体验,减少滑动时出现白块,Grid组件中也可通过cachedCount属性设置GridItem的预加载数量,只在懒加载LazyForEach中生效。使用弹性布局,可以实现子组件沿水平方向排列,两端对齐,子组件间距平分,竖直方向上子组件居中的效果。

2023-11-28 14:18:24 995

原创 Android tinker升级之路分析

华为荣耀系统tinker会通过registerDexModule方法注册dex,不会进行重试步骤(1.9.14.25.2版本重试10次,1.9.14.19版本重试3次);android8.0 之下直接使用DexFile.loadDex加载补丁触发dex2oat;android8 ~ android10,通过NewClassLoaderInjector.triggerDex2Oat进行dex2oat;

2023-09-14 10:07:11 644

原创 安卓进程间通信浅谈

共享内存是进程间通信的一种方式,通过映射一块公共内存到各自的进程空间来达到共享内存的目的。对于进程间需要传递大量数据的场景下,这种通信方式是十分高效的,但是共享内存并未提供同步机制,一个进程写共享内存时,并无自动机制可以阻止第二个进程开始对它进行读取,所以我们需要类似信号量机制来同步对共享内存的访问。Android中的匿名共享内存(Ashmem)是基于Linux共享内存的,借助Binder+文件描述符()实现了共享内存的传递。它可以让多个进程操作同一块内存区域,并且除了物理内存限制,没有其他大小限制。

2023-07-17 14:21:47 1360

原创 手写 EventBus:从零到一实现自己的事件总线库

在本文中,我们将详细介绍如何从头开始实现一个轻量级的 EventBus 库。我们将以 XEventBus 为例,阐述整个实现过程,以及在实现过程中遇到的关键问题和解决方法。

2023-05-05 19:43:41 1716 1

原创 享受简单上传体验:将Maven仓库迁移到GitHub

本文介绍了如何使用GitHub作为个人Maven仓库,实现便捷上传和管理构建结果。通过使用GitHub Pages和GitHub Packages,开发者可以在自己的GitHub仓库中创建Maven仓库,并将依赖库发布到其中。相比于Maven Central仓库,使用GitHub作为Maven仓库能够提高可用性和稳定性,并且上传流程更加简单和灵活。

2023-04-26 19:20:16 1768 2

原创 窥探 Android 应用打包流程:不同步骤的作用和工具详解

本文详细介绍了 Android 应用的打包流程,包括资源文件打包、aidl 文件处理、源代码编译、dex 文件生成、APK 打包、签名和对齐等多个步骤,以及涉及到的工具和注意事项。通过本文的解读,读者可以全面了解应用打包的完整构建过程,有助于更好地理解 Android 应用的编译和打包原理。

2023-04-02 19:28:24 1706

原创 重构之改善既有代码的设计(二)

为此必须要明确重构是经济行为而不是一种道德行为,重构使得开发效率变得更高,因此仅对必要的代码进行重构,某个工作行为如果重复三次就可以认为未来也会存在重复,因此通过重构使得下次工作更加高效,这是一种务实的作法,而重构不一定是需要大规模的展开的任务,重构应该是不断持续进行的,将任务拆解为多个具有完备性的任务,每周完成一个,每个任务的上线都不会引起问题,并使项目变得更好,这是一种持续重构的精神态度,是高效能程序员最应该具有的工作习惯。所以我们就会加一些补丁函数,例如下面例子中,对类扩展了两个函数,分别来计算。

2023-02-27 22:20:20 1020

原创 重构之改善既有代码的设计(一)

第一个定义是名词形式:重构(名词):对软件内部结构的一种调整,目的是在不改变「软件可察行为」前提下,提高其可理解性,降低修改成本。「重构」的另一个用法是动词形式:重构(动词):使用一系列重构准则手法,在不改变「软件可察行为」前提 下,调整其结构。改进软件设计,使软件更易被理解。ps:重构是一种经济适用行为,而非道德使然,如果它不能让我们更快更好的开发,那么它是毫无意义。重构对的意义是提高ROI。重构对的意义是战斗力的提升。

2023-02-14 20:39:24 1819 4

原创 APT最佳学习案例:写个简易版 ButterKnife

目的:写个简易版 ButterKnife,借手写 ButterKnife 去了解如何实现注解、annotationProcessor 的等使用。

2022-12-18 23:26:45 1218 6

原创 ConstraintLayout约束布局使用全解

为何:布局扁平化,减少布局层级,即提高性能;约束布局 默认需要一个垂直方向和水平方向的约束;约束布局中的宽高的0dp含义:充满约束宽高:match_constraint:充满父容器约束居中于控件中⼼⽔平⽅向居中垂直⽅向居中居中于控件的边控件垂直居中于 view 的「下边」填充⽔平⽅向填充⽗容器(通过 )备注:在早期版本中 match_parent 没有效果。为⽔平⽅向的控件设置权重,⼤⼩为 2:1:1 。⽂字基准线对⻬圆形定位通过「圆⼼」「⻆度」「半径」设置圆形定位特殊属性

2022-10-30 18:46:49 2312

原创 Android Code Review 注意点记录(不断更新~)

也有也有很多review的评论是愚蠢的,或是可以没有。若果与我具备差不多水平的人提出疑问,那么他肯定有一些我没有理解到的想法在里面;在评论中表现得友善,尊重他人的时间和工作,在代码review中吹牛、羞辱或生气没有任何好处。14、注意修饰符:自己写的类中中的一些方法或方法,如果确认仅仅为自己使用,请用private,请不要暴露了,这样有利于降低整个项目的复杂度;7、注意循环内try,不影响下一个item的处理;1、for循环中的remove操作(return、break除外);13、未格式化的代码;

2022-10-17 00:23:32 1633

原创 NetViewer-让App的网络请求无所遁形

在Android应用开发过程中,我们经常需要看到网络请求的一些参数信息,包括但不限于get/post方案,返回结果数据,耗时时长等等。通常的做法是在项目的okhttp的build过程中,主动添加一个拦截器用于这些信息的捕捉。但这种方案需要我们自己去在项目中编写拦截器;逻辑进行添加,且无法捕捉三方库或者其他module中的网络请求。在这个背景下,一个可以直接添加使用,并获取全局网络请求返回参数的工具库显得有必要。

2022-10-08 14:01:21 2297 1

原创 Android手把手,发布开源组件至 MavenCentral仓库

有时候,在我们写了一个组件想将之开源给更多人分享和使用时,就需要我们发布开源组件到公开的远程仓库,如 Jitpack、JenCenter 、 MavenCentral。其中,MavenCentral 是最流行的中央仓库,也是 Gradle 默认使用的仓库之一。这篇文章就介绍如何将自己的开源组件发布到MavenCentral仓库中;

2022-09-26 11:00:33 3444 1

原创 Android-AGP之手写你的第一款自定义plugin插件

在使用插件的module中,需要在build.gradle中添加apply plugin: '插件名称'因此需要给我们的自定义插件定义一个名称。如何定义插件名称?在src/main/resources/META-INF/gradle-plugins下面新建一个properties文件,文件名称就是我们的插件名称,比如monitor-plugin.properties,插件名称就是"monitor-plugin"。至此,自定义插件的过程就完了。

2022-09-25 21:05:08 1712

原创 域名转移:以腾讯云转至阿里云为例

但根据ICANN和CNNIC的规定,域名转移注册商必须将域名的到期日顺延一年,例如,域名原到期日为2016年8月1日,转入成功后,域名到期日为2017年8月1日。域名转入时,必须交纳一年的续费费用,即域名转入价格为域名续费一年的价格。我的是晚上提交的,10分钟不到就通过,还是在周末,在此表扬阿里云的效率!在域名管理页找到需要转出的域名,点击进入【域名信息】,翻到底部【域名转移】,如果是腾讯云账户之间的选择【域名过户】,如果是跨平台的,比如像我这样的需要转到阿里云的选择【转出域名】

2022-09-20 23:49:50 7307

原创 Android:利用sdk中的build-tools对包进行签名

apksigner.jar进行签名,文件目录一般在\Android\Sdk\build-tools\29.0.2\lib中,注意,只有24.0.3及更高版本才会有这个jar工具,这里会默认签v1、v2签名。Android9.0版本及以上会默认签v1、v2、v3签名。如果密钥库有多个别名,则需要指定别名,指定别名给apk签名:apksigner sign --ks keystoreFileAbsolutePath --ks-key-alias aliasName apkAbsolutePath。

2022-09-20 22:54:56 1463

原创 Android Gradle 7.x新版本的依赖结构变化

想使用旧的依旧可以在项目build.gradle里面按照原来方式添加,不影响旧方法。

2022-09-07 13:47:03 2688

原创 Lottie系列四:使用建议

可能大家会觉得使用位图会导致最终的json过大,Lottie落地失去意义与优势,下方表格是携程火车票最近上线的Lottie动效方案,大家可以从表格对比看出,就算使用位图方案,横向对比现有的解决方案,Lottie依然是优势巨大,原因便是其他方案1s有25帧图片,而Lottie整个动效的文件素材不过10几张,动效时间越长,lottie优势越明显。•推荐使用lottie_rawRes代替lottie_fileName,前者可以通过R使用对动画的静态引用,而不仅仅使用字符串名称;...

2022-07-21 15:11:18 1639

原创 Lottie系列三 :原理分析

扩展了ImageView,是加载Lottie动画的默认且最简单的方法。具有与LottieAnimationView相同的大部分API,但是您可以在任何您想要的视图上使用它。组合是动画的无状态模型表示。只要您需要,这个文件可以安全地缓存很长时间,并且可以在drawables/views之间自由地重用。允许您从许多输入创建LottieCompostionFactory。LottieAnimationView继承自ImageView,通过当前时间绘制canvas显示到界面上。这里有两个关键类。...

2022-07-21 15:10:27 1249

原创 Lottie系列二:高级属性

要理解如何在 Lottie 中更改动画属性,首先应了解动画属性是如何存储在 Lottie 中的。动画属性存储在一个数据树中,该数据树模仿 After effect 的信息层次结构。在后效果一个组合是一个图层的集合,每个图层都有自己的时间线。层对象有字符串名称,它们的内容可以是图像、形状图层、填充、笔画,或者几乎任何可绘制的内容。后效果中的每个对象都有一个名称。Lottie 可以使用 KeyPath 根据名称查找这些对象和属性。...

2022-07-18 17:10:50 2035

原创 Lottie系列一:介绍与使用

Lottie 是一个针对 Android、 iOS、 Web 和 Windows 的库,它可以解析 Adobe After effect 动画,并用 Bodymovin 导出为 json,然后在移动和网络上呈现它们!

2022-07-18 15:12:04 2187

原创 git 更改已commit的错误提交信息

amend命令可更改最后一次提交的注释信息:随后,进入vim命令行:vim操作:按 i,在#的最上方删掉错误的描述,然后重新输入注释。按 Esc 按钮退出编辑模式,按 :wq 键,保存并退出即可。

2022-06-27 00:01:51 1137

原创 ArrayMap浅记

key-value键值映射的数据结构,相比HashMap内存空间占用更少(内存管理效率高);Android提供了内存效率更高的ArrayMap,解决HashMap更占内存的弊端;**ArrayMap是Android专门针对内存优化而设计的,用于取代Java API中的HashMap数据结构。为了更进一步优化key是int类型的Map,Android再次提供效率更高的数据结构SparseArray,可避免自动装箱过程。对于key为其他类型则可使用ArrayMap。**HashMap的查找和插入时间复杂度为O(

2022-06-26 23:51:18 1377

转载 深度解读ArrayMap优势与缺陷

ArrayMap经典文章:深度解读ArrayMap优势与缺陷;在移动设备端内存资源很珍贵,HashMap为实现快速查询带来了很大内存的浪费。为此,2013年5月20日Google工程师Dianne Hackborn在Android系统源码中新增ArrayMap类,从Android源码中发现有不少提交专门把之前使用HashMap的地方改用ArrayMap,不仅如此,大量的应用开发者中广为使用。然后,你是否研究过这么广泛使用的基础数据结构存在缺陷?要回答这个问题,需要...

2022-06-26 23:49:08 658

原创 Flutter 开启web构建以及web的两种渲染模式

Flutter 开启web构建以及web的两种渲染模式~

2022-06-26 22:43:07 2263

原创 Android-页面点击事件拦截替换方案

在一些特定页面中,绝大部分的布局填充内容是复用的UI卡片(组件),这些卡片(组件)在≥2个页面中提现的点击事件可能会随着不同的页面而有不同的响应事件。在类似这种背景下,一些简单常规的做法:对不同的view中设置不同的点击事件;页面的差异化导致的点击事件的差异化可通过传参或内部判断的方式进行;上述做法潜在的问题是:在这种背景下,提出了一种白名单 + 点击事件拦截的方案,旨在对页面中view的点击事件做拦截,替换成目标事件,而对想保持原响应事件的view进行放过。主要源码可直接翻到最后。在view设置点击事件的

2022-06-12 19:13:34 1478

原创 Flutter异常:Exception in thread “main“ java.util.zip.ZipException: zip END header not found

新建的Android - Flutter项目,运行直接报错:Exception in thread "main" java.util.zip.ZipException: zip END header not found at java.base/java.util.zip.ZipFile$Source.zerror(ZipFile.java:1573) at java.base/java.util.zip.ZipFile$Source.findEND(ZipFile.java:1468) at

2022-04-06 23:54:46 10071 2

原创 Web前端下载文件的几种常见方式

1 标签or点击事件标签下载<a href="xxxxx">或<a href="xxxxx" download="xxxx">href:文件的绝对/相对地址download: 文件名(可省略,省略后浏览器自动识别源文件名)Tip:跨域情况下,不能下载浏览器可浏览的文件,例如图片。兼容性问题,老的浏览器不支持。不能进行鉴权。通过点击事件下载function download(url, fileName){ const a = document.

2022-03-27 00:10:35 5199

原创 华为云主机安全防护的新发现

最近打算上一个新app了,部署服务器的时候突然看到华为云的新用户还送1080(+432)的安全防护,这就简直了啊,当然,一般个人的可能用不到这个,除非对安全层面要求比较高。之前由于公司产品的业务性质,需要等保备案,当时愁的我前后端一手抓,检测报告上百个问题,直接把我整蒙逼了。。。光买阿里云的安全防护就得w起步。现在实行的网络安全等级保护制度,把保护对象分为五个级别,由一到五级别逐渐升高,每一个级别的要求存在差异,级别越高,要求越严格,三级等保已经是民营最高等级的防护认证了。现在想想,之前大学那会

2022-01-21 15:15:30 2433

原创 真懂?Retrofit完整剖析

文章目录使⽤示例实现原理接口的合规验证自定义api的动态代理如何创建的OKHttp如何解析返回结果返回的UI线程切换原理参考使⽤示例以下Retrofit解析版本库均为写作时的最新版本:2.9.0。先在安卓的构建文件中添加依赖: implementation 'com.squareup.retrofit2:retrofit:2.9.0'使用步骤:创建⼀个 interface 作为 Web Service 的请求集合,在⾥⾯⽤注解(Annotation)写⼊需要配置的请求⽅法public i

2021-12-22 13:34:21 2035 7

原创 OkHttp源码剖析(五) 代理路由

OkHttp源码剖析(一) 初识okhttpOkHttp源码剖析(二) 设计模式下的okhttpOkHttp源码剖析(三) 任务调度器DispatcherOkHttp源码剖析(四) 报文读写工具ExchangeCodecOkHttp源码剖析(五) 代理路由缘起:需要一个connection由前面几章知识可知,拦截器ConnectInterceptor会经过ExchangeFinder.findConnection(), private fun findConnection(...): Rea

2021-10-24 15:28:10 3687

原创 技术/研发经理介绍和创业的一些感想

技术/研发经理介绍和创业的一些感想国庆过后,最终还是做出了决定,告别兄弟们,离开这家呆了两年多的创业公司。作为最早期的核心人员,我经历了公司项目从零搭建,上线,迭代,最终作为某国家级考试指定平台的整个历程。不过老实说,公司过的并不好,几轮融资的失败,原始股东信心的逐渐下降,资金始终是最头大的问题。作为技术,融资不是我们所能左右的,但是回顾过去,还是想记录一些学习到的知识,主要是对技术经理这个职位的介绍,以及我的经历和感想,希望和大家交流。技术经理、技术总监、CTO首先可能还是有人不清楚技术经理、技术总

2021-10-11 20:46:53 4107 5

原创 java中的IO、NIO、Okio

java IO写这种写方法只能一个字节一个字节的写;注意把要关闭的流写在try括号中,省去了代码中finally关闭的过程,以下例子均是。private static void ioWrite() { try (OutputStream outputStream = new FileOutputStream("./demo.txt")) { outputStream.write('a'); outputStream.write('b'); } catch (F

2021-10-10 17:48:17 652

原创 OkHttp源码剖析(四) 报文读写工具ExchangeCodec

概念明确codeccodec是网络报文交互的读写工具。用途:encode HTTP 请求,decode HTTP 响应 。codec通过健康连接创立,它不仅包含编码接码算法,也包含可用的健康连接,只需要往codec写东西就可以发请求,向codec读东西可以拿到返回的报文信息。ExchangeExchange 是网络报文交互的读写管理员,内部调用 codec去进行读写操作。传送一个 HTTP 请求和响应对,该层连接管理和 ExchangeCodec(实际处理 I/O) 的事件。源码分析获取c

2021-10-07 17:30:51 417

原创 Android热更新详解

一 前言介绍正好最近又看到热更新,对以前Android 热修复核心原理:ClassLoader类加载机制做了点补充。从16年开始开始,热修复技术开始在安卓界流行,它以classloader类加载机制为核心,可以不发布新版本就修复线上 bug ,让线上版本有能力去进行全量或者增量更新。常见的思路有两种:类加载方案,即 dex 插桩。该方案以腾讯系为主,包括微信的 Tinker、饿了么的 Amigo;底层替换,即修改替换 ArtMethod。方案以阿里系的 AndFix 等为主;本文主

2021-09-21 14:51:05 8994 13

原创 java中的多线程:线程使用、线程安全、线程通信

Java中的多线程使用Thread: Thread thread = new Thread() { @Override public void run() { System.out.println("Thread started!"); } }; thread.start();Thread类的几个常用的方法:sleep():静态方法,使当前线程睡眠一段时间;currentThread():静态方法,返回对当前正在执行的线程对象的引用;sta

2021-09-13 21:38:07 307 1

原创 LRU算法的今生前世&LruCache在Android中的实现

操作系统中的起源缓存文件置换机制现代语言的很多特性都可以在操作系统中找到最初的原型,LRU我们最早也可以在操作系统中找到当初的设计。“高速缓存是计算机科学中唯一重要的思想” -Bill Joy我们知道,无论是内存还是硬盘,又或者是我们在各自应用中用到的cache,由于大小固定,因而总会面临空间不足,而需要进行缓存置换(or替换),而替换的原则被我们称为缓存文件置换机制。而今天聊得主题就是:最近最少未使用算法(LRU),即最久没有访问的内容作为替换对象。页面置换算法操作系统中,我

2021-09-07 13:47:49 1890 3

原创 OkHttp源码剖析(三) 任务调度器Dispatcher

DispatcherOkHttp 对异步请求的线程池主要依赖Dispatcher来实现。Dispatcher是用于调度后台发起的网络请求的调度器, 有后台总请求数和单主机总请求数的控制。每个Dispatcher调度器都有一个 ExecutorService, 通过java excutor实现,在内部运行调用,用于真正执行call。分析一下Dispatcher的几个参数:maxRequests最大请求数:64maxRequestsPerHost 每个 host 最大请求:5readyAsync

2021-09-02 10:16:36 1340

原创 Android EditText使得输入默认两位小数

val textWatcher: TextWatcher = object : TextWatcher { override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { var s = s if (s.toString().contains(

2021-08-26 15:46:50 1925

神经网络预测天气的气温数据集

神经网络预测天气的气温数据集,包括了:year,moth,day,week分别表示的具体的时间;temp_2:前天的最高温度值;temp_1:昨天的最高温度值;average:在历史中,每年这一天的平均最高温度值;actual:这就是我们的标签值了,当天的真实最高温度;friend:这列用不到暂不用管

2020-08-12

大傻串口调试软件5.0

大傻串口调试软件5.0

2016-06-12

CH340驱动(USB串口驱动)_XP_WIN7共用

CH340驱动(USB串口驱动)_XP_WIN7共用

2016-06-12

汉字取模软件

汉字取模软件

2016-06-12

第9天资料 大作业串口接收打印多行 并且有二维码打印n行

第9天资料 大作业串口接收打印多行 并且有二维码打印n行

2016-06-12

第4天作业答案.按键控制吐纸

第4天作业答案.按键控制吐纸

2016-06-12

exg10.第5天作业答案.按键打印多个汉字

exg10.第5天作业答案.按键打印多个汉字

2016-06-12

STM32 -步进电机控制程序

STM32 -步进电机控制程序,用keil5进行开发。

2016-06-12

STM32中文参考手册_V10

本文档是依据STM32 Reference Manual (RM0008)翻译的,已经与2009年6月的英文第9版(Doc ID 13902 Rev 9)进行了全面校对,更正了不少以前版本的错误。

2016-06-12

stm32固件库v3.5建工程_信盈达20160512

软件环境: 1. 安装 Keil uVision5 MDK 软件到电脑上。 2. 安装 J-link 调试下载器驱动到电脑上。 3. 下载 STM32-V3.5 的固件库,论坛上很多。

2016-06-12

车库管理系统C源码-基于s5pc100

项目名称:智能停车系统 平台:arm soc:s5pc100 os: linux 知识点:c, linux, 进程,线程,网络,数据库, arm, 驱动

2016-05-27

微信index文件

直接复制到服务器上微信关注就可,是微信公众号服务开发实验的基本原始源码之一。

2015-03-15

空空如也

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

TA关注的人

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