odex修改,解决 android 5.0 以下 uiautomator 遇到特殊字符和emoji表情失败崩溃的错误

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tanzui/article/details/78664336

因项目需要 需要用到 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权限的手机可以考虑再刷机包修改,然后刷机解决
代码有什么不对的地方请批评指教
以上所用工具下面会有链接,新号积分不多留了积分

http://download.csdn.net/download/tanzui/10137272


猜你喜欢

转载自blog.csdn.net/tanzui/article/details/78664336
今日推荐