自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

梁超杰

不积跬步无以至千里

  • 博客(286)
  • 资源 (5)
  • 收藏
  • 关注

原创 CSDN去广告插件

如果这篇博客被CSDN相关工作人员审核到,请你转告你们产品或者商务主管庞大的程序员群体不是你们这些无耻商人的待宰羔羊用csdn快3年了吧,写了200多篇博客,刚开始用的时候充满了期待,觉得这是一个能记录我成长的平台但是随着广告的无孔不入我开始慢慢怀疑CSDN是不是下一个视觉中国!侵权不去保护,广告肆意展示,联合百度的大数据分析和广告的投放,让很多程序员感觉得到了恶心!我们不反对你们盈利但...

2019-04-28 22:57:13 1026 1

原创 Mac反编译APK

https://github.com/pxb1988/dex2jar/releases/ 官方Github介绍&下载地址。

2024-04-01 23:36:52 1128

原创 谈谈我对Gson源码的理解

fill:#333;GsonBoundFieldfromJson()可能存在递归调用栈溢出的地方getBoundFields() 获取该类所有字段createBoundField() 每个字段去找自己的getAdapter()read()construct() 反射创建对象遍历每个字段调用 read() 赋值每个BoundField对应的TypeAdapter处理 read()GsonBoundField注意蓝色区域, 这里有可能存在递归调用的风险, 我们来举例说明。

2024-02-25 22:01:29 945

原创 记一次 Android CPU高使用率排查

测试同学反馈我们的App CPU使用率 90% 居高不下,经过一番艰难的排查后定位到了问题,为了记录此次过程于是有了此博客的构思,但为了避免隐私泄露,本文使用的是demo工程,但是排查思路完全一致。我们发现 com.demo.app CPU占用率竟然高达 93.3%, 对应的 pid 是 29337。先找1中CPU使用率异常的时刻和对应的线程名, 再找 2中对应时刻的堆栈。如果CPU在某段时间较高但是之后就下降了就不好排查了, 不过也有笨方法。根据 Thread-2 线程名匹配到了 对应的 堆栈信息。

2024-02-02 19:47:18 729

原创 Kotlin学习第1篇——data class

在学习之前带着问题往往能够收获颇丰。

2024-01-15 23:26:20 542

原创 他山之石(2)—— Timber 如何实现默认打tag的

在使用Timber的时候发现了一些体验较好的地方,逐一分析下是怎么实现的。打印如下: 这个MainActivity是如何打印出来的呢?普通打印, 需要输入tag。

2024-01-15 00:30:38 453

原创 DiffUtil + RecyclerView 在 Kotlin中的使用

很惭愧, 做了多年的Android开发还没有使用过DiffUtil这样解放双手的工具。

2023-12-18 23:34:21 1159

原创 Mac 搭建本地服务器

三篇文章基本上标题内容都完全一致,以防丢失都放在这里了。我在这里新增了一个1.txt 文件。如下图所示即为成功!

2023-11-27 22:55:32 1106

原创 【开发问题记录】01—大量数据同时插入数据库导致的时间戳重复问题

也可以从数据库的查询上考虑如何解决: 时间戳相同的情况下,如何自定义返回顺序。这个我还没有研究明白,欢迎大家补充。推荐指数 5颗星 ⭐️⭐️⭐️⭐️⭐️。

2023-07-30 23:33:55 413

原创 Java基础361问第15问——线程安全的方法

提到线程安全想必大家并不陌生,但是为什么真正项目中遇到多线程问题的时候却很棘手?很大一部分原因是我们只学理论走马观花看了几篇博客背了几个面试点就以为自己掌握了,Talk is Cheap, Show me the code!因此这篇文章我会结合具体的代码介绍几种线程安全的方法和注意事项,希望能给你一个清晰地印象。我们以火车售票场景为例,假如有两个窗口同时卖票,代码如下System . out . println(name + "售票成功!还剩 " +(-- tickets) + " 张票~");

2023-03-20 22:47:59 478 1

原创 写给Android开发者的SQL教程

SQL(Structured Query Language)是一种用于管理关系型数据库的标准化语言。在关系型数据库中,数据以表格形式存储,这些表格之间通过关系进行连接,使得数据之间的关系和结构非常清晰易于管理大部分人把数据库和SQL混为一谈其实是错误的, SQL只是对应的关系型数据库, 那么有哪些关系型数据库呢?SQLite:一个轻量级的开源关系型数据库管理系统,支持多种平台和操作系统,适用于嵌入式设备和移动应用程序。(Android 采用的就是SQLite数据库)

2023-03-15 22:48:28 593

原创 谈谈我对Retrofit源码的理解

square/retrofit Github地址 最新版本从这里获取!Retrofit 是一款由 Square 公司开发的用于 Android 和 Java 应用程序的网络请求库,旨在简化 HTTP 网络请求的过程,Retrofit 最初是在 2013 年开源发布的,已经风靡了10年。其优点如下简化网络请求的过程:Retrofit 可以根据 API 接口定义文件自动生成网络请求代码,从而避免了手动创建网络请求代码的繁琐工作。方便处理网络请求。

2023-03-05 23:00:50 374

原创 Docker 极简入门1——安装与运行

Docker的基本使用介绍

2023-02-20 23:51:19 141

原创 Java基础361问14问——为什么非静态内部类会默认持有外部类的引用?

在内存泄露问题排查中最常遇到就是 【非静态内部类默认持有外部类的引用】

2023-02-19 15:14:19 509

原创 三分钟学习 Gitee OpenAPI

简单说就是网络请求Open API 让我们可以通过网络请求的方式对 Git仓库的分支,提交,仓库,标签,PR,issue等属性进行操作。

2023-02-13 23:03:52 879 1

原创 Git 合并多条commit

按照上述操作继续编辑合并后的commit信息,再然后ESC, :wq保存即可。选中要修改的commit 右击选择Squash Commits。(这里稍微提一下, commit大本营,骚操作都在这里)键盘敲击 “I” 进入编辑模式, 把pick 改为 s。点击"ESC"退出编辑模式, 再输入 “:wq” 保存。

2023-01-12 22:00:51 3183 2

原创 开发利器! 利用Android Studio抓包

使用App请求网络会发现NetWork Inspector上有蓝色折线图4,鼠标选中这个区域后会发现5,点击5会出现6。整个过程不用1min,看图懵逼的话不如去自己亲身试验一下,非常好用的功能!最近新学了一个技能 —— Android Studio 本身就可以抓包。按照下图123操作, App运行起来后attch上。

2022-12-27 21:14:46 1486 1

原创 Dot Executable: /usr/bin/dot File does not exist Cannot find Graphviz.

PlantUML Integration 或者 PlantUML Parser 使用过程中报错如下

2022-12-12 22:03:16 1155 1

原创 少走弯路 → PlantUML网站推荐

PlantUML

2022-12-07 23:19:46 3066 2

原创 Gradle学习第一篇——自定义Gradle插件

自定义Gradle插件有三种方法,各有优劣处就是如此简单,但是缺点是这个插件只能在这个build script使用,完全无复用的能力,其他Module要是想用的话必须拷贝一份在当前目录下创建buildSrc目录,创建完毕之后Sync一下build.gradle 中复制如下代码配置完成去App中运行测试一下这种稍微麻烦点,但是可以做到同项目内plugin复用了。这个和第二种有些地方是类似的首先创建一个Library Module剩下的步骤和 Mac搭建本地Maven仓库For Andr

2022-12-05 22:38:34 858

原创 git修改Commit信息

通过学习修改Git Commit进一步学习vim编辑

2022-11-12 00:03:36 144

原创 结束北漂 , 我来合肥啦~

结束北漂啦

2022-10-31 23:04:20 308 2

原创 聊一聊HashSet

坦白讲, 开发了多年Android但是我基本上没有用到过HashSet,不如看下其源码希望以后有需求打过来的时候可以考虑用这种数据结构实现。文章目录1 HashSet本质上是什么呢? 集合2 HashSet 集合的特点是什么? 去重 && 无序3 HashSet 如何获取某个元素的呢? Iterator4 HashSet 使用中需要注意哪些问题?4.1 引用数据类型记得重写hashCode和equals方法4.2 想保证线程安全使用这段代码1 HashSet本质上是什么呢? 集合

2022-05-22 21:39:45 297

原创 Mac环境下生成 Protobuf Java文件

协议缓冲区是一种语言无关、平台无关的可扩展机制,用于序列化结构化数据。https://developers.google.com/protocol-buffers因为传输的是二进制数据流体积更小速度更快,协议轻便但是如何能对应上我们的使用Java Dart Go语言呢?文章目录1 安装protoc 命令2 新建 lbs_locations.proto3 执行命令1 安装protoc 命令brew install protoc2 新建 lbs_locations.protosyntax = "

2022-05-17 00:09:57 873

原创 Mac环境 使用 bsdiff 和 bspatch 生成补丁包

bsdiff and bspatch are libraries for building and applying patches to binary files.bsdiff and bspatch 是两个合成补丁包的C开源库,具体的地址见下方https://github.com/mendsley/bsdiff文章目录1 Mac 配置 bs环境2 生成 1.txt 和 2.txt 的 补丁包3 根据补丁包patch 和 1.txt 合成 2.txt1 Mac 配置 bs环境➜ ~ bre.

2022-05-15 00:09:19 433

原创 写段代码理解 scheduleAtFixedRate和scheduleWithFixedDelay

① 如果任务在周期内正常结束掉的话scheduleAtFixedRate和scheduleWithFixedDelay没有差别public void start() { ScheduledExecutorService pool = Executors .newScheduledThreadPool(1); System.out.println("this task startTime "); pool.scheduleAtF

2022-05-07 23:49:53 319

原创 BUG exception in phase ‘semantic analysis‘ in source unit ‘_BuildScript_‘ Unsupported class file ma

错误原因是因为你本地的java版本太高了~cd /Library/Java/JavaVirtualMachinesopen .把高版本的java 版本删除掉即可~

2022-03-02 08:46:50 12643 1

原创 Rxjava线程切换原理终于在2023年有了答案。

虽然项目中有用到Rxjava但是从来没有花功夫研究过所以对这里一直是懵逼状态,面试的时候也是很恐惧这方面的提问,但是Rxjava线程切换原理一直是面试必问的问题,与其心存侥幸不如直面恐惧,到了2022年,终于对这个问题有了一个完整的理解,如有理解偏差,还请指出。// 本次源码分析基于rxjava 3.0 // 使用最新的rxjava版本看这里 https://github.com/ReactiveX/RxAndroiddependencies { implementation 'io.re

2022-01-03 23:17:01 1835 1

原创 【registerActivityLifecycleCallbacks】它是如何实现Acitivity页面变化监听的?

当我们想监听App页面变化(比如打开了哪个页面,关闭了哪个页面)的时候我们会使用registerActivityLifecycleCallbacks就像下面的代码一样。public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(new Acti

2021-10-10 11:33:38 243

原创 2021国庆所感

最近好久没有更新博客了,一来是工作太忙,二来也是我开始懈怠,学习劲头不高,三来也是家庭遭遇了一些变故导致没有时间和精力学习新技术。本来今年国庆节准备好好放个假去我对象家里掰玉米,但是我家突遭变故打乱了这些计划,且听我一一道来2021年8月15日 我叔叔(我爷爷的大哥的小儿子) 因病去世 (我因为在北京上班没有参与后事)2021年10月1日 C2173 因为买不到从北京直达聊城的火车,开始中转 北京南(23:56) → 天津(00:26)2021年10月2日 K128 天津

2021-10-08 17:33:13 120

原创 Flutter学习第九篇之 本地Flutter版本切换

在我们开发Flutter的时候肯定会遇到版本切换的问题,例如下图AB两个项目分别使用不同的Flutter版本,那我们本地运行项目的时候就需要在1.17和2.5.1之间来回切换。官方有一个Flutter Version Management命令行控制工具 感兴趣的同学可以用用,我本期要分享的是最笨的但是也是最纯净(不需要下载其他软件,不需要安装其他工具)的方法。// 1 进入你本地的Flutter SDK目录cd /Users/liangchaojie/Documents/flutter/

2021-09-25 18:21:51 4188 4

原创 Flutter学习第八篇之StatelessWidget和StatefulWidget

文章目录一图胜千言,多看几遍,印象会深刻

2021-09-02 22:41:27 106

原创 Mac Android系统源码下载

打开这个repo文件, 替换REPO_URL为清华大学的镜像文件。等到100%就说明系统源码下载完了。

2021-08-27 21:41:22 361

原创 从命令行看Android系统启动过程

需要 Root 设备或者 使用 Android Studio 7.0以下系统的模拟器adb shellinit进程是Android系统的第一个进程root@generic_x86_64:/ # ps | grep "zygote"root 1316 1 1265640 63732 poll_sched 7f7e294bb74a S zygote64root 1317 1 1253768 53252 poll_sched 00f7351420 S z.

2021-08-22 16:58:46 192

原创 【Flutter源码学习】Dart和Android通信原理

本篇源码分析基于以下环境[✓] Flutter (Channel stable, 2.2.3, on macOS 11.4 20F71 darwin-x64, locale zh-Hans-CN) • Flutter version 2.2.3 at /Users/liangchaojie/Documents/flutter • Framework revision f4abaa0735 (6 weeks ago), 2021-07-01 12:46:11 -0700 •

2021-08-14 18:10:05 291

原创 Mac+Charles+Android+Https 抓包

感谢 Android端Charles抓包 这篇分享,大体都是按照这个套路来想抓别人的App就必须使用Android 7.0以下的手机,抓自己的可以使用高版本系统手机文章目录1 下载破解版版本Charles2 Charles代理设置2.1 Proxy → Proxy Settings2.2 配置 Https2.3 查看本机iP地址3 手机和电脑连到同一个Wifi 设置手动代理4 使用Android 7.0 以下系统的手机 按照上面的配置就可以正常抓到Https请求了,但是如果我们没有Android

2021-08-13 23:23:48 976 3

原创 聊聊 Looper中的 用户态、内核态、IO多路复用

做Android开发的小伙伴一定都熟悉Android的消息循环机制(Looper MessageQueue Handler), 相信也一定知道Looper是一个死循环,循环中 MessageQueue 不停地去拿消息处理,如果拿不到就阻塞当前主线程执行,下面重温一下这块的代码Looper.javapublic static void loop() { //... 省略无关代码 for (;;) { // 这里我把官方注释放这里了,next方法执行过程中可能会发生阻塞

2021-08-08 23:15:25 401

原创 Android Studio中如何全局搜索字节码中的内容?

文章目录1 我们的使用痛点是什么?2 我们为什么需要查看class文件中的内容呢?3 写代码把aar拷贝到目标文件夹中4 命令行查看具体的内容1 我们的使用痛点是什么?当我们使用Android Studio 搜索 MainActivity 的时候可以查到内容,好像看起来很方便?但是如果关键字在class文件中,那么就搜索不到了。2 我们为什么需要查看class文件中的内容呢?我们App上线之后发现用户使用流量猛增,使用各种统计手段发现程序大量创建一个名为 “xxx” (因为避免涉密不具体贴出

2021-06-26 22:08:53 1179 3

原创 操作系统——精髓与设计原理(第九版)

一直觉得自己计算机基础薄弱,买了本书看,打打基础, 这篇博客不是把书中的内容做一个总结,而是分享自己看书过程中的心得和体会。文章目录1 芯片?处理器?CPU?1 芯片?处理器?CPU?

2021-06-20 18:06:21 4148 1

原创 Android 居中圆角矩形 Loading框

相信项目中大家多多少少都会用到Loading框,用来优化一些体验网上找了很多demo但是 要么有的太复杂,要么有的不满意,最后还是自己决定写一个吧。文章目录1 UI效果2 源代码2.1 MsLoadingDialog.java2.2 MainActivity.java2.3 R.style.LoadingDialog2.4 icon_loading_ing.png icon_loading_success.png1 UI效果2 源代码2.1 MsLoadingDialog.javapu

2021-05-15 17:10:12 578 4

channelApk.zip

下载这个channelApk 文件夹,然后将release apk拷贝进src_apk文件下并命名,随后执行buildChannels.sh脚本,等待一会就可以看到output中就是你的渠道包文件啦。

2019-08-13

Android实现快速发送电子邮件

最近有朋友有需求是通过apk发送邮件,我心想这怎么可以实现?然后就研究了一番,最后得出结论是可行的! 确实可以自己的手机上定义主题和内容或者附件,然后发送给对应的邮箱!详细步骤倾听我一一道来

2018-10-31

android扫码登录

Android 快速实现扫描识别二维码(即扫码登录功能) 扫码登录现在很流行,淘宝,京东,熊猫直播各大网站都有扫码登录功能,其实呢对于客户端来说扫码登录很简单,因为难点都集中在了前端身上,我简单讲下扫码登录的流程:

2018-10-27

通讯录字母列表索引

相信大家对这个列表字母索引已经不陌生了,在很多app中也随处可见,像没团的城市地址选择,微信联系人列表,手机通讯录…等等。既然是个这么nb这么实用的功能我们怎么能不Get到来呢,下面就让我们一起造一个出来吧

2018-02-26

CheckUtils

判断用户输入的字符串是不是身份证号,邮编号,手机号,银行卡号和日期

2016-12-30

空空如也

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

TA关注的人

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