当前位置:   article > 正文

Dagger2在SystemUI中的应用,深入浅出Android性能调优_systemui dagger

systemui dagger

只要保证这个注解标记的 Component 在 App 进程中为单例的,并且得到正确的实现(被正确的标记到 类构造器 或 Module 中的 @Provides 标记的方法),那么它对应生成的类实例就是 单例的。

SystemUI中的dagger2使用

AppComponentFactory

SystemUI的application标签定义了一个appComponentFactory属性

<application

android:appComponentFactory=“.SystemUIAppComponentFactory”>

AppComponentFactory用于控制manifest清单文件里的组件的初始化

developer.android.com/reference/a…

在manifest清单文件里的组件构建对象时会调用这些方法

47cebae4-ee7e-4966-9c64-52b4eccb02a5.png

SystemUIFactory

src/com/android/systemui/SystemUIAppComponentFactory.java

public Application instantiateApplicationCompat(
@NonNull ClassLoader cl, @NonNull String className)
throws InstantiationException, IllegalAccessException, ClassNotFoundException {
Application app = super.instantiateApplicationCompat(cl, className);
if (app instanceof ContextInitializer) {
((ContextInitializer) app).setContextAvailableCallback(
context -> {
SystemUIFactory.createFromConfig(context);
SystemUIFactory.getInstance().getSysUIComponent().inject(
SystemUIAppComponentFactory.this);
}
);
}

return app;
}

在SystemUIApplication onCreate时回调 ContextAvailableCallback, 构建SystemUIFactory,并对它进行初始化

src/com/android/systemui/SystemUIFactory.java

public static void createFromConfig(Context context, boolean fromTest) {
if (mFactory != null) {
return;
}

final String clsName = context.getString(R.string.config_systemUIFactoryComponent);
if (clsName == null || clsName.length() == 0) {
throw new RuntimeException(“No SystemUIFactory component configured”);
}

try {
Class<?> cls = null;
cls = context.getClassLoader().loadClass(clsName);
// 创建SystemUIFactory实例
mFactory = (SystemUIFactory) cls.newInstance();
// 初始化SystemUIFactory
mFactory.init(context, fromTest);
} catch (Throwable t) {
Log.w(TAG, "Error creating SystemUIFactory component: " + clsName, t);
throw new RuntimeException(t);
}
}

public void init(Context context, boolean fromTest)
throws ExecutionException, InterruptedException {

// 获取dagger组件
mRootComponent = buildGlobalRootComponent(context);

// 获取systemui的dagger组件
// And finally, retrieve whatever SysUI needs from WMShell and build SysUI.
SysUIComponent.Builder builder = mRootComponent.getSysUIComponent();
mSysUIComponent = builder.build();

// 构建Dependency实例并初始化
// Every other part of our codebase currently relies on Dependency, so we
// really need to ensure the Dependency gets initialized early on.
Dependency dependency = mSysUIComponent.createDependency();
dependency.start();
}

protected GlobalRootComponent buildGlobalRootComponent(Context context) {
return DaggerGlobalRootComponent.builder()
.context(context)
.build();
}

Dependency组件使用@Lazy标签懒加载: 首先构建LazyDependencyCreator放入mProviders,然后在真正使用dependency时调用createDependency进行创建

src/com/android/systemui/Dependency.java

private final ArrayMap<Object, Object> mDependencies = new ArrayMap<>();
private final ArrayMap<Object, LazyDependencyCreator> mProviders = new ArrayMap<>();

@Inject Lazy mActivityStarter;
@Inject Lazy mBroadcastDispatcher;
@Inject Lazy mAsyncSensorManager;
@Inject Lazy mBluetoothController;

protected void start() {
// 构建LazyDependencyCreator放入mProviders
mProviders.put(TIME_TICK_HANDLER, mTimeTickHandler::get);
mProviders.put(BG_LOOPER, mBgLooper::get);
mProviders.put(MAIN_LOOPER, mMainLooper::get);
mProviders.put(MAIN_HANDLER, mMainHandler::get);
mProviders.put(MAIN_EXECUTOR, mMainExecutor::get);
mProviders.put(BACKGROUND_EXECUTOR, mBackgroundExecutor::get);
mProviders.put(ActivityStarter.class, mActivityStarter::get);
mProviders.put(BroadcastDispatcher.class, mBroadcastDispatcher::get);

// 获取dependency
private synchronized T getDependencyInner(Object key) {
@SuppressWarnings(“unchecked”)
T obj = (T) mDependencies.get(key);
if (obj == null) {
// 若未创建则创建
obj = createDependency(key);
mDependencies.put(key, obj);

}
return obj;
}

public T createDependency(Object cls) {
Preconditions.checkArgument(cls instanceof DependencyKey<?> || cls instanceof Class<?>);

@SuppressWarnings(“unchecked”)
LazyDependencyCreator provider = mProviders.get(cls);
if (provider == null) {
throw new IllegalArgumentException("Unsupported dependency " + cls

  • “. " + mProviders.size() + " providers known.”);
    }

// 这里调用的就是lazy.get()
return provider.createDependency();
}

private interface LazyDependencyCreator {
T createDependency();
}

ContextComponentResolver

Application创建好之后SystemUI的主Service将启动起来,并逐个启动其他Service。

src/com/android/systemui/SystemUIService.java

public void onCreate() {
super.onCreate();
// Start all of SystemUI
((SystemUIApplication) getApplication()).startServicesIfNeeded();

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

最后

考虑到文章的篇幅问题,我把这些问题和答案以及我多年面试所遇到的问题和一些面试资料做成了PDF文档,如果有需要的朋友可以私信我【面试】免费领取

点击这里领取Android面试资料汇总

些面试资料做成了PDF文档,如果有需要的朋友可以私信我【面试】免费领取

点击这里领取Android面试资料汇总

[外链图片转存中…(img-GQH3e1Qx-1710833780277)]

[外链图片转存中…(img-IWZWoJjc-1710833780278)]

喜欢的朋友可以关注、转发、点赞 感谢!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/830499
推荐阅读
相关标签
  

闽ICP备14008679号