因项目需要 需要用到 android 自带的命令 uiautomator dump
使用过程中发现 在android 5.0 以下版本中 uiautomator 遇到特殊字符,主要是emoji 表情,会出现错误,类似如下:
uiautomator dump /sdcard/a.xml
java.lang.IllegalArgumentException: Illegal character (d83c)
at org.kxml2.io.KXmlSerializer.reportInvalidCharacter(KXmlSerializer.java:144)
at org.kxml2.io.KXmlSerializer.writeEscaped(KXmlSerializer.java:130)
at org.kxml2.io.KXmlSerializer.attribute(KXmlSerializer.java:465)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(AccessibilityNodeInfoDumper.java:102)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpWindowToFile(AccessibilityNodeInfoDumper.java:84)
at com.android.commands.uiautomator.DumpCommand.run(DumpCommand.java:71)
at com.android.commands.uiautomator.Launcher.main(Launcher.java:83)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:235)
at dalvik.system.NativeStart.main(Native Method)
Killed
还有一处
java.lang.IllegalArgumentException: Illegal character (d83d)
at org.kxml2.io.KXmlSerializer.reportInvalidCharacter(KXmlSerializer.jav
a:144)
at org.kxml2.io.KXmlSerializer.writeEscaped(KXmlSerializer.java:130)
at org.kxml2.io.KXmlSerializer.attribute(KXmlSerializer.java:465)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(
AccessibilityNodeInfoDumper.java:105)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(
AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(
AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(
AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(
AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(
AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(
AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(
AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(
AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(
AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(
AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(
AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(
AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(
AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpNodeRec(
AccessibilityNodeInfoDumper.java:123)
at com.android.uiautomator.core.AccessibilityNodeInfoDumper.dumpWindowTo
File(AccessibilityNodeInfoDumper.java:84)
at com.android.commands.uiautomator.DumpCommand.run(DumpCommand.java:71)
at com.android.commands.uiautomator.Launcher.main(Launcher.java:83)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:235)
at dalvik.system.NativeStart.main(Native Method)
Killed
提示比较明显,根据提示直接查看 android 源代码就可以找到问题了,推荐在线查看代码的一个网站
http://androidxref.com/
这里android是4.2.2版本的,直接选择这个就可以
页面打开后,填入出错文件名,选择全部搜索,
找到后打开,找到对应出错行数102 和 105行
找到错误地方修改就容易了,只需要新增个方法过滤下特殊字符就行了,Java代码如下:
public static String filterEmoji(String source) {
if(source != null)
{
String regEx="[\\p{P}\\p{Z}a-zA-Z0-9\\u4e00-\\u9fa5]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(source);
StringBuffer sb = new StringBuffer();
while(m.find()){
sb.append(m.group());
}
return sb.toString();
}
return source;
}
转换成smail代码如下:
.method public static filterEmoji(Ljava/lang/String;)Ljava/lang/String;
.locals 5
.param p0, "source" # Ljava/lang/String;
.prologue
.line 24
if-eqz p0, :cond_0
.line 26
const-string v2, "[\\pP\\pS\\pZa-zA-Z0-9\\u4e00-\\u9fa5]"
.line 27
.local v2, "regEx":Ljava/lang/String;
invoke-static {v2}, Ljava/util/regex/Pattern;->compile(Ljava/lang/String;)Ljava/util/regex/Pattern;
move-result-object v1
.line 28
.local v1, "p":Ljava/util/regex/Pattern;
invoke-virtual {v1, p0}, Ljava/util/regex/Pattern;->matcher(Ljava/lang/CharSequence;)Ljava/util/regex/Matcher;
move-result-object v0
.line 29
.local v0, "m":Ljava/util/regex/Matcher;
new-instance v3, Ljava/lang/StringBuffer;
invoke-direct {v3}, Ljava/lang/StringBuffer;-><init>()V
.line 30
.local v3, "sb":Ljava/lang/StringBuffer;
:goto_0
invoke-virtual {v0}, Ljava/util/regex/Matcher;->find()Z
move-result v4
if-nez v4, :cond_1
.line 33
invoke-virtual {v3}, Ljava/lang/StringBuffer;->toString()Ljava/lang/String;
move-result-object p0
.line 35
.end local v0 # "m":Ljava/util/regex/Matcher;
.end local v1 # "p":Ljava/util/regex/Pattern;
.end local v2 # "regEx":Ljava/lang/String;
.end local v3 # "sb":Ljava/lang/StringBuffer;
.end local p0 # "source":Ljava/lang/String;
:cond_0
return-object p0
.line 31
.restart local v0 # "m":Ljava/util/regex/Matcher;
.restart local v1 # "p":Ljava/util/regex/Pattern;
.restart local v2 # "regEx":Ljava/lang/String;
.restart local v3 # "sb":Ljava/lang/StringBuffer;
.restart local p0 # "source":Ljava/lang/String;
:cond_1
invoke-virtual {v0}, Ljava/util/regex/Matcher;->group()Ljava/lang/String;
move-result-object v4
invoke-virtual {v3, v4}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer;
goto :goto_0
.end method
这样只需要把手机里对应的uiautomator.odex 提取出来,把我们上面的smail代码添加上并且调用过滤,就可以了
首先提取 /system/framework/ 目录,是整个目录,一会要用到
打开adb shell
adb shell
$su
#mount -o remount,rw /system
#cp /system/framework /sdcard/framework
adb pull /sdcard/framework/ D:\odex\
导出后下载
baksmali-2.2.1.jar
smali-2.2.1.jar
这两个文件,和导出文件同一目录,并且电脑需要安装了jdk
然后命令行定位到导出framework的路径执行反编译命令
java -jar baksmali-2.2.1.jar deodex uiautomator.odex
执行完毕后会生成一个 out 的目录,里面存放的就是生成后的smail文件,查找目标文件,在路径
D:\odex\out\com\android\uiautomator\core\AccessibilityNodeInfoDumper.smali
关键代码片段如下:
.method private static dumpNodeRec(Landroid/view/accessibility/AccessibilityNodeInfo;Lorg/xmlpull/v1/XmlSerializer;I)V
.registers 13
.param p0, "node" # Landroid/view/accessibility/AccessibilityNodeInfo;
.param p1, "serializer" # Lorg/xmlpull/v1/XmlSerializer;
.param p2, "index" # I
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/IOException;
}
.end annotation
.prologue
const/4 v9, 0x0
const/4 v8, 0x1
.line 98
const-string v3, ""
const-string v4, "node"
invoke-interface {p1, v3, v4}, Lorg/xmlpull/v1/XmlSerializer;->startTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
.line 99
invoke-static {p0}, Lcom/android/uiautomator/core/AccessibilityNodeInfoDumper;->nafExcludedClass(Landroid/view/accessibility/AccessibilityNodeInfo;)Z
move-result v3
if-nez v3, :cond_20
invoke-static {p0}, Lcom/android/uiautomator/core/AccessibilityNodeInfoDumper;->nafCheck(Landroid/view/accessibility/AccessibilityNodeInfo;)Z
move-result v3
if-nez v3, :cond_20
.line 100
const-string v3, ""
const-string v4, "NAF"
invoke-static {v8}, Ljava/lang/Boolean;->toString(Z)Ljava/lang/String;
move-result-object v5
invoke-interface {p1, v3, v4, v5}, Lorg/xmlpull/v1/XmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
.line 101
:cond_20
const-string v3, ""
const-string v4, "index"
invoke-static {p2}, Ljava/lang/Integer;->toString(I)Ljava/lang/String;
move-result-object v5
invoke-interface {p1, v3, v4, v5}, Lorg/xmlpull/v1/XmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
.line 102
const-string v3, ""
const-string v4, "text"
invoke-virtual {p0}, Landroid/view/accessibility/AccessibilityNodeInfo;->getText()Ljava/lang/CharSequence;
move-result-object v5
invoke-static {v5}, Lcom/android/uiautomator/core/AccessibilityNodeInfoDumper;->safeCharSeqToString(Ljava/lang/CharSequence;)Ljava/lang/String;
move-result-object v5
invoke-interface {p1, v3, v4, v5}, Lorg/xmlpull/v1/XmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
.line 103
const-string v3, ""
const-string v4, "class"
invoke-virtual {p0}, Landroid/view/accessibility/AccessibilityNodeInfo;->getClassName()Ljava/lang/CharSequence;
move-result-object v5
invoke-static {v5}, Lcom/android/uiautomator/core/AccessibilityNodeInfoDumper;->safeCharSeqToString(Ljava/lang/CharSequence;)Ljava/lang/String;
move-result-object v5
invoke-interface {p1, v3, v4, v5}, Lorg/xmlpull/v1/XmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
.line 104
const-string v3, ""
const-string v4, "package"
invoke-virtual {p0}, Landroid/view/accessibility/AccessibilityNodeInfo;->getPackageName()Ljava/lang/CharSequence;
move-result-object v5
invoke-static {v5}, Lcom/android/uiautomator/core/AccessibilityNodeInfoDumper;->safeCharSeqToString(Ljava/lang/CharSequence;)Ljava/lang/String;
move-result-object v5
invoke-interface {p1, v3, v4, v5}, Lorg/xmlpull/v1/XmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
.line 105
const-string v3, ""
const-string v4, "content-desc"
invoke-virtual {p0}, Landroid/view/accessibility/AccessibilityNodeInfo;->getContentDescription()Ljava/lang/CharSequence;
move-result-object v5
invoke-static {v5}, Lcom/android/uiautomator/core/AccessibilityNodeInfoDumper;->safeCharSeqToString(Ljava/lang/CharSequence;)Ljava/lang/String;
move-result-object v5
invoke-interface {p1, v3, v4, v5}, Lorg/xmlpull/v1/XmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
.line 106
const-string v3, ""
const-string v4, "checkable"
invoke-virtual {p0}, Landroid/view/accessibility/AccessibilityNodeInfo;->isCheckable()Z
move-result v5
invoke-static {v5}, Ljava/lang/Boolean;->toString(Z)Ljava/lang/String;
move-result-object v5
invoke-interface {p1, v3, v4, v5}, Lorg/xmlpull/v1/XmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
.line 107
const-string v3, ""
const-string v4, "checked"
invoke-virtual {p0}, Landroid/view/accessibility/AccessibilityNodeInfo;->isChecked()Z
move-result v5
invoke-static {v5}, Ljava/lang/Boolean;->toString(Z)Ljava/lang/String;
move-result-object v5
invoke-interface {p1, v3, v4, v5}, Lorg/xmlpull/v1/XmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
.line 108
const-string v3, ""
const-string v4, "clickable"
invoke-virtual {p0}, Landroid/view/accessibility/AccessibilityNodeInfo;->isClickable()Z
move-result v5
invoke-static {v5}, Ljava/lang/Boolean;->toString(Z)Ljava/lang/String;
move-result-object v5
invoke-interface {p1, v3, v4, v5}, Lorg/xmlpull/v1/XmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
.line 109
const-string v3, ""
const-string v4, "enabled"
invoke-virtual {p0}, Landroid/view/accessibility/AccessibilityNodeInfo;->isEnabled()Z
move-result v5
invoke-static {v5}, Ljava/lang/Boolean;->toString(Z)Ljava/lang/String;
move-result-object v5
invoke-interface {p1, v3, v4, v5}, Lorg/xmlpull/v1/XmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
.line 110
const-string v3, ""
const-string v4, "focusable"
invoke-virtual {p0}, Landroid/view/accessibility/AccessibilityNodeInfo;->isFocusable()Z
move-result v5
invoke-static {v5}, Ljava/lang/Boolean;->toString(Z)Ljava/lang/String;
move-result-object v5
invoke-interface {p1, v3, v4, v5}, Lorg/xmlpull/v1/XmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
.line 111
const-string v3, ""
const-string v4, "focused"
invoke-virtual {p0}, Landroid/view/accessibility/AccessibilityNodeInfo;->isFocused()Z
move-result v5
invoke-static {v5}, Ljava/lang/Boolean;->toString(Z)Ljava/lang/String;
move-result-object v5
invoke-interface {p1, v3, v4, v5}, Lorg/xmlpull/v1/XmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
.line 112
const-string v3, ""
const-string v4, "scrollable"
invoke-virtual {p0}, Landroid/view/accessibility/AccessibilityNodeInfo;->isScrollable()Z
move-result v5
invoke-static {v5}, Ljava/lang/Boolean;->toString(Z)Ljava/lang/String;
move-result-object v5
invoke-interface {p1, v3, v4, v5}, Lorg/xmlpull/v1/XmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
.line 113
const-string v3, ""
const-string v4, "long-clickable"
invoke-virtual {p0}, Landroid/view/accessibility/AccessibilityNodeInfo;->isLongClickable()Z
move-result v5
invoke-static {v5}, Ljava/lang/Boolean;->toString(Z)Ljava/lang/String;
move-result-object v5
invoke-interface {p1, v3, v4, v5}, Lorg/xmlpull/v1/XmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
.line 114
const-string v3, ""
const-string v4, "password"
invoke-virtual {p0}, Landroid/view/accessibility/AccessibilityNodeInfo;->isPassword()Z
move-result v5
invoke-static {v5}, Ljava/lang/Boolean;->toString(Z)Ljava/lang/String;
move-result-object v5
invoke-interface {p1, v3, v4, v5}, Lorg/xmlpull/v1/XmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
.line 115
const-string v3, ""
const-string v4, "selected"
invoke-virtual {p0}, Landroid/view/accessibility/AccessibilityNodeInfo;->isSelected()Z
move-result v5
invoke-static {v5}, Ljava/lang/Boolean;->toString(Z)Ljava/lang/String;
move-result-object v5
invoke-interface {p1, v3, v4, v5}, Lorg/xmlpull/v1/XmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
.line 116
const-string v3, ""
const-string v4, "bounds"
invoke-static {p0}, Lcom/android/uiautomator/core/AccessibilityNodeInfoHelper;->getVisibleBoundsInScreen(Landroid/view/accessibility/AccessibilityNodeInfo;)Landroid/graphics/Rect;
move-result-object v5
invoke-virtual {v5}, Landroid/graphics/Rect;->toShortString()Ljava/lang/String;
move-result-object v5
invoke-interface {p1, v3, v4, v5}, Lorg/xmlpull/v1/XmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
.line 118
invoke-virtual {p0}, Landroid/view/accessibility/AccessibilityNodeInfo;->getChildCount()I
move-result v1
.line 119
.local v1, "count":I
const/4 v2, 0x0
.local v2, "i":I
:goto_111
if-ge v2, v1, :cond_15e
.line 120
invoke-virtual {p0, v2}, Landroid/view/accessibility/AccessibilityNodeInfo;->getChild(I)Landroid/view/accessibility/AccessibilityNodeInfo;
move-result-object v0
.line 121
.local v0, "child":Landroid/view/accessibility/AccessibilityNodeInfo;
if-eqz v0, :cond_13c
.line 122
invoke-virtual {v0}, Landroid/view/accessibility/AccessibilityNodeInfo;->isVisibleToUser()Z
move-result v3
if-eqz v3, :cond_128
.line 123
invoke-static {v0, p1, v2}, Lcom/android/uiautomator/core/AccessibilityNodeInfoDumper;->dumpNodeRec(Landroid/view/accessibility/AccessibilityNodeInfo;Lorg/xmlpull/v1/XmlSerializer;I)V
.line 124
invoke-virtual {v0}, Landroid/view/accessibility/AccessibilityNodeInfo;->recycle()V
.line 119
:goto_125
add-int/lit8 v2, v2, 0x1
goto :goto_111
.line 126
:cond_128
sget-object v3, Lcom/android/uiautomator/core/AccessibilityNodeInfoDumper;->LOGTAG:Ljava/lang/String;
const-string v4, "Skipping invisible child: %s"
new-array v5, v8, [Ljava/lang/Object;
invoke-virtual {v0}, Landroid/view/accessibility/AccessibilityNodeInfo;->toString()Ljava/lang/String;
move-result-object v6
aput-object v6, v5, v9
invoke-static {v4, v5}, Ljava/lang/String;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
move-result-object v4
invoke-static {v3, v4}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
goto :goto_125
.line 129
:cond_13c
sget-object v3, Lcom/android/uiautomator/core/AccessibilityNodeInfoDumper;->LOGTAG:Ljava/lang/String;
const-string v4, "Null child %d/%d, parent: %s"
const/4 v5, 0x3
new-array v5, v5, [Ljava/lang/Object;
invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v6
aput-object v6, v5, v9
invoke-static {v1}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v6
aput-object v6, v5, v8
const/4 v6, 0x2
invoke-virtual {p0}, Landroid/view/accessibility/AccessibilityNodeInfo;->toString()Ljava/lang/String;
move-result-object v7
aput-object v7, v5, v6
invoke-static {v4, v5}, Ljava/lang/String;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
move-result-object v4
invoke-static {v3, v4}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
goto :goto_125
.line 133
.end local v0 # "child":Landroid/view/accessibility/AccessibilityNodeInfo;
:cond_15e
const-string v3, ""
const-string v4, "node"
invoke-interface {p1, v3, v4}, Lorg/xmlpull/v1/XmlSerializer;->endTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
.line 134
return-void
.end method
在文件尾部插入我们的方法smail代码
在
invoke-virtual {p0}, Landroid/view/accessibility/AccessibilityNodeInfo;->getText()Ljava/lang/CharSequence;
move-result-object v5
invoke-static {v5}, Lcom/android/uiautomator/core/AccessibilityNodeInfoDumper;->safeCharSeqToString(Ljava/lang/CharSequence;)Ljava/lang/String;
move-result-object v5
和
invoke-virtual {p0}, Landroid/view/accessibility/AccessibilityNodeInfo;->getContentDescription()Ljava/lang/CharSequence;
move-result-object v5
invoke-static {v5}, Lcom/android/uiautomator/core/AccessibilityNodeInfoDumper;->safeCharSeqToString(Ljava/lang/CharSequence;)Ljava/lang/String;
move-result-object v5
后面分别插入
invoke-static {v5}, Lcom/android/uiautomator/core/AccessibilityNodeInfoDumper;->filterEmoji(Ljava/lang/String;)Ljava/lang/String;
move-result-object v5
来调用我们的方法
invoke-static {v5}, Lcom/android/uiautomator/core/AccessibilityNodeInfoDumper;->filterEmoji(Ljava/lang/String;)Ljava/lang/String;
上面这句话可以理解为静态方法调用{v5}是参数
move-result-object v5
这句是调用结果给 v5
改好之后,执行
java -jar smali-2.2.1.jar assemble out
目录下会生成一个 out.dex ,修改成classes.dex
然后用解压缩软件打开 uiautomator.jar 把 它放进去 然后放回到 /system/framework/ 下
删除 /system/framework/uiautomator.odex
adb push D:\odex/uiautomator.jar /sdcard/
adb shell
$su
#mount -o remount,rw /system
cp /sdcard/uiautomator.jar /system/framework/
这个单jar适合移植,但会影响速度
如果只是单机使用,建议生成odex
dexopt-wrapper 传到 手机 /system/bin/ 目录
然后执行
chmod 755 /system/bin/dexopt-wrapper
执行
dexopt-wrapper /system/framework/uiautomator.jar /system/framework/uiautomator.odex
然后在把原来的uiautomator.jar 传到/system/framework/ 就可以了
如果原版没备份的话 把压缩进的 uiautomator.dex 删除即可
最后执行 uiautomator dump 正常
以上就是全部内容,请谨慎操作,可能并不适用于您的手机,如有操作不慎手机有可能变砖的风险,本人一概不负责,未获得su权限的手机可以考虑再刷机包修改,然后刷机解决
代码有什么不对的地方请批评指教
以上所用工具下面会有链接,新号积分不多留了积分