在平常系統開發中,常常須要在adroid的framework修改或添加本身的配置。例如在config.xml 添加一個新的變量。我這邊測試發現若是隻是簡單的添加配置項,在代碼裏面怎麼也訪問不到。爲了解決這個問題仔細看了一下代碼,最終發現須要在public.xml 定義才能夠。html
下面用一個例子來講明一下。java
1.在framework/base/core/res/res/valus/config.xml 添加默認輸入配置:android
<!-- set default inputmethod. --> <string translatable="false" name="config_def_input_method">com.taypo.android.trskb/.TRSoftKeyboard</string>
這是默認輸入法爲土耳其語。api
修改後,須要在framework/base/core/res/res z執行mm 編譯一下修改。函數
完成後,croot到根目錄,執行make update-api 更新一下api。
測試
2.若是使用這個配置項code
我這邊在framework/base/service/java/com/android/interanl/InputMethodManangerService.java 中的resetDefaultIMeLocked函數使用這個變量server
private void resetDefaultImeLocked(Context context) { // Do not reset the default (current) IME when it is a 3rd-party IME if (mCurMethodId != null && !InputMethodUtils.isSystemIme(mMethodMap.get(mCurMethodId))) { return; } InputMethodInfo defIm = null; String id=context.getResources().getString(com.android.internal.R.string.config_def_input_method); Slog.i(TAG, "internal.id: " + id); for (InputMethodInfo imi : mMethodList) { if(imi.getId().equals(id)) defIm=imi; } /* if (defIm == null) { if (InputMethodUtils.isValidSystemDefaultIme( mSystemReady, imi, context)) { defIm = imi; Slog.i(TAG, "Selected default: " + imi.getId()); } } } if (defIm == null && mMethodList.size() > 0) { defIm = InputMethodUtils.getMostApplicableDefaultIME( mSettings.getEnabledInputMethodListLocked()); Slog.i(TAG, "No default found, using " + defIm.getId()); } */ if (defIm != null) { setSelectedInputMethodAndSubtypeLocked(defIm, NOT_A_SUBTYPE_ID, false); } }
這樣使用很簡單吧,一開始我覺得就是這樣,查了不少資料你們都是這樣使用的。最後編譯吧報了以下錯誤xml
frameworks/base/services/java/com/android/server/InputMethodManagerService.java:726: 找不到符號
符號: 變量 config_def_input_method
位置: 類 com.android.internal.R.string
String id=context.getResources().getString(com.android.internal.R.string.config_def_input_method);htm
可是我明明定義了,爲何仍是找不到呢。
解決方案:
1.在framework/base/core/res/res/values/public.xml文件裏增長對這些string的聲明。
2.framework/base/core/res/res/ 下mm編譯
3.到根目錄下執行make update-api 更新api。
<public type="string" name="config_def_input_method" id="0x01040018" />
注意在 裏面的id時一個遞增的值,在系統中是惟一的,千萬不要重複。
到此,在變異inputmethodmanagerService.java 就能夠pass啦。