背景和目的

  1. 有很多应用在运行时,只能在特定的兼容模式下才能正常运行。因此设计一种通用型的兼容性设置框架。方便framework读取用户配置值,从而决定是否启用兼容性配置特性。

 操作流程设计

  1. 在编译过程中,接受json或其他格式文档编写的兼容性配置列表,在系统启动时,将这个表写入到settings数据库。如果后期检查发现这个文件变化了,需要在settings表中删除不需要的item,增加新增的item。专业术语是对数据库作migrate

  2. 点击左下角fde按钮->弹出所有应用的列表;右击一个应用->弹出右键列表->点击兼容性配置item→弹出全局的兼容性配置列表

  3. 用户勾选具体配置项, launcher 将用户勾选的设置写入到settings 数据库表。

  4. framework具体某个api的hook位置读取这个settings表。用于决定是否为应用作特殊配置。

数据库表设计

  1. 包含两张表
    COMPATIBLE_LIST 存储所有配置表,数据从xml中读取
    CREATE TABLE COMPATIBLE_LIST ( _ID INTEGER PRIMARY KEY AUTOINCREMENT," + "KEY_CODE TEXT ,KEY_DESC TEXT ,DEFAULT_VALUE TEXT ,OPTION_JSON TEXT, NOTES TEXT,INPUT_TYPE TEXT,CREATE_DATE TEXT, UNIQUE( KEY_CODE));

    COMPATIBLE_VALUE 存储各个包名对应的配置项
    CREATE TABLE COMPATIBLE_VALUE ( _ID INTEGER PRIMARY KEY AUTOINCREMENT," + "PACKAGE_NAME TEXT ,KEY_CODE TEXT ,VALUE TEXT , NOTES TEXT,EDIT_DATE TEXT,FIELDS1 TEXT,FIELDS2 TEXT, UNIQUE(PACKAGE_NAME, KEY_CODE));

功能实现 

 xml 存放地址 assets/comp_config.xml。格式:

1<compatible> 2 <keycode>size</keycode> 3 <keydesc>分辨率</keydesc> 4 <defaultvalue>1</defaultvalue> 5 <inputtype>select</inputtype> 6 <optionjson>[{ 7 "width": "1920", 8 "height": "1080" 9 }, 10 { 11 "width": "800", 12 "height": "600" 13 }, { 14 "width": "400", 15 "height": "320" 16 } 17 ]</optionjson> 18</compatible>

其中inputtype 目前支持两种方式 input 和 select 具体可参考demo   (可参考com.boringdroid.systemui.ui.CompatibleListActivity)

编译项目

https://gitee.com/openfde/boringdroidsystemui.git
分支xudq
然后拉取framework代码 fde_w 分支
工具类 com.android.internal.util.CompatibleConfig 提供 CURD COMPATIBLE_LIST 和 COMPATIBLE_VALUE 方法。

运行

通过开机广播会自动读取xml到database。