原创 TDD - 測試驅動開發

TDD是什麼 TDD是測試驅動開發,是敏捷開發中的一項核心實踐和技術,TDD的原理是在開發功能代碼之前,先編寫單元測試用例代碼,測試代碼確定產品的需求。 TDD的原則 ① 沒有失敗的測試就不能寫代碼 ② 只寫恰好讓測試通過的代碼

原创 記一次Fragment引起的血案

Fragment引起的血案 前幾天遇到一個很奇怪的問題,主頁Fragment的onResume中的接口,存在偶現的頻繁刷接口的現象。 看上去代碼一切正常,我們也重現不出來,但是線上就是存在刷接口的現象,被我們運維頻頻吐槽。 在百思

原创 Android Zygote進程啓動過程

Zygote是由init進程啓動的。 而在Android系統中,Dalvik/ART虛擬機、應用程序進程以及運行系統的關鍵服務的SystemServer進程都是由Zygote進程(孵化器)來創建的。 Zygote進程的啓動過程 i

原创 Android SystemServer啓動過程

SystemServer進程主要用於創建系統服務,我們熟知的AMS、WMS和PMS都是由它創建的。 SystemServer由Zygote進程啓動,具體在ZygoteInit.java的forkSystemServer方法中for

原创 Android 10 讀寫 外置存儲無效

如果targetSdkVersion爲29,並且測試手機爲Android 10,那麼會發現,就算申請了存儲權限,讀寫外置存儲依舊是無效的。 這是因爲Google 針對 Android 10,對存儲權限進行了進一步的限制,每個App

原创 Android 微信高性能日誌存儲庫Xlog的使用

XLog是什麼 騰訊開源的Mars項目中有個XLOG日誌庫。 XLog是一個高性能文本存儲方案,在真實環境中經受了微信數億級別的考驗,具有很好的穩定性。 由於其是使用C語言來實現的,故有佔用性能、內存小,存儲速度快等優點, 支持多

原创 GIF格式說明

一個GIF有如下幾塊 (其中,虛線的框表示可選,可有可無的) 接下來,通過下面這個簡單的的GIF,可以看到其對應的字節。 這些字節對應的意思如下,可結合原文進行理解: What’s In A GIF - Bit by Byte

原创 NDK env->FindClass源碼解析

在NDK中,我們通過env->FindClass來查找一個Java類,接下來,來看一下FindClass內部邏輯。 env->FindClass實際會調用jni_internal.cc#FindClass 來看art/runtim

原创 Android虛擬機的啓動 源碼分析

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java#main()是怎麼執行的 ? 這需要從虛擬機啓動的執行開始說起。 虛擬機啓動的入口從framewo

原创 Android Mars XLog的編譯

由於官方文檔關於編譯部分文檔較少,摸索了半天終於編譯成功。 所以本文記錄下windows下編譯Mars需要的配置,環境是windows10 64位。 安裝Python2.7.12 首先,我們下載Python2.7.12 然後驗證P

原创 Android AnimatedVectorDrawable 動畫

AnimatedVectorDrawable可以將SVG變爲動畫 先在drawable目錄下新建 <vector xmlns:android="http://schemas.android.com/apk/res/android"

原创 NDK env->GetStaticMethodID源碼解析

在NDK中,我們通過env->GetStaticMethodID來查找一個靜態方法,那返回值jmethodID到底是什麼了? 接下來,來看一下GetStaticMethodID內部邏輯。 env->GetStaticMethodI

原创 ObjectAnimators 自定義屬性 Property

ObjectAnimators可以自定義一些屬性,使這個屬性可以在項目中共用。 比如,我們需要逐漸改變字體大小,我們就可以自定義一個屬性 Property<TextView, Float> PROPERTY_TEXT_SIZE =

原创 Android 中的字體大小適配

Android系統中可以設置字體大小,對於一些設置了特大號字體的設備,往往會出現佈局錯亂的情況,對此,需要做相關的字體大小適配。根據聊聊 Android 中的字體大小適配這篇博客提供的方案,進行了一些改進,找到了一種比較合適的方式

原创 Kotlin 自帶的Builder模式

Kotlin自帶Builder模式,再也不用像Java中,寫那麼多代碼了,必須點贊 !!! 接下來我們來看下如何使用。 方式一 首先,我們新建一個類 class Person { var name = "" var