背景和目的
有很多应用在运行时,只能在特定的兼容模式下才能正常运行。因此设计一种通用型的兼容性设置框架。方便framework读取用户配置值,从而决定是否启用兼容性配置特性。
操作流程设计
在编译过程中,接受json或其他格式文档编写的兼容性配置列表,在系统启动时,将这个表写入到settings数据库。如果后期检查发现这个文件变化了,需要在settings表中删除不需要的item,增加新增的item。专业术语是对数据库作migrate
点击左下角fde按钮->弹出所有应用的列表;右击一个应用->弹出右键列表->点击兼容性配置item→弹出全局的兼容性配置列表
用户勾选具体配置项, launcher 将用户勾选的设置写入到settings 数据库表。
framework具体某个api的hook位置读取这个settings表。用于决定是否为应用作特殊配置。
数据库表设计
包含两张表
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。格式:
<compatible>
<keycode>size</keycode>
<keydesc>分辨率</keydesc>
<defaultvalue>1</defaultvalue>
<inputtype>select</inputtype>
<optionjson>[{
"width": "1920",
"height": "1080"
},
{
"width": "800",
"height": "600"
}, {
"width": "400",
"height": "320"
}
]</optionjson>
</compatible>其中inputtype 目前支持两种方式 input 和 select 具体可参考demo (可参考com.boringdroid.systemui.ui.CompatibleListActivity)
编译项目
分支xudq
然后拉取framework代码 fde_w 分支
工具类 com.android.internal.util.CompatibleConfig 提供 CURD COMPATIBLE_LIST 和 COMPATIBLE_VALUE 方法。
运行
通过开机广播会自动读取xml到database。