0


SystemUI plugin 开发

一、前言

    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的代码结构主要由以下几部分组成:

  1. plugin:包含具体的插件实现,如ExamplePlugin,以及其他如FalsingPlugin、VolumePlugin、NotificationPlugin等插件实例。这些插件以接口的形式提供支持。

  2. plugin_core:插件的核心部分,主要负责实现一些必要的接口,以便插件能够与SystemUI进行交互。

  3. 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

本文转载自: https://blog.csdn.net/shi450561200/article/details/140408013
版权归原作者 人民的石头 所有, 如有侵权,请联系我们删除。

“SystemUI plugin 开发”的评论:

还没有评论