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 的後處理器,利用編譯期註解方式,指定線程和任務延時策略處理初始化的問題。
項目地址 和 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
dispatcher 任務,WeakHandler + ScheduledThreadPool
SharePreference 緩存 優化性能
資源釋放

感謝:)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章