- 背景
- 代码接入
- 修改配置项
- 删除配置项
- 退出应用
背景
平常开发中,我总是遇到需要临时修改或者调整 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");
上面的一段代码向我们展示了如何获取一个配置项,此配置项的 key
是 text
。readString()
方法的返回结果就是配置项里面的值,如果没有做过配置项,那么就返回默认值。
为了方便大家使用,封装了下面的几个方法供大家来读取配置项的值,这几个方法分别是:
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
命令可以模拟发送广播。所以理论上应该是比较好用的。
即我们接收到指定格式的广播后,对广播做解析,然后把解析到的数据保存下来。下次启动应用的时候,当需要读取配置项的时候,我们就去读取保存的数据并返回。
下面我们说下如何发送广播,并介绍下广播的格式。
首先是 Action
,Action
是固定的,格式是 包名 + TYPE
。TYPE
有 3
种,分别为 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”
这个广播的意思是把全局配置组里的 toast
和 text
删除 。
- 删除局部配置项
下面写一个具体的例子来说明:
adb shell am broadcast -a “xxx.xxx.REMOVE” –es partial “main_config@toast,text”
这个广播的意思是把名称为 main_config
的配置表里的 toast
和 text
删除。
退出应用
退出应用的话,可以使用下面的广播
adb shell am broadcast -a “xxx.xxx.EXIT”
其中, xxx.xxx是当前应用包名。