一、前言
SystemUI结构复杂,模块数量众多,最重要的是SystemUI属于常驻进程是一个系统的门面,且不能自升级,如果定制功能对主项目做复杂的修改,首先会造成适配压力,如果对主框架不甚理解,有可能会造成很多隐藏的Bug,且不易修复,一旦崩溃对整个系统的影响很大,那么怎么才能在不修改主结构的基础上定制我们自己的功能呢?
Google的SystemUI团队对该模块做了插件化的功能,可以动态实现对SystemUI的修改,一方面在一定程度上解决了不能自升级造成的问题,另一方面也解决了定制功能和原生主框架的解耦,再者,即便使用Plugin实现的功能crash了,也不影响SystemUI的运行,保证了稳定性。所以SystemUI Plugin机制在运行稳定性、代码健壮性、项目兼容性等方面都是很好的选择!
SystemUI插件提供了一种快速替换SystemUI原有组件的方法,可以在运行时更改SystemUI的行为。
如果只是调试可以试着这个项目:SystemUI Tuner - 打造个性化的安卓系统界面
GitHub - zacharee/Tweaker
本文是基于System UI原生,不是SystemUI Tuner项目。
二、SystemUI代码组成介绍
SystemUI plugin的代码结构主要由以下几部分组成:
plugin:包含具体的插件实现,如ExamplePlugin,以及其他如FalsingPlugin、VolumePlugin、NotificationPlugin等插件实例。这些插件以接口的形式提供支持。
plugin_core:插件的核心部分,主要负责实现一些必要的接口,以便插件能够与SystemUI进行交互。
share:包含插件的管理类、版本信息等共享资源。
4.systemui内部,systemui就是plugin插件的调用方
三、插件开发准备步骤
1.生成插件开发依赖库,
使用Plugin之前我们需要编译出
SystemUIPlugin库
,在asop源码目录下执行命令。
make SystemUIPluginLib
2.生成库路径
所生成的库,可以在下面的目录中找到,每个人的设备名称不太一样,可以根据自己的设备名称查找,但都位于out目录下
out/target/product/emulator_sdk_x86_64/obj/JAVA_LIBRARIES/SystemUIPluginLib_intermediates/javalib.jar
3.生成系统签名文件
具体步骤可以查看我的另一篇文章
Android 制作系统签名-CSDN博客
四、创建一个项目
1.使用Android开发工具创建一个项目工程
建工程跟平时开发app一样没有区别,记得引入需要的开发库即可
2.引入刚才生成的库
3.引入系统签名文件
4.开发插件
4.1 插件java代码
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Rect;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.Toast;
import com.android.systemui.plugins.OverlayPlugin;
import com.android.systemui.plugins.annotations.Requires;
import com.example.myapplication.R;
@Requires(target = OverlayPlugin.class, version = OverlayPlugin.VERSION)
public class SampleOverlayPlugin implements OverlayPlugin {
private static final String TAG = "SampleOverlayPlugin";
private Context mPluginContext;
private View mStatusBarView;
private View mNavBarView;
private boolean mInputSetup;
private boolean mCollapseDesired;
private float mStatusBarHeight;
@Override
public void onCreate(Context sysuiContext, Context pluginContext) {
Log.d(TAG, "onCreate");
mPluginContext = pluginContext;
}
@Override
public void onDestroy() {
if (mInputSetup) {
mStatusBarView.getViewTreeObserver().removeOnGlobalLayoutListener(
onComputeIn
版权归原作者 人民的石头 所有, 如有侵权,请联系我们删除。