安卓8.1 AEX5.4 Xposed框架T9拨号移植

移植原理基于5.X时代DialerBox及GravityBox for 8.1.1

感谢waywell

DialerBox源码地址:https://github.com/waynell/DialerBox

感谢C3C076

GravityBox8.1源码地址:https://github.com/GravityBox/GravityBox/tree/oreo

编译平台macOS 10.13.4,使用IDE Andriod Studio 2.3


一、分析DialerBox源码,分析实现原理

XposedHelpers.findAndHookMethod("com.android.dialer.dial.DialNameMatcher", classLoader,
				"matchesCombination", String.class, String.class, ArrayList.class, new XC_MethodHook() 
XposedHelpers.findAndHookMethod("com.android.dialer.dial.SmartDialPrefix", classLoader,
				"generateNamePrefixes", String.class, new XC_MethodHook() 
调用Xposed的findandhookmethod对
com.android.dialer.dial.DialNameMatcher.matchedCombination
com.android.dialer.dial.SmartDialPrefix.generateNamePrefixes

两个类进行了hook操作,将传入参数的displayname,调用安卓系统的HanziToPinyin类实现联系人中文汉字转成拼音,从而进行T9识别(安卓系统原生支持英文T9识别)

二、具体实现

1.在AEX5.4(android 8.1)的src中,java路径已经发生改变,首先修正java类路径

com.android.dialer.dial.DialNameMatcher ->
com.android.dialer.smartdial.DialNameMatcher
com.android.dialer.dial.SmartDialPrefix.generateNamePrefixes ->

com.android.dialer.smartdial.SmartDialPrefix

2.DialerBox调用HanziToPinyin测试在AEX5.4中报错,替代采用jpinyin1.1.6实现转换,在bulid.gradle中添加

compile files('ext/jpinyin-1.1.6.jar')

3.插入修改后的函数

final String name = (String) param.args[0];
                            if (name == null) {
                                return;
                            }
                            param.args[0] = convertToPinyinString(name," ",WITHOUT_TONE);

对以上两个方法进行hook,

在mi 5s(AEX5.4)测试成功,

同时对layout进行修改,添加相应设置项

T9中文拨号功能完美实现



版权声明:本文为weixin_42119086原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。