AndroidApplication优化解耦

作者: 半只温柔 | 来源:发表于2018-10-11 12:28 被阅读31次

    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<AppDelegate>
    dispatcher 任务,WeakHandler + ScheduledThreadPool
    SharePreference 缓存 优化性能
    资源释放

    感谢:)

    相关文章

      网友评论

        本文标题:AndroidApplication优化解耦

        本文链接:https://www.haomeiwen.com/subject/iwnvaftx.html