AndroidHack.smali

.class public Lorg/acdd/hack/AndroidHack;
.super Ljava/lang/Object;
.source "AndroidHack.java"


# annotations
.annotation system Ldalvik/annotation/MemberClasses;
    value = {
        Lorg/acdd/hack/AndroidHack$ActvityThreadGetter;,
        Lorg/acdd/hack/AndroidHack$HandlerHack;
    }
.end annotation


# static fields
.field public static final CREATE_SERVICE:I

.field public static final DESTROY_ACTIVITY:I

.field public static final ENTER_ANIMATION_COMPLETE:I

.field public static final EXECUTE_TRANSACTION:I

.field public static final GC_WHEN_IDLE:I

.field public static final LAUNCH_ACTIVITY:I

.field public static final RECEIVER:I

.field public static final STOP_ACTIVITY_HIDE:I

.field public static final STOP_ACTIVITY_SHOW:I

.field private static _mLoadedApk:Ljava/lang/Object;

.field private static _sActivityManager:Landroid/app/IActivityManager;

.field private static _sActivityThread:Ljava/lang/Object;

.field private static _sIContentProviders:Ljava/util/HashMap;
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "Ljava/util/HashMap",
            "<",
            "Ljava/lang/String;",
            "Landroid/content/IContentProvider;",
            ">;"
        }
    .end annotation
.end field

.field static logger:Lorg/acdd/log/Logger;

.field private static sHandler:Landroid/os/Handler;

.field private static sHandlerHack:Lorg/acdd/hack/AndroidHack$HandlerHack;

.field private static sPluginInitializers:Ljava/util/concurrent/ConcurrentHashMap;
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "Ljava/util/concurrent/ConcurrentHashMap",
            "<",
            "Ljava/lang/String;",
            "Lorg/acdd/android/initializer/IPluginInitializer;",
            ">;"
        }
    .end annotation
.end field


# direct methods
.method static constructor <clinit>()V
    .registers 3

    .prologue
    const/4 v1, 0x0

    .line 90
    new-instance v0, Ljava/util/HashMap;

    invoke-direct {v0}, Ljava/util/HashMap;-><init>()V

    sput-object v0, Lorg/acdd/hack/AndroidHack;->_sIContentProviders:Ljava/util/HashMap;

    .line 91
    new-instance v0, Ljava/util/concurrent/ConcurrentHashMap;

    invoke-direct {v0}, Ljava/util/concurrent/ConcurrentHashMap;-><init>()V

    sput-object v0, Lorg/acdd/hack/AndroidHack;->sPluginInitializers:Ljava/util/concurrent/ConcurrentHashMap;

    .line 102
    invoke-static {}, Lorg/acdd/log/LoggerFactory;->getInstance()Lorg/acdd/log/Logger;

    move-result-object v0

    sput-object v0, Lorg/acdd/hack/AndroidHack;->logger:Lorg/acdd/log/Logger;

    .line 107
    :try_start_15
    const-string v0, "android.app.ActivityThread$H"

    invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;
    :try_end_1a
    .catch Ljava/lang/ClassNotFoundException; {:try_start_15 .. :try_end_1a} :catch_85

    move-result-object v0

    .line 112
    :goto_1b
    const-string v2, "STOP_ACTIVITY_SHOW"

    invoke-static {v0, v2}, Lorg/acdd/hack/AndroidHack;->getHMember(Ljava/lang/Class;Ljava/lang/String;)I

    move-result v2

    .line 113
    if-ltz v2, :cond_8b

    :goto_23
    sput v2, Lorg/acdd/hack/AndroidHack;->STOP_ACTIVITY_SHOW:I

    .line 114
    const-string v2, "STOP_ACTIVITY_HIDE"

    invoke-static {v0, v2}, Lorg/acdd/hack/AndroidHack;->getHMember(Ljava/lang/Class;Ljava/lang/String;)I

    move-result v2

    .line 115
    if-ltz v2, :cond_8e

    :goto_2d
    sput v2, Lorg/acdd/hack/AndroidHack;->STOP_ACTIVITY_HIDE:I

    .line 116
    const-string v2, "RECEIVER"

    invoke-static {v0, v2}, Lorg/acdd/hack/AndroidHack;->getHMember(Ljava/lang/Class;Ljava/lang/String;)I

    move-result v2

    .line 117
    if-ltz v2, :cond_91

    :goto_37
    sput v2, Lorg/acdd/hack/AndroidHack;->RECEIVER:I

    .line 118
    const-string v2, "CREATE_SERVICE"

    invoke-static {v0, v2}, Lorg/acdd/hack/AndroidHack;->getHMember(Ljava/lang/Class;Ljava/lang/String;)I

    move-result v2

    .line 119
    if-ltz v2, :cond_94

    :goto_41
    sput v2, Lorg/acdd/hack/AndroidHack;->CREATE_SERVICE:I

    .line 120
    const-string v2, "GC_WHEN_IDLE"

    invoke-static {v0, v2}, Lorg/acdd/hack/AndroidHack;->getHMember(Ljava/lang/Class;Ljava/lang/String;)I

    move-result v2

    .line 121
    if-ltz v2, :cond_97

    :goto_4b
    sput v2, Lorg/acdd/hack/AndroidHack;->GC_WHEN_IDLE:I

    .line 122
    const-string v2, "LAUNCH_ACTIVITY"

    invoke-static {v0, v2}, Lorg/acdd/hack/AndroidHack;->getHMember(Ljava/lang/Class;Ljava/lang/String;)I

    move-result v2

    .line 123
    if-ltz v2, :cond_9a

    :goto_55
    sput v2, Lorg/acdd/hack/AndroidHack;->LAUNCH_ACTIVITY:I

    .line 124
    const-string v2, "DESTROY_ACTIVITY"

    invoke-static {v0, v2}, Lorg/acdd/hack/AndroidHack;->getHMember(Ljava/lang/Class;Ljava/lang/String;)I

    move-result v2

    .line 125
    if-ltz v2, :cond_9d

    :goto_5f
    sput v2, Lorg/acdd/hack/AndroidHack;->DESTROY_ACTIVITY:I

    .line 126
    const-string v2, "ENTER_ANIMATION_COMPLETE"

    invoke-static {v0, v2}, Lorg/acdd/hack/AndroidHack;->getHMember(Ljava/lang/Class;Ljava/lang/String;)I

    move-result v2

    .line 127
    if-ltz v2, :cond_a0

    :goto_69
    sput v2, Lorg/acdd/hack/AndroidHack;->ENTER_ANIMATION_COMPLETE:I

    .line 128
    const-string v2, "EXECUTE_TRANSACTION"

    invoke-static {v0, v2}, Lorg/acdd/hack/AndroidHack;->getHMember(Ljava/lang/Class;Ljava/lang/String;)I

    move-result v0

    .line 129
    if-ltz v0, :cond_a3

    :goto_73
    sput v0, Lorg/acdd/hack/AndroidHack;->EXECUTE_TRANSACTION:I

    .line 556
    sput-object v1, Lorg/acdd/hack/AndroidHack;->_sActivityThread:Ljava/lang/Object;

    .line 557
    sput-object v1, Lorg/acdd/hack/AndroidHack;->_mLoadedApk:Ljava/lang/Object;

    .line 719
    new-instance v0, Landroid/os/Handler;

    invoke-static {}, Landroid/os/Looper;->getMainLooper()Landroid/os/Looper;

    move-result-object v1

    invoke-direct {v0, v1}, Landroid/os/Handler;-><init>(Landroid/os/Looper;)V

    sput-object v0, Lorg/acdd/hack/AndroidHack;->sHandler:Landroid/os/Handler;

    return-void

    .line 108
    :catch_85
    move-exception v0

    .line 109
    invoke-virtual {v0}, Ljava/lang/ClassNotFoundException;->printStackTrace()V

    move-object v0, v1

    goto :goto_1b

    .line 113
    :cond_8b
    const/16 v2, 0x67

    goto :goto_23

    .line 115
    :cond_8e
    const/16 v2, 0x68

    goto :goto_2d

    .line 117
    :cond_91
    const/16 v2, 0x71

    goto :goto_37

    .line 119
    :cond_94
    const/16 v2, 0x72

    goto :goto_41

    .line 121
    :cond_97
    const/16 v2, 0x78

    goto :goto_4b

    .line 123
    :cond_9a
    const/16 v2, 0x64

    goto :goto_55

    .line 125
    :cond_9d
    const/16 v2, 0x6d

    goto :goto_5f

    .line 127
    :cond_a0
    const/16 v2, 0x95

    goto :goto_69

    .line 129
    :cond_a3
    const/16 v0, 0x9f

    goto :goto_73
.end method

.method public constructor <init>()V
    .registers 1

    .prologue
    .line 85
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    return-void
.end method

.method static synthetic access$000(Landroid/content/Intent;Landroid/content/pm/ActivityInfo;)V
    .registers 2
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/lang/Exception;
        }
    .end annotation

    .prologue
    .line 85
    invoke-static {p0, p1}, Lorg/acdd/hack/AndroidHack;->handlerLaunchActivityForP(Landroid/content/Intent;Landroid/content/pm/ActivityInfo;)V

    return-void
.end method

.method static synthetic access$102(Ljava/lang/Object;)Ljava/lang/Object;
    .registers 1

    .prologue
    .line 85
    sput-object p0, Lorg/acdd/hack/AndroidHack;->_sActivityThread:Ljava/lang/Object;

    return-object p0
.end method

.method static clearDrawableCache()V
    .registers 3

    .prologue
    .line 528
    sget-object v0, Lorg/acdd/runtime/RuntimeVariables;->delegateResources:Landroid/content/res/Resources;

    .line 529
    instance-of v1, v0, Lorg/acdd/runtime/DelegateResources;

    if-eqz v1, :cond_c

    .line 530
    check-cast v0, Lorg/acdd/runtime/DelegateResources;

    invoke-virtual {v0}, Lorg/acdd/runtime/DelegateResources;->clearDrawableCache()V

    .line 535
    :cond_b
    :goto_b
    return-void

    .line 532
    :cond_c
    invoke-virtual {v0}, Ljava/lang/Object;->getClass()Ljava/lang/Class;

    move-result-object v1

    invoke-virtual {v1}, Ljava/lang/Class;->getSuperclass()Ljava/lang/Class;

    move-result-object v1

    const-class v2, Landroid/content/res/Resources;

    invoke-virtual {v1, v2}, Ljava/lang/Object;->equals(Ljava/lang/Object;)Z

    move-result v1

    if-eqz v1, :cond_b

    .line 533
    invoke-static {v0}, Lorg/acdd/runtime/DelegateResources;->clearDrawableCache(Landroid/content/res/Resources;)V

    goto :goto_b
.end method

.method private static createHostStubUriByProcessName(Ljava/lang/String;)Landroid/net/Uri;
    .registers 4

    .prologue
    .line 239
    new-instance v0, Ljava/lang/StringBuilder;

    invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V

    const-string v1, "content://"

    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v0

    sget-object v1, Lorg/acdd/runtime/RuntimeVariables;->androidApplication:Landroid/app/Application;

    invoke-virtual {v1}, Landroid/app/Application;->getApplicationInfo()Landroid/content/pm/ApplicationInfo;

    move-result-object v1

    iget-object v1, v1, Landroid/content/pm/ApplicationInfo;->packageName:Ljava/lang/String;

    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v0

    const-string v1, ".CMPlugin.Provider"

    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v0

    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v1

    .line 240
    const/4 v0, 0x0

    .line 241
    const-string v2, ":service"

    invoke-virtual {p0, v2}, Ljava/lang/String;->endsWith(Ljava/lang/String;)Z

    move-result v2

    if-eqz v2, :cond_48

    .line 242
    new-instance v0, Ljava/lang/StringBuilder;

    invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V

    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v0

    const-string v2, ".service"

    invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v0

    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-static {v0}, Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;

    move-result-object v0

    .line 250
    :cond_41
    :goto_41
    if-nez v0, :cond_47

    .line 251
    invoke-static {v1}, Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;

    move-result-object v0

    .line 253
    :cond_47
    return-object v0

    .line 243
    :cond_48
    const-string v2, ":worker"

    invoke-virtual {p0, v2}, Ljava/lang/String;->endsWith(Ljava/lang/String;)Z

    move-result v2

    if-eqz v2, :cond_68

    .line 244
    new-instance v0, Ljava/lang/StringBuilder;

    invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V

    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v0

    const-string v2, ".worker"

    invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v0

    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-static {v0}, Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;

    move-result-object v0

    goto :goto_41

    .line 245
    :cond_68
    const-string v2, ":deamon"

    invoke-virtual {p0, v2}, Ljava/lang/String;->endsWith(Ljava/lang/String;)Z

    move-result v2

    if-eqz v2, :cond_88

    .line 246
    new-instance v0, Ljava/lang/StringBuilder;

    invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V

    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v0

    const-string v2, ".deamon"

    invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v0

    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-static {v0}, Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;

    move-result-object v0

    goto :goto_41

    .line 247
    :cond_88
    const-string v2, ":other"

    invoke-virtual {p0, v2}, Ljava/lang/String;->endsWith(Ljava/lang/String;)Z

    move-result v2

    if-eqz v2, :cond_41

    .line 248
    new-instance v0, Ljava/lang/StringBuilder;

    invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V

    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v0

    const-string v2, ".other"

    invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v0

    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-static {v0}, Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;

    move-result-object v0

    goto :goto_41
.end method

.method public static createNewLoadedApk(Landroid/app/Application;Ljava/lang/Object;)Ljava/lang/Object;
    .registers 10

    .prologue
    .line 641
    const/4 v0, 0x0

    .line 642
    :try_start_1
    invoke-virtual {p0}, Landroid/app/Application;->getPackageManager()Landroid/content/pm/PackageManager;

    move-result-object v1

    .line 643
    invoke-virtual {p0}, Landroid/app/Application;->getPackageName()Ljava/lang/String;

    move-result-object v2

    const/16 v3, 0x480

    invoke-virtual {v1, v2, v3}, Landroid/content/pm/PackageManager;->getApplicationInfo(Ljava/lang/String;I)Landroid/content/pm/ApplicationInfo;

    move-result-object v1

    .line 644
    invoke-virtual {p0}, Landroid/app/Application;->getPackageManager()Landroid/content/pm/PackageManager;

    .line 645
    invoke-virtual {p0}, Landroid/app/Application;->getResources()Landroid/content/res/Resources;

    move-result-object v2

    .line 646
    instance-of v3, v2, Lorg/acdd/runtime/DelegateResources;

    if-eqz v3, :cond_6b

    .line 648
    invoke-virtual {v2}, Ljava/lang/Object;->getClass()Ljava/lang/Class;

    move-result-object v0

    .line 649
    invoke-virtual {v0}, Ljava/lang/Class;->getSuperclass()Ljava/lang/Class;

    move-result-object v0

    const-string v2, "getCompatibilityInfo"

    const/4 v3, 0x0

    new-array v3, v3, [Ljava/lang/Class;

    .line 650
    invoke-virtual {v0, v2, v3}, Ljava/lang/Class;->getDeclaredMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;

    move-result-object v0

    .line 661
    :cond_2b
    :goto_2b
    const/4 v2, 0x1

    invoke-virtual {v0, v2}, Ljava/lang/reflect/Method;->setAccessible(Z)V

    .line 662
    const-string v2, "android.content.res.CompatibilityInfo"

    invoke-static {v2}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;

    move-result-object v2

    .line 663
    invoke-virtual {p0}, Landroid/app/Application;->getResources()Landroid/content/res/Resources;

    move-result-object v3

    const/4 v4, 0x0

    new-array v4, v4, [Ljava/lang/Object;

    invoke-virtual {v0, v3, v4}, Ljava/lang/reflect/Method;->invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v0

    .line 665
    sget-object v3, Lorg/acdd/hack/ACDDHacks;->ActivityThread:Lorg/acdd/hack/Hack$HackedClass;

    invoke-virtual {v3}, Lorg/acdd/hack/Hack$HackedClass;->getmClass()Ljava/lang/Class;

    move-result-object v3

    const-string v4, "getPackageInfoNoCheck"

    const/4 v5, 0x2

    new-array v5, v5, [Ljava/lang/Class;

    const/4 v6, 0x0

    const-class v7, Landroid/content/pm/ApplicationInfo;

    aput-object v7, v5, v6

    const/4 v6, 0x1

    aput-object v2, v5, v6

    .line 666
    invoke-virtual {v3, v4, v5}, Ljava/lang/Class;->getDeclaredMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;

    move-result-object v2

    .line 668
    const/4 v3, 0x1

    invoke-virtual {v2, v3}, Ljava/lang/reflect/Method;->setAccessible(Z)V

    .line 669
    const/4 v3, 0x2

    new-array v3, v3, [Ljava/lang/Object;

    const/4 v4, 0x0

    aput-object v1, v3, v4

    const/4 v1, 0x1

    aput-object v0, v3, v1

    invoke-virtual {v2, p1, v3}, Ljava/lang/reflect/Method;->invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v0

    .line 670
    sput-object v0, Lorg/acdd/hack/AndroidHack;->_mLoadedApk:Ljava/lang/Object;
    :try_end_6a
    .catch Ljava/lang/Throwable; {:try_start_1 .. :try_end_6a} :catch_88

    .line 671
    return-object v0

    .line 653
    :cond_6b
    :try_start_6b
    invoke-virtual {v2}, Ljava/lang/Object;->getClass()Ljava/lang/Class;

    move-result-object v3

    const-string v4, "getCompatibilityInfo"

    const/4 v5, 0x0

    new-array v5, v5, [Ljava/lang/Class;

    invoke-virtual {v3, v4, v5}, Ljava/lang/Class;->getDeclaredMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
    :try_end_77
    .catch Ljava/lang/NoSuchMethodException; {:try_start_6b .. :try_end_77} :catch_92
    .catch Ljava/lang/Throwable; {:try_start_6b .. :try_end_77} :catch_88

    move-result-object v0

    .line 657
    :goto_78
    if-nez v0, :cond_2b

    .line 658
    :try_start_7a
    invoke-virtual {v2}, Ljava/lang/Object;->getClass()Ljava/lang/Class;

    move-result-object v0

    const-string v2, "getCompatibilityInfo"

    const/4 v3, 0x0

    new-array v3, v3, [Ljava/lang/Class;

    invoke-virtual {v0, v2, v3}, Ljava/lang/Class;->getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
    :try_end_86
    .catch Ljava/lang/Throwable; {:try_start_7a .. :try_end_86} :catch_88

    move-result-object v0

    goto :goto_2b

    .line 672
    :catch_88
    move-exception v0

    .line 673
    invoke-virtual {v0}, Ljava/lang/Throwable;->printStackTrace()V

    .line 674
    new-instance v1, Ljava/lang/RuntimeException;

    invoke-direct {v1, v0}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V

    throw v1

    .line 655
    :catch_92
    move-exception v3

    goto :goto_78
.end method

.method public static ensureLoadedApk()V
    .registers 3
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/lang/Exception;
        }
    .end annotation

    .prologue
    .line 602
    invoke-static {}, Lorg/acdd/hack/AndroidHack;->getActivityThread()Ljava/lang/Object;

    move-result-object v1

    .line 603
    if-nez v1, :cond_e

    .line 604
    new-instance v0, Ljava/lang/Exception;

    const-string v1, "Failed to get ActivityThread.sCurrentActivityThread"

    invoke-direct {v0, v1}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V

    throw v0

    .line 607
    :cond_e
    sget-object v0, Lorg/acdd/runtime/RuntimeVariables;->androidApplication:Landroid/app/Application;

    sget-object v2, Lorg/acdd/runtime/RuntimeVariables;->androidApplication:Landroid/app/Application;

    .line 609
    invoke-virtual {v2}, Landroid/app/Application;->getPackageName()Ljava/lang/String;

    move-result-object v2

    .line 607
    invoke-static {v0, v1, v2}, Lorg/acdd/hack/AndroidHack;->getLoadedApk(Landroid/app/Application;Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;

    move-result-object v0

    .line 610
    if-nez v0, :cond_2c

    .line 611
    sget-object v0, Lorg/acdd/runtime/RuntimeVariables;->androidApplication:Landroid/app/Application;

    invoke-static {v0, v1}, Lorg/acdd/hack/AndroidHack;->createNewLoadedApk(Landroid/app/Application;Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v0

    .line 613
    if-nez v0, :cond_2c

    .line 614
    new-instance v0, Ljava/lang/RuntimeException;

    const-string v1, "can\'t create loadedApk"

    invoke-direct {v0, v1}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 618
    :cond_2c
    sget-object v1, Lorg/acdd/hack/ACDDHacks;->LoadedApk_mClassLoader:Lorg/acdd/hack/Hack$HackedField;

    .line 619
    invoke-virtual {v1, v0}, Lorg/acdd/hack/Hack$HackedField;->get(Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v1

    instance-of v1, v1, Lorg/acdd/runtime/DelegateClassLoader;

    if-nez v1, :cond_63

    .line 620
    sget-object v1, Lorg/acdd/hack/ACDDHacks;->LoadedApk_mClassLoader:Lorg/acdd/hack/Hack$HackedField;

    sget-object v2, Lorg/acdd/runtime/RuntimeVariables;->delegateClassLoader:Lorg/acdd/runtime/DelegateClassLoader;

    invoke-virtual {v1, v0, v2}, Lorg/acdd/hack/Hack$HackedField;->set(Ljava/lang/Object;Ljava/lang/Object;)V

    .line 622
    sget-object v1, Lorg/acdd/hack/ACDDHacks;->LoadedApk_mResources:Lorg/acdd/hack/Hack$HackedField;

    sget-object v2, Lorg/acdd/runtime/RuntimeVariables;->delegateResources:Landroid/content/res/Resources;

    invoke-virtual {v1, v0, v2}, Lorg/acdd/hack/Hack$HackedField;->set(Ljava/lang/Object;Ljava/lang/Object;)V

    .line 624
    sget-object v0, Lorg/acdd/hack/AndroidHack;->logger:Lorg/acdd/log/Logger;

    new-instance v1, Ljava/lang/StringBuilder;

    invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V

    const-string/jumbo v2, "reInject ClassLoader!!! "

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1

    sget-object v2, Lorg/acdd/runtime/RuntimeVariables;->androidApplication:Landroid/app/Application;

    invoke-virtual {v2}, Landroid/app/Application;->getPackageName()Ljava/lang/String;

    move-result-object v2

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1

    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v1

    invoke-interface {v0, v1}, Lorg/acdd/log/Logger;->error(Ljava/lang/String;)V

    .line 626
    :cond_63
    return-void
.end method

.method public static getActivityManager()Landroid/app/IActivityManager;
    .registers 1

    .prologue
    .line 183
    sget-object v0, Lorg/acdd/hack/AndroidHack;->_sActivityManager:Landroid/app/IActivityManager;

    return-object v0
.end method

.method public static getActivityThread()Ljava/lang/Object;
    .registers 4
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/lang/Exception;
        }
    .end annotation

    .prologue
    .line 561
    sget-object v0, Lorg/acdd/hack/AndroidHack;->_sActivityThread:Ljava/lang/Object;

    if-nez v0, :cond_28

    .line 562
    invoke-static {}, Ljava/lang/Thread;->currentThread()Ljava/lang/Thread;

    move-result-object v0

    invoke-virtual {v0}, Ljava/lang/Thread;->getId()J

    move-result-wide v0

    invoke-static {}, Landroid/os/Looper;->getMainLooper()Landroid/os/Looper;

    move-result-object v2

    .line 563
    invoke-virtual {v2}, Landroid/os/Looper;->getThread()Ljava/lang/Thread;

    move-result-object v2

    invoke-virtual {v2}, Ljava/lang/Thread;->getId()J

    move-result-wide v2

    cmp-long v0, v0, v2

    if-nez v0, :cond_2b

    .line 564
    sget-object v0, Lorg/acdd/hack/ACDDHacks;->ActivityThread_currentActivityThread:Lorg/acdd/hack/Hack$HackedMethod;

    const/4 v1, 0x0

    const/4 v2, 0x0

    new-array v2, v2, [Ljava/lang/Object;

    .line 565
    invoke-virtual {v0, v1, v2}, Lorg/acdd/hack/Hack$HackedMethod;->invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v0

    sput-object v0, Lorg/acdd/hack/AndroidHack;->_sActivityThread:Ljava/lang/Object;

    .line 574
    :cond_28
    :goto_28
    sget-object v0, Lorg/acdd/hack/AndroidHack;->_sActivityThread:Ljava/lang/Object;

    return-object v0

    .line 567
    :cond_2b
    new-instance v0, Landroid/os/Handler;

    invoke-static {}, Landroid/os/Looper;->getMainLooper()Landroid/os/Looper;

    move-result-object v1

    invoke-direct {v0, v1}, Landroid/os/Handler;-><init>(Landroid/os/Looper;)V

    .line 568
    sget-object v1, Lorg/acdd/hack/ACDDHacks;->ActivityThread_currentActivityThread:Lorg/acdd/hack/Hack$HackedMethod;

    monitor-enter v1

    .line 569
    :try_start_37
    new-instance v2, Lorg/acdd/hack/AndroidHack$ActvityThreadGetter;

    invoke-direct {v2}, Lorg/acdd/hack/AndroidHack$ActvityThreadGetter;-><init>()V

    invoke-virtual {v0, v2}, Landroid/os/Handler;->post(Ljava/lang/Runnable;)Z

    .line 570
    sget-object v0, Lorg/acdd/hack/ACDDHacks;->ActivityThread_currentActivityThread:Lorg/acdd/hack/Hack$HackedMethod;

    invoke-virtual {v0}, Ljava/lang/Object;->wait()V

    .line 571
    monitor-exit v1

    goto :goto_28

    :catchall_46
    move-exception v0

    monitor-exit v1
    :try_end_48
    .catchall {:try_start_37 .. :try_end_48} :catchall_46

    throw v0
.end method

.method static getHMember(Ljava/lang/Class;Ljava/lang/String;)I
    .registers 5

    .prologue
    .line 133
    const/4 v0, -0x1

    .line 134
    if-nez p0, :cond_4

    .line 147
    :goto_3
    return v0

    .line 138
    :cond_4
    :try_start_4
    invoke-virtual {p0, p1}, Ljava/lang/Class;->getDeclaredField(Ljava/lang/String;)Ljava/lang/reflect/Field;

    move-result-object v1

    .line 139
    const/4 v2, 0x1

    invoke-virtual {v1, v2}, Ljava/lang/reflect/Field;->setAccessible(Z)V

    .line 140
    const/4 v2, 0x0

    invoke-virtual {v1, v2}, Ljava/lang/reflect/Field;->getInt(Ljava/lang/Object;)I
    :try_end_10
    .catch Ljava/lang/NoSuchFieldException; {:try_start_4 .. :try_end_10} :catch_12
    .catch Ljava/lang/IllegalAccessException; {:try_start_4 .. :try_end_10} :catch_17

    move-result v0

    goto :goto_3

    .line 142
    :catch_12
    move-exception v1

    .line 143
    invoke-virtual {v1}, Ljava/lang/NoSuchFieldException;->printStackTrace()V

    goto :goto_3

    .line 144
    :catch_17
    move-exception v1

    .line 145
    invoke-virtual {v1}, Ljava/lang/IllegalAccessException;->printStackTrace()V

    goto :goto_3
.end method

.method static getHandlerHack(Landroid/os/Handler;Ljava/lang/Object;)Lorg/acdd/hack/AndroidHack$HandlerHack;
    .registers 4

    .prologue
    .line 519
    const-class v1, Lorg/acdd/hack/AndroidHack;

    monitor-enter v1

    .line 520
    :try_start_3
    sget-object v0, Lorg/acdd/hack/AndroidHack;->sHandlerHack:Lorg/acdd/hack/AndroidHack$HandlerHack;

    if-nez v0, :cond_e

    .line 521
    new-instance v0, Lorg/acdd/hack/AndroidHack$HandlerHack;

    invoke-direct {v0, p0, p1}, Lorg/acdd/hack/AndroidHack$HandlerHack;-><init>(Landroid/os/Handler;Ljava/lang/Object;)V

    sput-object v0, Lorg/acdd/hack/AndroidHack;->sHandlerHack:Lorg/acdd/hack/AndroidHack$HandlerHack;

    .line 523
    :cond_e
    sget-object v0, Lorg/acdd/hack/AndroidHack;->sHandlerHack:Lorg/acdd/hack/AndroidHack$HandlerHack;

    monitor-exit v1

    return-object v0

    .line 524
    :catchall_12
    move-exception v0

    monitor-exit v1
    :try_end_14
    .catchall {:try_start_3 .. :try_end_14} :catchall_12

    throw v0
.end method

.method public static declared-synchronized getIContentProvider(Ljava/lang/String;)Landroid/content/IContentProvider;
    .registers 4

    .prologue
    .line 224
    const-class v1, Lorg/acdd/hack/AndroidHack;

    monitor-enter v1

    :try_start_3
    invoke-static {p0}, Landroid/text/TextUtils;->isEmpty(Ljava/lang/CharSequence;)Z

    move-result v0

    if-eqz v0, :cond_11

    .line 225
    sget-object v0, Lorg/acdd/runtime/RuntimeVariables;->androidApplication:Landroid/app/Application;

    invoke-virtual {v0}, Landroid/app/Application;->getApplicationInfo()Landroid/content/pm/ApplicationInfo;

    move-result-object v0

    iget-object p0, v0, Landroid/content/pm/ApplicationInfo;->processName:Ljava/lang/String;

    .line 227
    :cond_11
    sget-object v0, Lorg/acdd/hack/AndroidHack;->_sIContentProviders:Ljava/util/HashMap;

    invoke-virtual {v0, p0}, Ljava/util/HashMap;->containsKey(Ljava/lang/Object;)Z

    move-result v0

    if-eqz v0, :cond_23

    .line 228
    sget-object v0, Lorg/acdd/hack/AndroidHack;->_sIContentProviders:Ljava/util/HashMap;

    invoke-virtual {v0, p0}, Ljava/util/HashMap;->get(Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Landroid/content/IContentProvider;
    :try_end_21
    .catchall {:try_start_3 .. :try_end_21} :catchall_33

    .line 235
    :cond_21
    :goto_21
    monitor-exit v1

    return-object v0

    .line 230
    :cond_23
    :try_start_23
    invoke-static {p0}, Lorg/acdd/hack/AndroidHack;->createHostStubUriByProcessName(Ljava/lang/String;)Landroid/net/Uri;

    move-result-object v0

    .line 231
    invoke-static {v0}, Lorg/acdd/hack/AndroidHack;->hookIContentProviderAsNeeded(Landroid/net/Uri;)Landroid/content/IContentProvider;

    move-result-object v0

    .line 232
    if-eqz v0, :cond_21

    .line 233
    sget-object v2, Lorg/acdd/hack/AndroidHack;->_sIContentProviders:Ljava/util/HashMap;

    invoke-virtual {v2, p0, v0}, Ljava/util/HashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
    :try_end_32
    .catchall {:try_start_23 .. :try_end_32} :catchall_33

    goto :goto_21

    .line 224
    :catchall_33
    move-exception v0

    monitor-exit v1

    throw v0
.end method

.method public static getInstrumentation()Landroid/app/Instrumentation;
    .registers 2
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/lang/Exception;
        }
    .end annotation

    .prologue
    .line 766
    invoke-static {}, Lorg/acdd/hack/AndroidHack;->getActivityThread()Ljava/lang/Object;

    move-result-object v0

    .line 767
    if-eqz v0, :cond_f

    .line 768
    sget-object v1, Lorg/acdd/hack/ACDDHacks;->ActivityThread_mInstrumentation:Lorg/acdd/hack/Hack$HackedField;

    .line 769
    invoke-virtual {v1, v0}, Lorg/acdd/hack/Hack$HackedField;->get(Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Landroid/app/Instrumentation;

    .line 768
    return-object v0

    .line 771
    :cond_f
    new-instance v0, Ljava/lang/Exception;

    const-string v1, "Failed to get ActivityThread.sCurrentActivityThread"

    invoke-direct {v0, v1}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V

    throw v0
.end method

.method public static getLoadedApk(Landroid/app/Application;Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
    .registers 5

    .prologue
    .line 630
    sget-object v0, Lorg/acdd/hack/ACDDHacks;->ActivityThread_mPackages:Lorg/acdd/hack/Hack$HackedField;

    .line 631
    invoke-virtual {v0, p1}, Lorg/acdd/hack/Hack$HackedField;->get(Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/util/Map;

    invoke-interface {v0, p2}, Ljava/util/Map;->get(Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/lang/ref/WeakReference;

    .line 632
    if-eqz v0, :cond_16

    invoke-virtual {v0}, Ljava/lang/ref/WeakReference;->get()Ljava/lang/Object;

    move-result-object v1

    if-nez v1, :cond_18

    .line 633
    :cond_16
    const/4 v0, 0x0

    .line 636
    :goto_17
    return-object v0

    .line 635
    :cond_18
    invoke-virtual {v0}, Ljava/lang/ref/WeakReference;->get()Ljava/lang/Object;

    move-result-object v0

    sput-object v0, Lorg/acdd/hack/AndroidHack;->_mLoadedApk:Ljava/lang/Object;

    .line 636
    sget-object v0, Lorg/acdd/hack/AndroidHack;->_mLoadedApk:Ljava/lang/Object;

    goto :goto_17
.end method

.method public static hackH()Landroid/os/Handler;
    .registers 4
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/lang/Exception;
        }
    .end annotation

    .prologue
    .line 581
    invoke-static {}, Lorg/acdd/hack/AndroidHack;->getActivityThread()Ljava/lang/Object;

    move-result-object v1

    .line 582
    if-nez v1, :cond_e

    .line 583
    new-instance v0, Ljava/lang/Exception;

    const-string v1, "Failed to get ActivityThread.sCurrentActivityThread"

    invoke-direct {v0, v1}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V

    throw v0

    .line 587
    :cond_e
    :try_start_e
    sget-object v0, Lorg/acdd/hack/ACDDHacks;->ActivityThread:Lorg/acdd/hack/Hack$HackedClass;

    const-string v2, "mH"

    .line 588
    invoke-virtual {v0, v2}, Lorg/acdd/hack/Hack$HackedClass;->field(Ljava/lang/String;)Lorg/acdd/hack/Hack$HackedField;

    move-result-object v0

    const-string v2, "android.app.ActivityThread$H"

    .line 589
    invoke-static {v2}, Lorg/acdd/hack/Hack;->into(Ljava/lang/String;)Lorg/acdd/hack/Hack$HackedClass;

    move-result-object v2

    .line 590
    invoke-virtual {v2}, Lorg/acdd/hack/Hack$HackedClass;->getmClass()Ljava/lang/Class;

    move-result-object v2

    .line 589
    invoke-virtual {v0, v2}, Lorg/acdd/hack/Hack$HackedField;->ofType(Ljava/lang/Class;)Lorg/acdd/hack/Hack$HackedField;

    move-result-object v0

    .line 590
    invoke-virtual {v0, v1}, Lorg/acdd/hack/Hack$HackedField;->get(Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Landroid/os/Handler;

    .line 591
    const-class v2, Landroid/os/Handler;

    const-string v3, "mCallback"

    invoke-virtual {v2, v3}, Ljava/lang/Class;->getDeclaredField(Ljava/lang/String;)Ljava/lang/reflect/Field;

    move-result-object v2

    .line 592
    const/4 v3, 0x1

    invoke-virtual {v2, v3}, Ljava/lang/reflect/Field;->setAccessible(Z)V

    .line 593
    invoke-static {v0, v1}, Lorg/acdd/hack/AndroidHack;->getHandlerHack(Landroid/os/Handler;Ljava/lang/Object;)Lorg/acdd/hack/AndroidHack$HandlerHack;

    move-result-object v1

    invoke-virtual {v2, v0, v1}, Ljava/lang/reflect/Field;->set(Ljava/lang/Object;Ljava/lang/Object;)V
    :try_end_3d
    .catch Lorg/acdd/hack/Hack$HackDeclaration$HackAssertionException; {:try_start_e .. :try_end_3d} :catch_3f

    .line 598
    :goto_3d
    const/4 v0, 0x0

    return-object v0

    .line 595
    :catch_3f
    move-exception v0

    .line 596
    invoke-virtual {v0}, Lorg/acdd/hack/Hack$HackDeclaration$HackAssertionException;->printStackTrace()V

    goto :goto_3d
.end method

.method private static handlerLaunchActivityForP(Landroid/content/Intent;Landroid/content/pm/ActivityInfo;)V
    .registers 5
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/lang/Exception;
        }
    .end annotation

    .prologue
    .line 490
    sget-object v0, Lorg/acdd/runtime/RuntimeVariables;->delegateClassLoader:Lorg/acdd/runtime/DelegateClassLoader;

    invoke-virtual {p0, v0}, Landroid/content/Intent;->setExtrasClassLoader(Ljava/lang/ClassLoader;)V

    .line 491
    invoke-virtual {p0}, Landroid/content/Intent;->getComponent()Landroid/content/ComponentName;

    move-result-object v0

    invoke-virtual {v0}, Landroid/content/ComponentName;->getClassName()Ljava/lang/String;

    move-result-object v1

    .line 492
    invoke-static {}, Lorg/acdd/bundleInfo/BundleInfoList;->getInstance()Lorg/acdd/bundleInfo/BundleInfoList;

    move-result-object v0

    invoke-virtual {v0, v1}, Lorg/acdd/bundleInfo/BundleInfoList;->getBundleNameForComponet(Ljava/lang/String;)Ljava/lang/String;

    move-result-object v2

    .line 494
    if-eqz v2, :cond_35

    .line 495
    invoke-static {v2}, Lorg/acdd/framework/BundleManager;->getBundle(Ljava/lang/String;)Lorg/osgi/framework/Bundle;

    move-result-object v0

    .line 496
    if-nez v0, :cond_2d

    .line 497
    invoke-static {v2}, Lorg/acdd/framework/Framework;->tryLoadBundleInstance(Ljava/lang/String;)Lorg/osgi/framework/Bundle;

    move-result-object v0

    .line 498
    if-nez v0, :cond_2d

    .line 499
    invoke-static {v2}, Lorg/acdd/hack/AndroidHack;->installPlugin(Ljava/lang/String;)V

    .line 500
    invoke-static {v1}, Lorg/acdd/runtime/ClassLoadFromBundle;->checkInstallBundleIfNeed(Ljava/lang/String;)V

    .line 501
    invoke-static {v2}, Lorg/acdd/framework/BundleManager;->getBundle(Ljava/lang/String;)Lorg/osgi/framework/Bundle;

    move-result-object v0

    .line 504
    :cond_2d
    if-eqz v0, :cond_35

    .line 505
    invoke-interface {v0}, Lorg/osgi/framework/Bundle;->start()V

    .line 506
    invoke-static {v2, v0}, Lorg/acdd/hack/AndroidHack;->initPluginModule(Ljava/lang/String;Lorg/osgi/framework/Bundle;)V

    .line 509
    :cond_35
    invoke-static {v1}, Lorg/acdd/runtime/ActivityProxyHook;->isPluginComponentName(Ljava/lang/String;)Z

    move-result v0

    if-eqz v0, :cond_45

    .line 510
    sget-object v0, Lorg/acdd/runtime/RuntimeVariables;->androidApplication:Landroid/app/Application;

    invoke-static {v0, p0}, Lorg/acdd/runtime/ActivityProxyHook;->getTheme(Landroid/content/Context;Landroid/content/Intent;)I

    move-result v0

    .line 511
    if-eqz v0, :cond_45

    .line 512
    iput v0, p1, Landroid/content/pm/ActivityInfo;->theme:I

    .line 515
    :cond_45
    invoke-static {}, Lorg/acdd/framework/ACDD;->getInstance()Lorg/acdd/framework/ACDD;

    move-result-object v0

    invoke-virtual {v0, v1}, Lorg/acdd/framework/ACDD;->setFirstUIActName(Ljava/lang/String;)V

    .line 516
    return-void
.end method

.method private static hookIContentProviderAsNeeded(Landroid/net/Uri;)Landroid/content/IContentProvider;
    .registers 8

    .prologue
    const/4 v3, 0x0

    .line 258
    :try_start_1
    sget-object v1, Lorg/acdd/runtime/RuntimeVariables;->androidApplication:Landroid/app/Application;

    invoke-virtual {v1}, Landroid/app/Application;->getPackageManager()Landroid/content/pm/PackageManager;

    move-result-object v1

    invoke-virtual {p0}, Landroid/net/Uri;->getAuthority()Ljava/lang/String;

    move-result-object v2

    const/4 v4, 0x0

    invoke-virtual {v1, v2, v4}, Landroid/content/pm/PackageManager;->resolveContentProvider(Ljava/lang/String;I)Landroid/content/pm/ProviderInfo;

    .line 259
    sget-object v1, Lorg/acdd/runtime/RuntimeVariables;->androidApplication:Landroid/app/Application;

    invoke-virtual {v1}, Landroid/app/Application;->getContentResolver()Landroid/content/ContentResolver;

    move-result-object v1

    const-string/jumbo v2, "wakeup"

    const/4 v4, 0x0

    const/4 v5, 0x0

    invoke-virtual {v1, p0, v2, v4, v5}, Landroid/content/ContentResolver;->call(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;

    .line 262
    invoke-static {}, Lorg/acdd/hack/AndroidHack;->getActivityThread()Ljava/lang/Object;

    move-result-object v1

    check-cast v1, Landroid/app/ActivityThread;

    .line 263
    invoke-virtual {v1}, Ljava/lang/Object;->getClass()Ljava/lang/Class;

    move-result-object v2

    const-string v4, "mProviderMap"

    invoke-static {v2, v1, v4}, Lorg/acdd/hack/Reflect;->getField(Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;

    move-result-object v1

    check-cast v1, Ljava/util/Map;

    .line 264
    invoke-interface {v1}, Ljava/util/Map;->entrySet()Ljava/util/Set;

    move-result-object v1

    invoke-interface {v1}, Ljava/util/Set;->iterator()Ljava/util/Iterator;

    move-result-object v5

    move-object v4, v3

    .line 265
    :goto_38
    invoke-interface {v5}, Ljava/util/Iterator;->hasNext()Z

    move-result v1

    if-eqz v1, :cond_9c

    .line 266
    invoke-interface {v5}, Ljava/util/Iterator;->next()Ljava/lang/Object;

    move-result-object v1

    check-cast v1, Ljava/util/Map$Entry;

    .line 267
    invoke-interface {v1}, Ljava/util/Map$Entry;->getKey()Ljava/lang/Object;

    move-result-object v2

    .line 268
    invoke-interface {v1}, Ljava/util/Map$Entry;->getValue()Ljava/lang/Object;

    move-result-object v6

    .line 270
    instance-of v1, v2, Ljava/lang/String;

    if-eqz v1, :cond_7d

    .line 271
    move-object v0, v2

    check-cast v0, Ljava/lang/String;

    move-object v1, v0

    move-object v2, v1

    move-object v1, v4

    .line 279
    :goto_56
    invoke-virtual {p0}, Landroid/net/Uri;->getAuthority()Ljava/lang/String;

    move-result-object v4

    invoke-virtual {v2, v4}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

    move-result v2

    if-eqz v2, :cond_96

    .line 280
    if-nez v3, :cond_9e

    .line 281
    invoke-virtual {v6}, Ljava/lang/Object;->getClass()Ljava/lang/Class;

    move-result-object v1

    const-string v2, "mProvider"

    invoke-virtual {v1, v2}, Ljava/lang/Class;->getDeclaredField(Ljava/lang/String;)Ljava/lang/reflect/Field;

    move-result-object v1

    .line 282
    const/4 v2, 0x1

    invoke-virtual {v1, v2}, Ljava/lang/reflect/Field;->setAccessible(Z)V

    .line 284
    :goto_70
    invoke-virtual {v1, v6}, Ljava/lang/reflect/Field;->get(Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v1

    check-cast v1, Landroid/content/IContentProvider;

    .line 285
    sget-object v2, Lorg/acdd/runtime/RuntimeVariables;->androidApplication:Landroid/app/Application;

    invoke-static {v2, v1, p0}, Lorg/acdd/android/proxy/ContentProviderProxy;->newInstance(Landroid/content/Context;Landroid/content/IContentProvider;Landroid/net/Uri;)Landroid/content/IContentProvider;

    move-result-object v1

    .line 292
    :goto_7c
    return-object v1

    .line 273
    :cond_7d
    if-nez v4, :cond_8d

    .line 274
    invoke-virtual {v2}, Ljava/lang/Object;->getClass()Ljava/lang/Class;

    move-result-object v1

    const-string v4, "authority"

    invoke-virtual {v1, v4}, Ljava/lang/Class;->getDeclaredField(Ljava/lang/String;)Ljava/lang/reflect/Field;

    move-result-object v4

    .line 275
    const/4 v1, 0x1

    invoke-virtual {v4, v1}, Ljava/lang/reflect/Field;->setAccessible(Z)V

    .line 277
    :cond_8d
    invoke-virtual {v4, v2}, Ljava/lang/reflect/Field;->get(Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v1

    check-cast v1, Ljava/lang/String;
    :try_end_93
    .catch Ljava/lang/Exception; {:try_start_1 .. :try_end_93} :catch_98

    move-object v2, v1

    move-object v1, v4

    goto :goto_56

    :cond_96
    move-object v4, v1

    .line 288
    goto :goto_38

    .line 289
    :catch_98
    move-exception v1

    .line 290
    invoke-virtual {v1}, Ljava/lang/Exception;->printStackTrace()V

    :cond_9c
    move-object v1, v3

    .line 292
    goto :goto_7c

    :cond_9e
    move-object v1, v3

    goto :goto_70
.end method

.method static initPluginModule(Ljava/lang/String;Lorg/osgi/framework/Bundle;)V
    .registers 3

    .prologue
    .line 169
    sget-object v0, Lorg/acdd/hack/AndroidHack;->sPluginInitializers:Ljava/util/concurrent/ConcurrentHashMap;

    invoke-virtual {v0, p0}, Ljava/util/concurrent/ConcurrentHashMap;->get(Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Lorg/acdd/android/initializer/IPluginInitializer;

    .line 170
    if-eqz v0, :cond_d

    .line 171
    invoke-interface {v0, p1}, Lorg/acdd/android/initializer/IPluginInitializer;->initModule(Lorg/osgi/framework/Bundle;)V

    .line 173
    :cond_d
    return-void
.end method

.method public static injectAMSForO()V
    .registers 6

    .prologue
    .line 211
    :try_start_0
    const-class v0, Landroid/app/ActivityManager;

    const/4 v1, 0x0

    const-string v2, "IActivityManagerSingleton"

    invoke-static {v0, v1, v2}, Lorg/acdd/hack/Reflect;->getField(Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Landroid/util/Singleton;

    .line 214
    new-instance v1, Lorg/acdd/hack/Hack$HackedClass;

    const-string/jumbo v2, "org.acdd.android.proxy.ActivityManagerProxy"

    const/4 v3, 0x1

    const-class v4, Lorg/acdd/hack/AndroidHack;

    invoke-virtual {v4}, Ljava/lang/Class;->getClassLoader()Ljava/lang/ClassLoader;

    move-result-object v4

    invoke-static {v2, v3, v4}, Ljava/lang/Class;->forName(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;

    move-result-object v2

    invoke-direct {v1, v2}, Lorg/acdd/hack/Hack$HackedClass;-><init>(Ljava/lang/Class;)V

    .line 215
    const-string v2, "newInstance"

    const/4 v3, 0x1

    new-array v3, v3, [Ljava/lang/Class;

    const/4 v4, 0x0

    const-class v5, Landroid/app/IActivityManager;

    aput-object v5, v3, v4

    invoke-virtual {v1, v2, v3}, Lorg/acdd/hack/Hack$HackedClass;->staticMethod(Ljava/lang/String;[Ljava/lang/Class;)Lorg/acdd/hack/Hack$HackedMethod;

    move-result-object v1

    const/4 v2, 0x0

    const/4 v3, 0x1

    new-array v3, v3, [Ljava/lang/Object;

    const/4 v4, 0x0

    invoke-virtual {v0}, Landroid/util/Singleton;->get()Ljava/lang/Object;

    move-result-object v5

    aput-object v5, v3, v4

    invoke-virtual {v1, v2, v3}, Lorg/acdd/hack/Hack$HackedMethod;->invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v1

    check-cast v1, Landroid/app/IActivityManager;

    .line 217
    invoke-virtual {v0}, Ljava/lang/Object;->getClass()Ljava/lang/Class;

    move-result-object v2

    invoke-virtual {v2}, Ljava/lang/Class;->getSuperclass()Ljava/lang/Class;

    move-result-object v2

    const-string v3, "mInstance"

    invoke-static {v2, v0, v3, v1}, Lorg/acdd/hack/Reflect;->setField(Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V
    :try_end_4a
    .catch Ljava/lang/Throwable; {:try_start_0 .. :try_end_4a} :catch_4b

    .line 221
    :goto_4a
    return-void

    .line 218
    :catch_4b
    move-exception v0

    .line 219
    invoke-virtual {v0}, Ljava/lang/Throwable;->printStackTrace()V

    goto :goto_4a
.end method

.method public static injectApplication(Ljava/lang/String;Landroid/app/Application;)V
    .registers 5
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/lang/Exception;
        }
    .end annotation

    .prologue
    .line 704
    invoke-static {}, Lorg/acdd/hack/AndroidHack;->getActivityThread()Ljava/lang/Object;

    move-result-object v0

    .line 705
    if-nez v0, :cond_e

    .line 706
    new-instance v0, Ljava/lang/Exception;

    const-string v1, "Failed to get ActivityThread.sCurrentActivityThread"

    invoke-direct {v0, v1}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V

    throw v0

    .line 710
    :cond_e
    invoke-virtual {p1}, Landroid/app/Application;->getPackageName()Ljava/lang/String;

    move-result-object v1

    .line 709
    invoke-static {p1, v0, v1}, Lorg/acdd/hack/AndroidHack;->getLoadedApk(Landroid/app/Application;Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;

    move-result-object v1

    .line 711
    if-nez v1, :cond_20

    .line 712
    new-instance v0, Ljava/lang/Exception;

    const-string v1, "Failed to get ActivityThread.mLoadedApk"

    invoke-direct {v0, v1}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V

    throw v0

    .line 714
    :cond_20
    sget-object v2, Lorg/acdd/hack/ACDDHacks;->LoadedApk_mApplication:Lorg/acdd/hack/Hack$HackedField;

    invoke-virtual {v2, v1, p1}, Lorg/acdd/hack/Hack$HackedField;->set(Ljava/lang/Object;Ljava/lang/Object;)V

    .line 715
    sget-object v1, Lorg/acdd/hack/ACDDHacks;->ActivityThread_mInitialApplication:Lorg/acdd/hack/Hack$HackedField;

    invoke-virtual {v1, v0, p1}, Lorg/acdd/hack/Hack$HackedField;->set(Ljava/lang/Object;Ljava/lang/Object;)V

    .line 717
    return-void
.end method

.method public static injectClassLoader(Ljava/lang/String;Ljava/lang/ClassLoader;)V
    .registers 5
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/lang/Exception;
        }
    .end annotation

    .prologue
    .line 684
    invoke-static {}, Lorg/acdd/hack/AndroidHack;->getActivityThread()Ljava/lang/Object;

    move-result-object v1

    .line 685
    if-nez v1, :cond_e

    .line 686
    new-instance v0, Ljava/lang/Exception;

    const-string v1, "Failed to get ActivityThread.sCurrentActivityThread"

    invoke-direct {v0, v1}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V

    throw v0

    .line 689
    :cond_e
    sget-object v0, Lorg/acdd/runtime/RuntimeVariables;->androidApplication:Landroid/app/Application;

    invoke-static {v0, v1, p0}, Lorg/acdd/hack/AndroidHack;->getLoadedApk(Landroid/app/Application;Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;

    move-result-object v0

    .line 691
    if-nez v0, :cond_1c

    .line 692
    sget-object v0, Lorg/acdd/runtime/RuntimeVariables;->androidApplication:Landroid/app/Application;

    invoke-static {v0, v1}, Lorg/acdd/hack/AndroidHack;->createNewLoadedApk(Landroid/app/Application;Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v0

    .line 695
    :cond_1c
    if-nez v0, :cond_26

    .line 696
    new-instance v0, Ljava/lang/Exception;

    const-string v1, "Failed to get ActivityThread.mLoadedApk"

    invoke-direct {v0, v1}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V

    throw v0

    .line 698
    :cond_26
    sget-object v1, Lorg/acdd/hack/ACDDHacks;->LoadedApk_mClassLoader:Lorg/acdd/hack/Hack$HackedField;

    invoke-virtual {v1, v0, p1}, Lorg/acdd/hack/Hack$HackedField;->set(Ljava/lang/Object;Ljava/lang/Object;)V

    .line 699
    const-string v0, "CMPlugin"

    new-instance v1, Ljava/lang/StringBuilder;

    invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V

    const-string v2, "injectClassLoader for:"

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1

    invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1

    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v1

    invoke-static {v0, v1}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I

    .line 700
    return-void
.end method

.method public static injectContextHook(Landroid/content/ContextWrapper;Landroid/content/ContextWrapper;)V
    .registers 3

    .prologue
    .line 794
    sget-object v0, Lorg/acdd/hack/ACDDHacks;->ContextWrapper_mBase:Lorg/acdd/hack/Hack$HackedField;

    invoke-virtual {v0, p0, p1}, Lorg/acdd/hack/Hack$HackedField;->set(Ljava/lang/Object;Ljava/lang/Object;)V

    .line 795
    return-void
.end method

.method public static injectInstrumentationHook(Landroid/app/Instrumentation;)V
    .registers 3
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/lang/Exception;
        }
    .end annotation

    .prologue
    .line 782
    invoke-static {}, Lorg/acdd/hack/AndroidHack;->getActivityThread()Ljava/lang/Object;

    move-result-object v0

    .line 783
    if-nez v0, :cond_e

    .line 784
    new-instance v0, Ljava/lang/Exception;

    const-string v1, "Failed to get ActivityThread.sCurrentActivityThread"

    invoke-direct {v0, v1}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V

    throw v0

    .line 787
    :cond_e
    sget-object v1, Lorg/acdd/hack/ACDDHacks;->ActivityThread_mInstrumentation:Lorg/acdd/hack/Hack$HackedField;

    invoke-virtual {v1, v0, p0}, Lorg/acdd/hack/Hack$HackedField;->set(Ljava/lang/Object;Ljava/lang/Object;)V

    .line 789
    return-void
.end method

.method public static injectResources(Landroid/app/Application;Landroid/content/res/Resources;)V
    .registers 5
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/lang/Exception;
        }
    .end annotation

    .prologue
    .line 729
    invoke-static {}, Lorg/acdd/hack/AndroidHack;->getActivityThread()Ljava/lang/Object;

    move-result-object v1

    .line 730
    if-nez v1, :cond_e

    .line 731
    new-instance v0, Ljava/lang/Exception;

    const-string v1, "Failed to get ActivityThread.sCurrentActivityThread"

    invoke-direct {v0, v1}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V

    throw v0

    .line 735
    :cond_e
    invoke-virtual {p0}, Landroid/app/Application;->getPackageName()Ljava/lang/String;

    move-result-object v0

    .line 734
    invoke-static {p0, v1, v0}, Lorg/acdd/hack/AndroidHack;->getLoadedApk(Landroid/app/Application;Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;

    move-result-object v0

    .line 736
    if-nez v0, :cond_37

    .line 737
    invoke-static {p0, v1}, Lorg/acdd/hack/AndroidHack;->createNewLoadedApk(Landroid/app/Application;Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v0

    .line 738
    if-nez v0, :cond_26

    .line 739
    new-instance v0, Ljava/lang/RuntimeException;

    const-string v1, "Failed to get ActivityThread.mLoadedApk"

    invoke-direct {v0, v1}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 742
    :cond_26
    sget-object v1, Lorg/acdd/hack/ACDDHacks;->LoadedApk_mClassLoader:Lorg/acdd/hack/Hack$HackedField;

    .line 743
    invoke-virtual {v1, v0}, Lorg/acdd/hack/Hack$HackedField;->get(Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v1

    instance-of v1, v1, Lorg/acdd/runtime/DelegateClassLoader;

    if-nez v1, :cond_37

    .line 744
    sget-object v1, Lorg/acdd/hack/ACDDHacks;->LoadedApk_mClassLoader:Lorg/acdd/hack/Hack$HackedField;

    sget-object v2, Lorg/acdd/runtime/RuntimeVariables;->delegateClassLoader:Lorg/acdd/runtime/DelegateClassLoader;

    invoke-virtual {v1, v0, v2}, Lorg/acdd/hack/Hack$HackedField;->set(Ljava/lang/Object;Ljava/lang/Object;)V

    .line 750
    :cond_37
    sget-object v1, Lorg/acdd/hack/ACDDHacks;->LoadedApk_mResources:Lorg/acdd/hack/Hack$HackedField;

    invoke-virtual {v1, v0, p1}, Lorg/acdd/hack/Hack$HackedField;->set(Ljava/lang/Object;Ljava/lang/Object;)V

    .line 751
    sget-object v0, Lorg/acdd/hack/ACDDHacks;->ContextImpl_mResources:Lorg/acdd/hack/Hack$HackedField;

    invoke-virtual {p0}, Landroid/app/Application;->getBaseContext()Landroid/content/Context;

    move-result-object v1

    invoke-virtual {v0, v1, p1}, Lorg/acdd/hack/Hack$HackedField;->set(Ljava/lang/Object;Ljava/lang/Object;)V

    .line 753
    sget-object v0, Lorg/acdd/hack/AndroidHack;->sHandler:Landroid/os/Handler;

    new-instance v1, Lorg/acdd/hack/AndroidHack$1;

    invoke-direct {v1, p0}, Lorg/acdd/hack/AndroidHack$1;-><init>(Landroid/app/Application;)V

    invoke-virtual {v0, v1}, Landroid/os/Handler;->post(Ljava/lang/Runnable;)Z

    .line 759
    invoke-static {p1}, Lorg/acdd/runtime/ActivityResourceManager;->injectActivitysResource(Landroid/content/res/Resources;)V

    .line 760
    return-void
.end method

.method public static injectSystemServices()V
    .registers 6

    .prologue
    .line 191
    :try_start_0
    const-class v0, Landroid/app/ActivityManagerNative;

    const/4 v1, 0x0

    const-string v2, "gDefault"

    invoke-static {v0, v1, v2}, Lorg/acdd/hack/Reflect;->getField(Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Landroid/util/Singleton;

    .line 194
    new-instance v1, Lorg/acdd/hack/Hack$HackedClass;

    const-string/jumbo v2, "org.acdd.android.proxy.ActivityManagerProxy"

    const/4 v3, 0x1

    const-class v4, Lorg/acdd/hack/AndroidHack;

    invoke-virtual {v4}, Ljava/lang/Class;->getClassLoader()Ljava/lang/ClassLoader;

    move-result-object v4

    invoke-static {v2, v3, v4}, Ljava/lang/Class;->forName(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;

    move-result-object v2

    invoke-direct {v1, v2}, Lorg/acdd/hack/Hack$HackedClass;-><init>(Ljava/lang/Class;)V

    .line 195
    const-string v2, "newInstance"

    const/4 v3, 0x1

    new-array v3, v3, [Ljava/lang/Class;

    const/4 v4, 0x0

    const-class v5, Landroid/app/IActivityManager;

    aput-object v5, v3, v4

    invoke-virtual {v1, v2, v3}, Lorg/acdd/hack/Hack$HackedClass;->staticMethod(Ljava/lang/String;[Ljava/lang/Class;)Lorg/acdd/hack/Hack$HackedMethod;

    move-result-object v1

    const/4 v2, 0x0

    const/4 v3, 0x1

    new-array v3, v3, [Ljava/lang/Object;

    const/4 v4, 0x0

    invoke-virtual {v0}, Landroid/util/Singleton;->get()Ljava/lang/Object;

    move-result-object v5

    aput-object v5, v3, v4

    invoke-virtual {v1, v2, v3}, Lorg/acdd/hack/Hack$HackedMethod;->invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v1

    check-cast v1, Landroid/app/IActivityManager;

    .line 198
    invoke-virtual {v0}, Ljava/lang/Object;->getClass()Ljava/lang/Class;

    move-result-object v2

    invoke-virtual {v2}, Ljava/lang/Class;->getSuperclass()Ljava/lang/Class;

    move-result-object v2

    const-string v3, "mInstance"

    invoke-static {v2, v0, v3, v1}, Lorg/acdd/hack/Reflect;->setField(Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V

    .line 200
    invoke-virtual {v0}, Landroid/util/Singleton;->get()Ljava/lang/Object;

    move-result-object v0

    if-ne v0, v1, :cond_52

    .line 201
    sput-object v1, Lorg/acdd/hack/AndroidHack;->_sActivityManager:Landroid/app/IActivityManager;
    :try_end_52
    .catch Ljava/lang/Throwable; {:try_start_0 .. :try_end_52} :catch_53

    .line 206
    :cond_52
    :goto_52
    return-void

    .line 203
    :catch_53
    move-exception v0

    .line 204
    invoke-virtual {v0}, Ljava/lang/Throwable;->printStackTrace()V

    goto :goto_52
.end method

.method static installPlugin(Ljava/lang/String;)V
    .registers 2

    .prologue
    .line 176
    sget-object v0, Lorg/acdd/hack/AndroidHack;->sPluginInitializers:Ljava/util/concurrent/ConcurrentHashMap;

    invoke-virtual {v0, p0}, Ljava/util/concurrent/ConcurrentHashMap;->get(Ljava/lang/Object;)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Lorg/acdd/android/initializer/IPluginInitializer;

    .line 177
    if-eqz v0, :cond_d

    .line 178
    invoke-interface {v0, p0}, Lorg/acdd/android/initializer/IPluginInitializer;->installPlugin(Ljava/lang/String;)V

    .line 180
    :cond_d
    return-void
.end method

.method public static registerPluginInitializer(Ljava/lang/String;Lorg/acdd/android/initializer/IPluginInitializer;)V
    .registers 3

    .prologue
    .line 156
    sget-object v0, Lorg/acdd/hack/AndroidHack;->sPluginInitializers:Ljava/util/concurrent/ConcurrentHashMap;

    invoke-virtual {v0, p0, p1}, Ljava/util/concurrent/ConcurrentHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;

    .line 157
    return-void
.end method

.method public static unregisterPluginInitializer(Ljava/lang/String;)V
    .registers 2

    .prologue
    .line 164
    sget-object v0, Lorg/acdd/hack/AndroidHack;->sPluginInitializers:Ljava/util/concurrent/ConcurrentHashMap;

    invoke-virtual {v0, p0}, Ljava/util/concurrent/ConcurrentHashMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;

    .line 165
    return-void
.end method