原创 LiveData異常後不走回調

前言:測試大佬突然發現頁面上有一塊UI在某些情況下無內容展示,但是接口有下發對應字段。這種偶現的bug就很頭禿了,排查一波也沒發現啥異常,就是個簡單的接口請求,然後在LiveData回調中更新UI。這樣看來問題出在LiveData了?正好本

原创 性能優化小結

工欲善其事,必先利其器。要想做好優化,首先得知道APP線上的各種數據,不管是自己擼還是接入其它家開源的,先得有個數。 啓動優化 SDK的初始化說的比較多的就是異步加載,懶加載。異步加載的話將一些非主線程初始化的任務通過線程池,Cou

原创 ASM圖片監控hook glide

ASM學習思路承接上篇,對照字節碼CV asm api確實很舒服,慢慢的也能理解一些字節碼,雖然不可能一下完全喫透,但是沒關係,邊學邊搜索。畢竟對於我這種菜雞來說寫代碼就是熟能生巧的過程。 擼個經典demo監控圖片大小,這裏就以Glide爲

原创 Android枚舉字段序列化

實體類實現Parcelable接口後枚舉字段該怎麼寫?正好碰到這個問題,記錄一下。 枚舉類 public enum EnumBean { STEAM, EPIC } 枚舉字段序列化,這裏直接上寫法。實際上用了AS插件And

原创 手寫插件化

插件化技術也就是說用戶只需安裝宿主apk,其它業務模塊打包成獨立的插件apk動態下發,然後通過宿主app加載運行。其天然的就解決了部分包體積大小的問題,畢竟只需將核心業務模塊打包到宿主app,隨之附帶的還有插件apk的熱更新能力,通過網絡可

原创 手寫插件化二

接上篇手寫插件化,文末放demo鏈接。 上篇擼完了四大組件之Activity,成功加載插件Activity並運行。但是後續發現修改宿主APP資源爲插件資源,然後調用宿主Activity的setContentView()設置佈局時會引發一個b

原创 ASM給方法加try catch

期望通過註解的形式,給方法套上try catch。老樣子,先看一下try catch的字節碼。 CatchUtil public class CatchUtil { private void handle() { t

原创 ASM統一線程池

ASM學習思路 ASM圖片監控hook glide 寫了幾個demo之後感覺稍微有點悟了,繼續肝它! 統一項目中的線程池,Executors封裝的幾個線程池比較好操作,就以此爲切入點了。閒話不多說,開始擼。 幾個靜態方法ThreadUtil

原创 ASM學習思路

關於AOP、Plugin、Transform的概念,大家都捲到這個份上了,就不再細說了。擼個經典的demo,方法耗時檢測,提供一下學習思路。相信按照下面這個流程走下來,肯定是能入門了,畢竟我都能學會。 進入正題,說實話直接用asm api織

原创 ASM踩坑之hook glide

ASM學習思路承接上篇,對照字節碼CV asm api確實很舒服,慢慢的也能理解一些字節碼,雖然不可能一下完全喫透,但是沒關係,邊學邊搜索。畢竟對於我這種菜雞來說寫代碼就是熟能生巧的過程。 擼個經典demo監控圖片大小,這裏就以Glide爲

原创 APP架構的一些思考

aar/source 一般來說組件化項目中都會做aar和源碼切換,開發同學正在進行的業務module需依賴源碼,其它的不相干的模塊依賴遠程aar。大概會先定義一個全局變量做aar/source切換的開關,然後在app中進行依賴。 modul

原创 Android 異步UI之二

前面寫了下Android異步UI,簡單來說就是在子線程中通過WindowManager.addView()的方式創建UI,那麼UI的繪製流程就執行在這個子線程中。又衆所周知ViewRootImpl.checkThread()檢查更新UI的線

原创 Java AQS 自定義同步類

分析完了AQS原理,下面藉助AQS實現一個同步類,然後用這個同步類寫一下經典的三個線程循環打印。就決定叫它BLock。 對於BLock而言只需要對外提供兩個方法lock()、unlock(),那麼AQS的具體實現可以模仿ReentrantL

原创 Gradle Plugin

自定義gradle插件,三種創建方式: build.gradle buildSrc plugin module build.gradle app.build.gradle中直接編寫 apply plugin: AppPlugin cla

原创 Android 2021面經分享

喜馬拉雅一面: 類加載機制 android中有哪些ClassLoader 設計一個線程池 設計一個方法耗時檢測框架 重構Module流程 Handler、Binder ANR處理、內存泄漏 Service的理解 單Activity下Frag