LeakCanary 内存泄漏检测原理

前言

内存泄漏是一个开发不得不面对的问题,在 Android 中有许多工具都可以用来检测内存泄漏,比如:MAT、Profile等。

但是这些工具都需要手动操作,比较麻烦,所以我们需要一个能够自动检测的工具,它就是LeakCanary

今天就来了解一下原理,毕竟面试也是常问的问题。

性能提高之JNI 缓存

前言

JNI 中如果需要调用 Java 的方法,首先需要使用 FindClass 获取到 jclass ,然后使用 GetMethodID 获取到对应方法的 ID ,字段也是一样的要使用 GetFieldID 来获取。

如果每次都要查找一遍,是比较麻烦和耗时的,今天就来研究一下怎么把它们缓存起来以提高性能。

JNI 局部引用释放

前言

有过 JNI 开发经历的都知道,在创建局部引用之后要释放。可是我们经常却直接返回 env->NewStringUTF("")Java 没有释放,并且不会有问题,本文就来研究一下局部引用的释放问题。

折腾RIME输入法

前言

市面上那么多输入法为什么还要折腾一个新的输入法?

许多年前有爆出输入法泄漏隐私的问题,一些数据没有经过加密传输。

这些想想都让人后怕。经过一段时间的摸索,逐步上手了 RIME ,因为 RIME 并不是那么容易上手,所以我把摸索的一些经验写成文章,希望能帮助到想使用 RIME 的伙伴。

Emacs中的Postman

前言

在日常开发中,经常需要调试服务端返回的数据,我们常用的有 PostmanPostWoman 等等。

但是我习惯了在 Emacs 中做完这一切,不想去安装其他软件,于是在 Emacs 中也找到了 restclient 这个插件,它能满足我的需求。

所以今天要来分享一下 restclient 的使用。

Gin 实现上传/下载服务

前言

在上一篇文章go实现文件上传/下载服务中讲到了自己实现一个文件上传服务,然而我发现gin-gonic/gin: Gin is a HTTP web framework written in Go (Golang).也默认提供了文件上传服务。

本文就来看看 Gin 中的文件上传服务。

创建项目

1
2
3
4
mkdir ginupload && cd ginupload
go mod init ginupload
go get -u github.com/gin-gonic/gin
touch main.go

我们创建一个 ginupload 的目录用来存放代码,并且使用 go mod 来管理依赖。

go实现文件上传/下载服务

前言

在开发的过程中,难免会碰到上传/下载文件的场景。如果这个功能服务端没开发好,就没法进行测试。

所以每次都要自己先实现一遍,本文使用 go 写了一个简单的文件上传和下载服务。

以后再碰到这种场景的时候就可以快速进行开发。

Rust For Android

前言

继上一篇用 Rust 开发 iOS 开发折腾之后,我又折腾起 Android 了。

最开始我是先从 Android 上下手的,不过一直没成功,直到最近才成功了。

本文默认你已经把 Rust 安装好了。注意需要使用 stable channel ,我之前使用的是 nightly 所以一直失败。

nightly channel 会报 dl_iterate_phdr can't find 错误,这个错误一直误导了我,我一直以为是链接上的问题,所以折腾了很久。

直到我换了一台电脑试了一下,居然成功了,才发现使用的 channel 是不一样的。

用 Rust 开发 iOS

前言

Rust 是近几年特别火的语言,之前学过几次,每次学完之后就不了了之,没有实际用到项目中。

所以每次学习的时候都感觉像是最熟悉的陌生人,所以最近想要在移动端进行实战,于是开始了折腾之旅,这篇就是 RustiOS 上的探索。

CocoaPods 安装

前言

今天来说一下 CocoaPods 的安装。

CocoaPods 是用来管理 iOS 开发中用到的第三方库,类似安卓中的 GradleMaven 的工具。

iOS 的开发中会经常用到,对我这样的 iOS 新手,一段时间不用,不免遗忘,所以用来记录一下,以后查找起来方便。

C++ 与 OC

前言

最近在研究 Cronet 网络库,涉及到 AndroidiOS ,由于对 OC 不怎么熟悉,所以在使用的时候碰到了 C++OC 互相调用的问题,于是便有了此文。

Git 清理 fetch 失败占用的磁盘空间

最近在下载 chromium 源码,下载完之后需要切换到指定的分支,这时候使用 git fetch 进行切换,但是不是一次就能成功。

所以需要不断执行 git fetch ,但是随着执行的次数增多,我发现磁盘的空间却越来越少。

也就是 git fetch 失败后占用了磁盘空间并没有释放。

在查找资料后发现使用 git prune 可以解决这个问题。

git prune 会删除没有使用的 hash 文件,由于我们这边 fetch 失败了,所以这些文件是没有使用的。

执行之后磁盘瞬间释放70G空间。

Android Cronet 构建

前言

CronetChromium 浏览器中用于网络请求的库,支持 HTTP1/2SPDYQUIC 等协议。并且还支持移动端。

需要注意的是编译 Android 需要在 Linux 下进行,并且只支持 UbuntuDebian 的发行版,其它的不支持。

GDB调试

前言

gdbGNU 下的一款调试器,支持常见的语言,例如 C/C++GoRust 等等。

调试器对我们开发程序的时候有非常大的帮助,是每一个开发都需要学会的调试技能。

今天来了解一下 gdb 的使用。

Emacs中使用Forge管理GitHub Pull Request

前言

使用 GitHub 与其他开发者合作需要频繁的创建 Pull Request 或者 Review 别人提交的 Pull Request

自从我使用 Emacs 来管理 Git 仓库后一直用的很舒服,但是这也仅限于自己的仓库。创建 Pull Reqeust 也是用的网页,这样的操作体验就不一致了,需要在 Emacs 和浏览器来回切换。

于是我搜索一圈发现在 Emacs 里可以使用 Forge 来创建 Pull Request ,所以本文会描述如何在 Emacs 中使用 Forge 来管理 GitHub Pull Request

cout打印uint8_t

前言

最近在调试的时候使用 cout 打印 uint8_t 类型数据,结果却什么都没有打印出来,一直以为程序有问题,调试了半天发现 cout 会使用 char 类型来打印 uint8_t