• 背景
  • 代码接入
  • 修改配置项
  • 删除配置项
  • 退出应用


背景

平常开发中,我总是遇到需要临时修改或者调整 app 里面的一些参数,然后看看不同参数带来的
效果。

比如,某个动画,稍微有些生硬,需要微调下时间。某个效果,需要对比打开或者关闭时候的最终效果来决定采用哪种方案。

在一开始的时候,我是通过手动找到代码修改点,然后修改这个代码里面的值,然后重新编译、安装,然后查看效果。

我发现这个效率是极其低下的。于是想了一个方法来解决这个问题。提高自己的效率。于是有个这个库。所以这个库主要解决的就是这类问题,主要的原理就是通过发广播来动态修改一些配置项,而不用重新去编译、安装。

以下是这个库计划完成的功能:

  • [x] 修改全局或者局部配置项
  • [x] 删除某个全局或者局部配置项
  • [x] 退出应用

代码可以点击 (源码)[https://github.com/XanderWang/ConfigX] 查看

代码接入

– gradle 接入

在你的根 build.gradle 添加下面的内容

allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }

在你的 app/build.gradle 添加下面的依赖

dependencies {
            implementation 'com.github.XanderWang:ConfigX:1.0.0'
    }
  • 初始化
// 初始化
ConfigX.init(this);

在使用这个库之前,是需要初始化的,初始化做的事情不是很复杂,主要就是动态注册了一个广播。用来接收 adb shell 或者其他方式发送过来的广播

  • 声明一组配置项

首先,需要说明的是,在 ConfigX 里有一个配置项的概念,可以理解为一个键值对。通过键,你可以拿到这个配置项的值。然后配置项是以组来管理的。然后某个配置项,我称之为局部配置表,简称局部配置。你可以使用下面的代码来声明一组配置项,即一个局部配置表。

ConfigHolder mainConfig = new ConfigHolder("main_config");

上面的这句代码就声明了一组名为 main_config 的配置项。

有时候,你的配置项可能不多,也可能是很多地方都需要用到这个配置项,这个时候,你可以把这个配置项放到全局配置表里面。全局配置表的目的就是为了方便大家更简便使用 ConfigX

ConfigX.global()

上面的这行代码就会返回一个全局配置表,然后你就可以随意使用了。

  • 读取配置项

声明完了之后,就可以使用了。你可以通过 readXXX(key,defaultValue) 方法来获取你需要的配置项的值。eg:

mainConfig.readString("text", "Text");

上面的一段代码向我们展示了如何获取一个配置项,此配置项的 keytextreadString() 方法的返回结果就是配置项里面的值,如果没有做过配置项,那么就返回默认值。

为了方便大家使用,封装了下面的几个方法供大家来读取配置项的值,这几个方法分别是:

fun readString(key: String, defaultValue: String): String
fun readInt(key: String, defaultValue: Int): Int
fun readLong(key: String, defaultValue: Long): Long
fun readFloat(key: String, defaultValue: Float): Float
fun readBoolean(key: String, defaultValue: Boolean): Boolean
fun readChar(key: String, defaultValue: Char): Char

修改配置项

上面展示了如何使用,现在我们说下如何在不修改源码的前提下修改某个配置项,这个也是这个库要解决的问题。

前面其实提到了广播,这个库的原理其实很简单,就是使用广播,注册一个广播接收器,接收到了指定的 action 的广播后,解析这个广播携带的参数,然后按照定义好的规则来修改配置项的值。

另外 adb shell 命令可以模拟发送广播。所以理论上应该是比较好用的。

即我们接收到指定格式的广播后,对广播做解析,然后把解析到的数据保存下来。下次启动应用的时候,当需要读取配置项的时候,我们就去读取保存的数据并返回。

下面我们说下如何发送广播,并介绍下广播的格式。

首先是 ActionAction 是固定的,格式是 包名 + TYPETYPE3 种,分别为 CHANGE(修改) REMOVE(删除) EXIT(退出应用)
"xxx.xxx.CHANGE"

然后是广播携带的数据。

携带的数据的话,分 2 种,前面其实提到了全局配置和局部局部配置。所以携带的数据格式其实是分 2 种的。

  • 全局配置表的数据格式

首先是数据 的 key , 可以是 global 或者 g
然后是配置项,首先我们用 , 来隔开各个配置项,然后每个配置项里面的键值对用 : 隔开。

下面写一个具体的例子来说明:

adb shell am broadcast -a “xxx.xxx.CHANGE” –es global “toast:Global Toast”

这个广播的意思是把全局配置组里的 “toast” 值修改为 “Global Toast” 。

  • 局部配置表的数据格式

首先是数据 的 key , 可以是 partial 或者 p
然后是配置项,首先我们用 @ 来隔开局部配置表名称和此次需要修改的配置项。因为局部配置表可能有多个,所以需要一个局部配置表名称来找到这个局部配置表。
然后,用 , 来隔开此次需要修改的配置项各个配置项,然后每个配置项里面的键值对用 : 隔开。

下面写一个具体的例子来说明:

adb shell am broadcast -a “xxx.xxx.CHANGE” –es partial “main_config@toast:Partial Toast,text:Partial Text”

这个广播的意思是把名称为 main_config 的配置组里的 toast 值修改为 "Partial Toast"text 的值修改为 "Partial Text"

删除配置项

删除的话,整体和修改配置项类似。也分为局部和全局。不同的是,删除配置项的时候只需要知道配置项的键局可以了。

  • 删除全局配置项

下面写一个具体的例子来说明:

adb shell am broadcast -a “xxx.xxx.REMOVE” –es global “toast,text”

这个广播的意思是把全局配置组里的 toasttext 删除 。

  • 删除局部配置项

下面写一个具体的例子来说明:

adb shell am broadcast -a “xxx.xxx.REMOVE” –es partial “main_config@toast,text”

这个广播的意思是把名称为 main_config 的配置表里的 toasttext 删除。

退出应用

退出应用的话,可以使用下面的广播

adb shell am broadcast -a “xxx.xxx.EXIT”

其中, xxx.xxx是当前应用包名。