文章目录

  • Android源码定制默认输入法
    • 声明
    • Android源码修改默认输入法
    • 关于配置默认输入法的包名和类名
    • 修改说明

Android源码定制默认输入法

声明

郑重声明:博文为原创内容,可以转载或引用,但必须在明显位置标明原文作者和出处,未经同意不得擅自修改本文内容!

博客地址:http://blog.csdn.net/luzhenrong45


Android源码修改默认输入法

Android原生源码编译出来的系统,一般预置的是是Android原生的输入法LatinIME,如果要在Android出厂时定制其他类型输入法,那就需要修改系统源码了。如果看过Android framework源码,可以知道Android系统是通过 Settings.Secure.DEFAULT_INPUT_METHOD 和 Settings.Secure.ENABLED_INPUT_METHODS 这两个settings这两个系统数据库字段来获取和设置输入法的。其中DEFAULT_INPUT_METHOD表示系统当前默认的输入法,而ENABLED_INPUT_METHODS表示系统中激活使用的输入法(可以有多个)。 两个字段的具体字符定义在 frameworks/base/core/java/android/provider/Settings.java文件中:

public static final String DEFAULT_INPUT_METHOD = "default_input_method";
public static final String ENABLED_INPUT_METHODS = "enabled_input_methods";

由于这两个字段是存在Settings数据库的,我们也可以通过settings命令获取其设置值:

$ adb shell settings get secure default_input_method
com.sohu.inputmethod.sogou/.SogouIME$  adb shell settings get secure enabled_input_methods
com.sohu.inputmethod.sogou/.SogouIME:com.android.inputmethod.latin/.LatinIME

在Android启动的时候,会通过loadStringSetting的形式加载这两个数据库字段。因此,如果要想修改默认出厂输入法,可以修改以下文件:

1. 配置输入法包名和类名(以搜狗输入法为例)

[–>frameworks/base/packages/SettingsProvider/res/values/defaults.xml]

<string name="config_default_input_method" translatable="false">com.sohu.inputmethod.sogou/.SogouIME</string><string name="config_enabled_input_method" translatable="false">com.sohu.inputmethod.sogou/.SogouIME:com.android.inputmethod.latin/.LatinIME</string>

“config_default_input_method” 配置的是默认的输入法,代码形式为 “包名/类名”。
因此,在这里:

  • “com.sohu.inputmethod.sogou” 是搜狗输入法的包名
  • “.SogouIME”是搜狗输入法类名,这里是简略写法,类名名也可以写成全称“com.sohu.inputmethod.sogou/com.sohu.inputmethod.sogou.SogouIME”

“config_enabled_input_method”配置的是系统可以使用的输入法,以上示例中,表明系统当中有两种输入法,即搜狗输入法和Android原生的输入法。(当然,Android原生输入法你也可以去掉。也可以增加多个其他输入法,as you like!)


2. 系统启动时,需要在Settings.Secure初始化时加载DEFAULT_INPUT_METHOD和ENABLED_INPUT_METHODS为我们设定的输入法

[–>frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java]

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);

DatabaseHelper会在系统启动时,通过“loadStringSetting”函数初始化Settings.Secure。因此,可以这里增加配置输入法相关信息,即配置Settings.Secure.DEFAULT_INPUT_METHOD 和 Settings.Secure.ENABLED_INPUT_METHODS这两个字段。系统启动后也是通过这两个字段来获取和设置输入法的。因此,这样可以达到“输入法定制”的目的。

从这里也可以看到,其实config_default_input_method 和 config_enabled_input_method这两个值 也是可以改名字的,比如改成 “custom_default_input_method”和 “custom_enabled_input_method”之类的名称,只要保证上面说到的两处地方能同时对应得上就可以了。

另外,需要注意的是,大多数第三方厂商会通过overlay的形式,在其同名defaults.xml中,对config_default_input_method和config_enabled_input_method的值进行覆盖,因此,如果默认输入法修改了不生效,就要查一查是否有overlay目录,将我们设置的值给覆盖了。(一般可以在device和vendor目录下查询 “DEVICE_PACKAGE_OVERLAYS” 关键字确认是否有overlay资源覆盖)


关于配置默认输入法的包名和类名

1. 记录常用的输入法包名和类名

以下几种输入法是工作过程中经常接触的,以这里顺便记录一下其包名和类名:

输入法 包名/类名
百度输入法 com.baidu.input/.ImeService
讯飞输入法 com.iflytek.inputmethod/.FlyIME
搜狗输入法 com.sohu.inputmethod.sogou/.SogouIME
腾讯输入法 com.tencent.qqpinyin/.QQPYInputMethodService
触宝输入法 com.emoji.keyboard.touchpal/com.cootek.smartinput5.TouchPalIME
Kika输入法 com.kikaoem.qisiemoji.inputmethod/com.android.inputmethod.latin.LatinIME
Android拼音输入法 com.android.inputmethod.pinyin/.PinyinIME
Google拼音输入法 com.google.android.inputmethod.pinyin/.PinyinIME

2. 授人以鱼,不如授人以渔 — 如何配置任意一个输入法为默认输入法?

前面记录的是一些常用输入法apk的包名和类名,但输入法种类繁多,层出不穷,总不能也无法更不该企图记录所有输入法的包名和类名信息吧,那样未免吃力又糊涂。掌握方法才是最重要的,正所谓“授人以鱼,不如授人以渔”。那么,对于一个不熟悉的输入法,如何通过apk文件得到得到其包名和类名?

apk包名和类名,可通过到AndroidManifest.xml文件查询得到,因此,如果有输入法的源代码,可直接跳转到第三步查看AndroidManifest.xml。但现实中大多数情况,我们都是只有apk,没有源码的。这里以Google自家的 Gboard.apk 输入法为例,介绍一下配置Gboard输入法所需要的包名和类名获取方法。

第一步: 解压Gboard.apk文件,得到AndroidManifest.xml文件

apk文件可以直接使用解压工具进行解压,但是解压出来的AndroidManifest.xml使用文本编辑工具打开会发现是乱码的,因此需要对其进一步解析。

第二步: 反编译解析AndroidManifest.xml,得到正常可读的到AndroidManifest.xml

一般可以通过反编译工具AXMLPrinter2(点击可下载) 解析上一步得到的AndroidManifest.xml,使用方法如下:

 java -jar AXMLPrinter2.jar AndroidManifest.xml  > AndroidManifest.xml_new

第三步: 从解析后的 AndroidManifest.xml中得到包名和类名
解析后的 AndroidManifest.xml其实就是没有经过混淆加密的原文件, 文件内容大致如下:

<manifestxmlns:android="http://schemas.android.com/apk/res/android"android:versionCode="26641613"android:versionName="6.4.16.162469584-release-armeabi-v7a"coreApp="true"package="com.google.android.inputmethod.latin" --->这个就是输入法要配置的包名,位于文件开头!platformBuildVersionCode="26"platformBuildVersionName="8.0.0"
><applicationandroid:theme="@7F110010"android:label="@7F10016B"android:icon="@7F030000"android:name="com.google.android.apps.inputmethod.latin.LatinApp"android:debuggable="false"android:backupAgent="com.google.android.apps.inputmethod.latin.core.LatinBackupAgent"android:allowBackup="true"android:killAfterRestore="false"android:restoreAnyVersion="true"android:supportsRtl="true"android:roundIcon="@7F030001"><meta-dataandroid:name="com.google.android.backup.api_key"android:value="AEdPqrEAAAAIl3fO6Spo7vqdonbORA0gOqfXPTnKWTdG6eHJNA"></meta-data><serviceandroid:label="@7F10016B"android:name="com.android.inputmethod.latin.LatinIME"android:permission="android.permission.BIND_INPUT_METHOD"android:directBootAware="true">...(此处略去N多内容)<serviceandroid:label="@7F10016B"android:name="com.android.inputmethod.latin.LatinIME"  android:permission="android.permission.BIND_INPUT_METHOD" ---> 找到 “android.permission.BIND_INPUT_METHOD” 这个权限的标签组件android:directBootAware="true">

注意:包含“android.permission.BIND_INPUT_METHOD”这个权限声明的标签组件,其指定的android:name就是要配置的输入法的类名,在这里具体是指 “com.android.inputmethod.latin.LatinIME”

因此,便可知,如果要配置Gboard为出厂默认输入法,即可将上面介绍的config_default_input_method配置为如下:

com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME或 com.google.android.inputmethod.latin/.LatinIME (这里是类名的简写)

修改说明

作者 版本 修改时间 修改说明
WalkAloner V1.0 2017/10/10 第一版

Android源码配置默认输入法相关推荐

  1. Android TV 源码修改默认输入法

    前一阵子,应泰国客户需求,需要在Android TV系统定制一个多语言输入法,至少支持中.英.泰三种语言.拿到这个任务,对于至今还是小白的我来说,当然先去google一下有没有大神专门做过符合要求的输 ...

  2. Android源码配置第三方应用电池白名单流程分析笔记

    这里以MTK6765 Android S举例说明,Android系统在加载客户应用白名单的过程. 首先Android系统可以根据不同手机厂商的需要进行源码的定制,当然定制应用白名单也是可以的,一般情况 ...

  3. android源码 谷歌拼音输入法已停止运行

    android JZO54L android-4.1.2_r2 编译,烧录Nexus grouper,打开谷歌拼音输入法弹出窗口说停止运行. 打开Logcat,说没有   jni_pinyinime  ...

  4. Android源码修改默认音量大小的方法

    目前网上有一些关于修改系统默认音量大小的方法,比如修改AudioSystem.java的DEFAULT_STREAM_VOLUME: public static int[] DEFAULT_STREA ...

  5. androidstudio调试android 源码 jni,在android studio下配置gradle用ndk-build和ndk-gbd编译调试JNI...

    因为要在旧版android在做一些工作.所以做用到了它.目标平台是:android api 10和armv6. 开发环境是:AS 版本2.3.2; SDK版配android 2.3.3(api10); ...

  6. Ubuntu18.04系统编译android源码环境配置

    1. 前言 我们做andorid系统开发,肯定时刻与源码打交到,特别是做新项目时,最重要的事情就是下载源码,然后配置环境编译,假如你的电脑是刚重装系统过,一个全新的开发环境,那么首要解决的事情就是完善 ...

  7. android源码编译1

    一.环境说明: 1.liunx系统:Ubuntu12.04 2.jdk:sun-java6-jdk 3.g++4.5 gcc4.5 二.android源码的目录结构 |--Makefile|--bio ...

  8. 《深入理解Android内核设计思想(第2版)(上下册)》之Android源码下载及编译

    本文摘自人民邮电出版社异步社区<深入理解Android内核设计思想(第2版)(上下册)> 购书地址:http://item.jd.com/12212640.html 试读地址:http:/ ...

  9. android源码分析

    01_Android系统概述 02_Android系统的开发综述 03_Android的Linux内核与驱动程序 04_Android的底层库和程序 05_Android的JAVA虚拟机和JAVA环境 ...

最新文章

  1. Python练习3-XML-RPC实现简单的P2P文件共享
  2. 搭建JAVA可视化开发环境
  3. skynet-源码分析1:目录下的文件整理
  4. 在ASP.NET中使用Global.asax文件
  5. Linux 操作系统太难?先爬过这 6 个陡坡
  6. 安卓Selector
  7. 纯Java JavaFX 2.0菜单
  8. 高并发秒杀系统--Service事务管理与继承测试
  9. 易筋SpringBoot 2.1 | 第廿三篇:SpringBoot之Docker入门
  10. 荔枝直播助手无法连接到服务器,荔枝FM直播助手pc客户端
  11. TCP 和 UDP 的区别 TCP 和 UDP 详解
  12. 在文档阅读器上为 PDF 文档生成多级目录
  13. mp3格式转换软件哪个好?
  14. YOLOV5 网络模块解析
  15. 2W+字系统讲解如何用Python自动化操作PPT,学懂这篇文章就够了
  16. abaqus 录制结果动画_录制和编辑动画 | Adobe Character Animator 教程
  17. 苹果系统这么没有关闭订阅服务器,iPhone 上没有取消订阅的选项怎么办?
  18. 初学,用python获取B站视频
  19. 如何在微信小程序里实现聊天室功能?
  20. BISDN:宽带综合业务数字网--网络大典

热门文章

  1. 计算机无法用u盘重装系统,电脑进不了系统怎么用u盘重装系统?
  2. 双线性插值算法的详细总结
  3. 编译原理实验2(1)——自上而下语法分析
  4. 三款国产操作系统使用初步体验
  5. 四叶草云演-CTF04# 后台管理系统
  6. UTF8与GBK字符编码之间的相互转换
  7. ZCMU 5122: 小何的旅行I
  8. jre包括jvm和java核心类库_JDK、JRE、JVM分别是什么及它们之间的有什么关联
  9. 上半年要写的博客文章30
  10. 数据结构与算法--图的广度优先搜索 (BFS)