LeakCanary 内存泄漏检测原理
前言
内存泄漏是一个开发不得不面对的问题,在 Android 中有许多工具都可以用来检测内存泄漏,比如:MAT、Profile等。
但是这些工具都需要手动操作,比较麻烦,所以我们需要一个能够自动检测的工具,它就是LeakCanary。
今天就来了解一下原理,毕竟面试也是常问的问题。
性能提高之JNI 缓存
前言
在 JNI
中如果需要调用 Java
的方法,首先需要使用 FindClass
获取到 jclass
,然后使用 GetMethodID
获取到对应方法的 ID
,字段也是一样的要使用 GetFieldID
来获取。
如果每次都要查找一遍,是比较麻烦和耗时的,今天就来研究一下怎么把它们缓存起来以提高性能。
JNI 局部引用释放
前言
有过 JNI
开发经历的都知道,在创建局部引用之后要释放。可是我们经常却直接返回 env->NewStringUTF("")
到 Java
没有释放,并且不会有问题,本文就来研究一下局部引用的释放问题。
折腾RIME输入法
前言
市面上那么多输入法为什么还要折腾一个新的输入法?
许多年前有爆出输入法泄漏隐私的问题,一些数据没有经过加密传输。
这些想想都让人后怕。经过一段时间的摸索,逐步上手了 RIME
,因为 RIME
并不是那么容易上手,所以我把摸索的一些经验写成文章,希望能帮助到想使用 RIME
的伙伴。
对比Rust引用与C++引用
前言
最近在学习 Rust
, Rust
中也有引用,这让我有点好奇 Rust
的引用是不是与 C++
一样,于是便有了此文。
Emacs中的Postman
前言
在日常开发中,经常需要调试服务端返回的数据,我们常用的有 Postman
、 PostWoman
等等。
但是我习惯了在 Emacs
中做完这一切,不想去安装其他软件,于是在 Emacs
中也找到了 restclient
这个插件,它能满足我的需求。
所以今天要来分享一下 restclient
的使用。
Gin 实现上传/下载服务
前言
在上一篇文章go实现文件上传/下载服务中讲到了自己实现一个文件上传服务,然而我发现gin-gonic/gin: Gin is a HTTP web framework written in Go (Golang).也默认提供了文件上传服务。
本文就来看看 Gin
中的文件上传服务。
创建项目
|
|
我们创建一个 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
是近几年特别火的语言,之前学过几次,每次学完之后就不了了之,没有实际用到项目中。
所以每次学习的时候都感觉像是最熟悉的陌生人,所以最近想要在移动端进行实战,于是开始了折腾之旅,这篇就是 Rust
在 iOS
上的探索。
CocoaPods 安装
前言
今天来说一下 CocoaPods
的安装。
CocoaPods
是用来管理 iOS
开发中用到的第三方库,类似安卓中的 Gradle
、 Maven
的工具。
在 iOS
的开发中会经常用到,对我这样的 iOS
新手,一段时间不用,不免遗忘,所以用来记录一下,以后查找起来方便。
C++ 与 OC
前言
最近在研究 Cronet
网络库,涉及到 Android
和 iOS
,由于对 OC
不怎么熟悉,所以在使用的时候碰到了 C++
与 OC
互相调用的问题,于是便有了此文。
Cronet for iOS
Git 清理 fetch 失败占用的磁盘空间
最近在下载 chromium
源码,下载完之后需要切换到指定的分支,这时候使用 git fetch
进行切换,但是不是一次就能成功。
所以需要不断执行 git fetch
,但是随着执行的次数增多,我发现磁盘的空间却越来越少。
也就是 git fetch
失败后占用了磁盘空间并没有释放。
在查找资料后发现使用 git prune
可以解决这个问题。
git prune
会删除没有使用的 hash
文件,由于我们这边 fetch
失败了,所以这些文件是没有使用的。
执行之后磁盘瞬间释放70G空间。
Android Cronet 构建
前言
Cronet
是 Chromium
浏览器中用于网络请求的库,支持 HTTP1/2
、 SPDY
、 QUIC
等协议。并且还支持移动端。
需要注意的是编译 Android
需要在 Linux
下进行,并且只支持 Ubuntu
和 Debian
的发行版,其它的不支持。
GDB调试
前言
gdb
是 GNU
下的一款调试器,支持常见的语言,例如 C/C++
、 Go
、 Rust
等等。
调试器对我们开发程序的时候有非常大的帮助,是每一个开发都需要学会的调试技能。
今天来了解一下 gdb
的使用。
使用Forge管理GitHub Issue
前言
在Emacs中使用Forge管理GitHub Pull Request中,我聊到了在 Emacs
中使用 Forge
管理 GitHub Pull Request
,今天来讲一讲怎么管理 GitHub Issue
。
使用
使用之前需要配置 GitHub
相关信息,在Emacs中使用Forge管理GitHub Pull Request中有说过,不了解的可以前往查看,这里不再赘述。
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
。