Skip to content

基于 Android Gradle Plugin Transform API 的 Android SPI 实现方案。

License

Notifications You must be signed in to change notification settings

yanglw/android-spi

Repository files navigation

Android SPI

这是一个类似于 Java SPI 的库,用于支持获取目标实现类。与原生的 Java SPI 不同的是,本库没有使用文件的方式获取目标实现类,而是通过 Android Gradle Plugin Transform API ,在代码编译阶段手动注册相关目标实现类。

由于实现的机制和 Java SPI 有区别,因此 Java SPI 中 ServiceLoader 类的功能并不完全相同,一些 API 也无法支持,仅仅实现了基本的 iterator() 方法。

使用方式

本库已经上传至 jcenter 仓库中,添加 jcenter 仓库便可以通过远程依赖的方式使用本库了。

GitHub release

allprojects {
    repositories {
        jcenter()
    }
}
  1. 对于提供 Service 的项目,需要依赖 android-spi-annotation :

    implementation 'me.yanglw:android-spi-annotation:(last-version)'

    所谓的 Service 其实就是一个声明功能的接口类,这个接口类的名称、方法没有任何要求。

    例如:

    public interface SayService {
        void say(String text);
    }

    接口类只是功能的定义,还需要一个具体的实现类,这个类需要添加 ServiceProvider 注解。

    import me.yanglw.android.spi.ServicePorvider;
    
    @ServieProvider(services={SayService.class})
    public class SayServiceImpl implements SayService {
        public void say(String text) {
            System.out.println(text);
        }
    }

    ServiceProvider 注解用于声明 Service 的实现类的,它有三个属性:

    1. services 类型:Class[] ,用于标识 Service 列表。
    2. priorities 类型:int[] ,用于标识 services 对应位置上的 Service 的优先级,数值越大优先级越高。数组的长度将跟随 services 的长度。若数组的长度超过 services 的长度,则丢弃多余的部分;若数组的长度少于 services 的长度,则补充长度,且默认值为 0 。
    3. singleton 类型:boolean ,用于标识当前实现类是否需要实现单例。
  2. 对于使用 Service 的项目,需要依赖 android-spi-loader :

    implementation 'me.yanglw:android-spi-loader:(last-version)'

    为应用项目添加 buildscript 依赖:

    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'me.yanglw:android-spi-compiler:(last-version)'
        }
    }

    引入 me.yanglw.android.spi 插件:

    apply plugin: 'me.yanglw.android.spi'

    通过 ServiceLoader 获取目标 Service :

    ServiceLoader<SayService> loader = ServiceLoader.load(SayService.class);
    for(SayService service : loader) {
        service.say("hello");
    }

    注意:

    me.yanglw.android.spi 插件仅支持 com.android.application 不支持 com.android.library 。这说明,你无法在 Library 项目中使用这个插件。

Demo

License

Copyright 2013 Liangwei Yang

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

基于 Android Gradle Plugin Transform API 的 Android SPI 实现方案。

Resources

License

Stars

Watchers

Forks

Packages

No packages published