Android OTA升级更新SettingsProvider值修改默认输入法

发布于:2025-07-12 ⋅ 阅读:(40) ⋅ 点赞:(0)


OTA升级后,是不会升级SettingsProvider的值的,比如新版本更改了默认输入法,如果不在代码中做处理,升级后是不会生效的,还是旧版本的输入法。

切换默认输入法原理

Android输入法切换可以在 设置-系统-语言和输入法 中手动选择调整,如下图
在这里插入图片描述
以下是2个与输入法相关的配置及adb查看指令

adb shell settings list secure default_input_method
default_input_method=com.baidu.input/com.baidu.input.ImeService

adb shell settings list secure enabled_input_methods
enabled_input_methods=com.baidu.input/com.baidu.input.ImeService

可以知道当前默认输入法是百度输入法。当在设置中打开搜狗输入法并设置为默认输入法后,观察其值变化

default_input_method=com.sogou.ime.wear/com.sohu.inputmethod.sogou.ime.SogouIMS
enabled_input_methods=com.sogou.ime.wear/com.sohu.inputmethod.sogou.ime.SogouIMS

所以只要修改default_input_method,enabled_input_methods这两个Settings.Secure中的值就可以切换默认输入法。

Settings.Secure中的值存放在/data/system/users/0/settings_secure.xml
Android11此文件未加密,打开是明码,Android12是经过处理的打开是乱码。

OTA升级过程修改默认输入法

一、输入法配置

frameworks/base/packages/SettingsProvider/res/values/defaults.xml

<string name="config_default_input_method" translatable="false">com.baidu.input/com.baidu.input.ImeService</string>
<string name="config_enabled_input_method" translatable="false">com.baidu.input/com.baidu.input.ImeService</string>

修改为

<string name="config_default_input_method" translatable="false">com.sogou.ime.wear/com.sohu.inputmethod.sogou.ime.SogouIMS</string>
<string name="config_enabled_input_method" translatable="false">com.sogou.ime.wear/com.sohu.inputmethod.sogou.ime.SogouIMS</string>

frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
loadSecureSettings函数中添加

           loadStringSetting(stmt, Settings.Secure.DEFAULT_INPUT_METHOD,
                        R.string.config_default_input_method);
            loadStringSetting(stmt, Settings.Secure.ENABLED_INPUT_METHODS,
                        R.string.config_enabled_input_method);

二、OTA升级修改默认输入法

要修改两处

  1. 修改版本号
  2. 升级过程更新Settings.Secure值

实测无效的修改法

注意在frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java 中改是不行的,
试过改DATABASE_VERSION,与onUpgrade函数,在里面对数据进行升级,在OTA后无效。
如下修改是无效的:

diff --git a/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index 296dfeaf80..11fe3b4791 100755
--- a/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -83,7 +83,7 @@ class DatabaseHelper extends SQLiteOpenHelper {
     // database gets upgraded properly. At a minimum, please confirm that 'upgradeVersion'
     // is properly propagated through your change.  Not doing so will result in a loss of user
     // settings.
-    private static final int DATABASE_VERSION = 118;
+    private static final int DATABASE_VERSION = 119;

     private Context mContext;
     private int mUserHandle;
@@ -1841,6 +1841,24 @@ class DatabaseHelper extends SQLiteOpenHelper {
             upgradeVersion = 118;
         }

+        if (upgradeVersion < 119) {
+            db.beginTransaction();
+            SQLiteStatement stmt = null;
+            try {
+                stmt = db.compileStatement("INSERT OR REPLACE INTO secure(name,value)"
+                        + " VALUES(?,?);");
+                loadStringSetting(stmt, Settings.Secure.ENABLED_INPUT_METHODS,
+                        com.android.internal.R.string.config_enabled_input_method);
+                loadStringSetting(stmt, Settings.Secure.DEFAULT_INPUT_METHOD,
+                        com.android.internal.R.string.config_default_input_method);
+                db.setTransactionSuccessful();
+            } finally {
+                db.endTransaction();
+                if (stmt != null) stmt.close();
+            }
+            upgradeVersion = 119;
+        }
+

正确的修改

frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java

private static final int SETTINGS_VERSION = 191;

改为

private static final int SETTINGS_VERSION = 192;

onUpgradeLocked函数中,添加

                if (currentVersion == 191) {
                    final SettingsState secureSettings = getSecureSettingsLocked(userId);
                    secureSettings.insertSettingOverrideableByRestoreLocked(
                            Settings.Secure.ENABLED_INPUT_METHODS,
                            getContext().getResources().getString(
                                    R.string.config_enabled_input_method),
                            null, true, SettingsState.SYSTEM_PACKAGE_NAME);

                    secureSettings.insertSettingOverrideableByRestoreLocked(
                            Settings.Secure.DEFAULT_INPUT_METHOD,
                            getContext().getResources().getString(
                                    R.string.config_default_input_method),
                            null, true, SettingsState.SYSTEM_PACKAGE_NAME);
                    currentVersion = 192;
                }

相关文章

Android8.1高通平台修改默认输入法
Android SDK删除内置的触宝输入法
Android 13 内置可卸载的搜狗输入法
作者:帅得不敢出门


网站公告

今日签到

点亮在社区的每一天
去签到