AndroidApplication優化解耦
Application後處理器(AndroidPostProcessing): 通過註解配置初始化各模組及應用所需 sdk,按優先順序/延時時間/是否只在Debug下有效/執行執行緒 等條件初始化 sdk
通常,我們要在 Application 中處理一堆的三方 SDK 和自定義框架的初始化,下面的處理方式會帶來一些問題:
維護成本,應用啟動慢、卡頓,實現方式 low 。
@Override public void onCreate() { super.onCreate(); mContext = getApplicationContext(); mHandler = new Handler(); // screen info registerScreenActionReceiver(); // UserCenterManager AccountManager.init(); // 初始化配置 ConfigManager.init(this); // token initToken(); // 友盟 MobclickAgent.init(); // Log LogUtils.init(BuildConfig.DEBUG); // ShareSdk ShareSDK.initSDK(mContext); // 信鴿推送 XGPushConfig.init(this); // Bugly if(!BuildConfig.DEBUG){ initBugly(); } // 判斷程式是否在前臺 registerActivityLifecycleCallbacks(this); }
AndroidPostProcessing
Application 的後處理器,利用編譯期註解方式,指定執行緒和任務延時策略處理初始化的問題。
ofollow,noindex">專案地址 和 demo

postprocessing.gif
使用方式:
引入AndroidPostProcessing和註解處理器,已經上傳maven :)
project/build.gradle
allprojects { repositories { ... maven { url"https://dl.bintray.com/woaigmz/AndroidPostProcessing" } } }
common-lib 模組:
api 'com.woaigmz.app:postprocessing:0.0.1' api 'com.woaigmz.app:postprocessing-annotation:0.0.1' //如果 common 模組需要用 @App 註解 annotationProcessor 'com.woaigmz.app:postprocessing-compiler:0.0.1'
其他子模組:
implementation project(':common') annotationProcessor 'com.woaigmz.app:postprocessing-compiler:0.0.1'
1:Application:
public class App extends Application { @Override public void onCreate() { super.onCreate(); AndroidPostProcessing.initialization(this).dispatcher(); } @Override public void onTerminate() { super.onTerminate(); AndroidPostProcessing.release(); } }
2:各處理模組:
① 代理類實現 IApp 介面,類名隨意;
② 類頭部加 @App() 註解
@Retention(RetentionPolicy.CLASS) @Target(ElementType.TYPE) public @interface App { boolean RELEASE = false; boolean DEBUG = true; String name() default "Main";//名稱 boolean type() default RELEASE;//release起作用還是debug時起作用 int priority() default 0;//優先順序 - 執行順序 boolean async() default false;//是否非同步,默認同步,在主執行緒執行 long delay() default 0;//延時時間,預設為0,不延時執行 }
注意:
① 關於多程序:每個程序都會 onCreate() onTerminate() ,初始化時的任務表,所以互不影響,資源釋放也不受影響。該庫預設所有程序都存在,如果要有主程序庫,可以 onCreate 新增判斷條件
② 關於除錯: ctrl + shif t + F ,全域性搜尋 @App ,每個 IApp 介面對應的物件可以單獨 hugo 出執行時間
③ 關於 async ,預設主執行緒,如果為true則執行在子執行緒,執行緒優先順序為 background
eg:
hotfix:
@App(name = "Hotfix", priority = 3) public class HotfixProxy implements IApp { @Override public void dispatcher(@NonNull Application application) { Toast.makeText(application, "Hotfix", Toast.LENGTH_SHORT).show(); } }
cache:
@App(name = "Cache", priority = 2, async = true, delay = 2000) public class CacheProxy implements IApp { @Override public void dispatcher(@NonNull Application application) { Looper.prepare(); Toast.makeText(application, "cache", Toast.LENGTH_SHORT).show(); Looper.loop(); } }
leakcanary:
@App(name = "LeakCanary", type = App.DEBUG, priority = 1, delay = 5000) public class LeakCanaryProxy implements IApp { @Override public void dispatcher(@NonNull Application application) { Toast.makeText(application, "LeakCanary", Toast.LENGTH_SHORT).show(); } }
實現思路:
① 註解部分:編譯生成的中間代理類,都在 com.woaiqw.generate 包下
package com.woaiqw.generate; /** * Generated code from AndroidPostProcessing . Do not modify! */ public final class LeakCanary$$Proxy{ public static final String path = "com.woaiqw.common.LeakCanaryProxy"; public static final String name = "LeakCanary"; public static final boolean type = true; public static final int priority = 1; public static final boolean async = false; public static final long delay = 5000; }
② 註解處理器AbstractProcessor:
AppProcessor③ AndroidPostProcessing 的api
初始化註解生成的代理類,按 priority 生成代理列表List<AppDelegate>
dispatcher 任務,WeakHandler + ScheduledThreadPool
SharePreference 快取 優化效能
資源釋放
感謝:)