TinkerHackInstrumentation.smali
.class public Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;
.super Landroid/app/Instrumentation;
# static fields
.field private static final TAG:Ljava/lang/String; = "Tinker.Instrumentation"
# instance fields
.field private final mActivityThread:Ljava/lang/Object;
.field private final mInstrumentationField:Ljava/lang/reflect/Field;
.field private final mOriginal:Landroid/app/Instrumentation;
# direct methods
.method private constructor <init>(Landroid/app/Instrumentation;Ljava/lang/Object;Ljava/lang/reflect/Field;)V
.registers 7
invoke-direct {p0}, Landroid/app/Instrumentation;-><init>()V
iput-object p1, p0, Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;->mOriginal:Landroid/app/Instrumentation;
iput-object p2, p0, Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;->mActivityThread:Ljava/lang/Object;
iput-object p3, p0, Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;->mInstrumentationField:Ljava/lang/reflect/Field;
:try_start_9
invoke-direct {p0, p1}, Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;->copyAllFields(Landroid/app/Instrumentation;)V
:try_end_c
.catch Ljava/lang/Throwable; {:try_start_9 .. :try_end_c} :catch_d
return-void
:catch_d
move-exception v0
new-instance v1, Lcom/tencent/tinker/loader/TinkerRuntimeException;
invoke-virtual {v0}, Ljava/lang/Throwable;->getMessage()Ljava/lang/String;
move-result-object v2
invoke-direct {v1, v2, v0}, Lcom/tencent/tinker/loader/TinkerRuntimeException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
throw v1
.end method
.method private copyAllFields(Landroid/app/Instrumentation;)V
.registers 6
const-class v0, Landroid/app/Instrumentation;
invoke-virtual {v0}, Ljava/lang/Class;->getDeclaredFields()[Ljava/lang/reflect/Field;
move-result-object v1
const/4 v0, 0x0
:goto_7
array-length v2, v1
if-ge v0, v2, :cond_1e
aget-object v2, v1, v0
const/4 v3, 0x1
invoke-virtual {v2, v3}, Ljava/lang/reflect/Field;->setAccessible(Z)V
aget-object v2, v1, v0
invoke-virtual {v2, p1}, Ljava/lang/reflect/Field;->get(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v2
aget-object v3, v1, v0
invoke-virtual {v3, p0, v2}, Ljava/lang/reflect/Field;->set(Ljava/lang/Object;Ljava/lang/Object;)V
add-int/lit8 v0, v0, 0x1
goto :goto_7
:cond_1e
return-void
.end method
.method public static create(Landroid/content/Context;)Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;
.registers 5
const/4 v0, 0x0
:try_start_1
invoke-static {p0, v0}, Lcom/tencent/tinker/loader/shareutil/ShareReflectUtil;->getActivityThread(Landroid/content/Context;Ljava/lang/Class;)Ljava/lang/Object;
move-result-object v2
const-string/jumbo v0, "mInstrumentation"
invoke-static {v2, v0}, Lcom/tencent/tinker/loader/shareutil/ShareReflectUtil;->findField(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/reflect/Field;
move-result-object v3
invoke-virtual {v3, v2}, Ljava/lang/reflect/Field;->get(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v0
check-cast v0, Landroid/app/Instrumentation;
instance-of v1, v0, Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;
if-eqz v1, :cond_19
check-cast v0, Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;
:goto_18
return-object v0
:cond_19
new-instance v1, Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;
invoke-direct {v1, v0, v2, v3}, Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;-><init>(Landroid/app/Instrumentation;Ljava/lang/Object;Ljava/lang/reflect/Field;)V
:try_end_1e
.catch Ljava/lang/Throwable; {:try_start_1 .. :try_end_1e} :catch_20
move-object v0, v1
goto :goto_18
:catch_20
move-exception v0
new-instance v1, Lcom/tencent/tinker/loader/TinkerRuntimeException;
const-string/jumbo v2, "see next stacktrace"
invoke-direct {v1, v2, v0}, Lcom/tencent/tinker/loader/TinkerRuntimeException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
throw v1
.end method
.method private fixActivityParams(Landroid/app/Activity;Landroid/content/pm/ActivityInfo;)V
.registers 6
iget v0, p2, Landroid/content/pm/ActivityInfo;->screenOrientation:I
invoke-virtual {p1, v0}, Landroid/app/Activity;->setRequestedOrientation(I)V
iget v0, p2, Landroid/content/pm/ActivityInfo;->theme:I
invoke-virtual {p1, v0}, Landroid/app/Activity;->setTheme(I)V
:try_start_a
const-string/jumbo v0, "mActivityInfo"
invoke-static {p1, v0}, Lcom/tencent/tinker/loader/shareutil/ShareReflectUtil;->findField(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/reflect/Field;
move-result-object v0
invoke-virtual {v0, p1, p2}, Ljava/lang/reflect/Field;->set(Ljava/lang/Object;Ljava/lang/Object;)V
:try_end_14
.catch Ljava/lang/Throwable; {:try_start_a .. :try_end_14} :catch_15
return-void
:catch_15
move-exception v0
new-instance v1, Lcom/tencent/tinker/loader/TinkerRuntimeException;
const-string/jumbo v2, "see next stacktrace."
invoke-direct {v1, v2, v0}, Lcom/tencent/tinker/loader/TinkerRuntimeException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
throw v1
.end method
.method private processIntent(Ljava/lang/ClassLoader;Landroid/content/Intent;)Z
.registers 8
const/4 v1, 0x0
if-nez p2, :cond_5
move v0, v1
:goto_4
return v0
:cond_5
invoke-static {p2, p1}, Lcom/tencent/tinker/loader/shareutil/ShareIntentUtil;->fixIntentClassLoader(Landroid/content/Intent;Ljava/lang/ClassLoader;)V
const-string/jumbo v0, "tinker_iek_old_component"
invoke-virtual {p2, v0}, Landroid/content/Intent;->getParcelableExtra(Ljava/lang/String;)Landroid/os/Parcelable;
move-result-object v0
check-cast v0, Landroid/content/ComponentName;
if-nez v0, :cond_3a
const-string/jumbo v0, "Tinker.Instrumentation"
new-instance v2, Ljava/lang/StringBuilder;
invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V
const-string/jumbo v3, "oldComponent was null, start "
invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v2
invoke-virtual {p2}, Landroid/content/Intent;->getComponent()Landroid/content/ComponentName;
move-result-object v3
invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
move-result-object v2
const-string/jumbo v3, " next."
invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v2
invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v2
invoke-static {v0, v2}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I
move v0, v1
goto :goto_4
:cond_3a
invoke-virtual {v0}, Landroid/content/ComponentName;->getClassName()Ljava/lang/String;
move-result-object v2
invoke-static {v2}, Lcom/tencent/tinker/loader/hotplug/IncrementComponentManager;->queryActivityInfo(Ljava/lang/String;)Landroid/content/pm/ActivityInfo;
move-result-object v3
if-nez v3, :cond_60
const-string/jumbo v0, "Tinker.Instrumentation"
new-instance v3, Ljava/lang/StringBuilder;
invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V
const-string/jumbo v4, "Failed to query target activity\'s info, perhaps the target is not hotpluged component. Target: "
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v3
invoke-virtual {v3, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v2
invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v2
invoke-static {v0, v2}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
move v0, v1
goto :goto_4
:cond_60
invoke-virtual {p2, v0}, Landroid/content/Intent;->setComponent(Landroid/content/ComponentName;)Landroid/content/Intent;
const-string/jumbo v0, "tinker_iek_old_component"
invoke-virtual {p2, v0}, Landroid/content/Intent;->removeExtra(Ljava/lang/String;)V
const/4 v0, 0x1
goto :goto_4
.end method
# virtual methods
.method public callActivityOnCreate(Landroid/app/Activity;Landroid/os/Bundle;)V
.registers 4
if-eqz p1, :cond_13
invoke-virtual {p1}, Ljava/lang/Object;->getClass()Ljava/lang/Class;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/Class;->getName()Ljava/lang/String;
move-result-object v0
invoke-static {v0}, Lcom/tencent/tinker/loader/hotplug/IncrementComponentManager;->queryActivityInfo(Ljava/lang/String;)Landroid/content/pm/ActivityInfo;
move-result-object v0
if-eqz v0, :cond_13
invoke-direct {p0, p1, v0}, Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;->fixActivityParams(Landroid/app/Activity;Landroid/content/pm/ActivityInfo;)V
:cond_13
invoke-super {p0, p1, p2}, Landroid/app/Instrumentation;->callActivityOnCreate(Landroid/app/Activity;Landroid/os/Bundle;)V
return-void
.end method
.method public callActivityOnCreate(Landroid/app/Activity;Landroid/os/Bundle;Landroid/os/PersistableBundle;)V
.registers 5
if-eqz p1, :cond_13
invoke-virtual {p1}, Ljava/lang/Object;->getClass()Ljava/lang/Class;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/Class;->getName()Ljava/lang/String;
move-result-object v0
invoke-static {v0}, Lcom/tencent/tinker/loader/hotplug/IncrementComponentManager;->queryActivityInfo(Ljava/lang/String;)Landroid/content/pm/ActivityInfo;
move-result-object v0
if-eqz v0, :cond_13
invoke-direct {p0, p1, v0}, Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;->fixActivityParams(Landroid/app/Activity;Landroid/content/pm/ActivityInfo;)V
:cond_13
invoke-super {p0, p1, p2, p3}, Landroid/app/Instrumentation;->callActivityOnCreate(Landroid/app/Activity;Landroid/os/Bundle;Landroid/os/PersistableBundle;)V
return-void
.end method
.method public callActivityOnNewIntent(Landroid/app/Activity;Landroid/content/Intent;)V
.registers 4
if-eqz p1, :cond_d
invoke-virtual {p1}, Ljava/lang/Object;->getClass()Ljava/lang/Class;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/Class;->getClassLoader()Ljava/lang/ClassLoader;
move-result-object v0
invoke-direct {p0, v0, p2}, Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;->processIntent(Ljava/lang/ClassLoader;Landroid/content/Intent;)Z
:cond_d
invoke-super {p0, p1, p2}, Landroid/app/Instrumentation;->callActivityOnNewIntent(Landroid/app/Activity;Landroid/content/Intent;)V
return-void
.end method
.method public install()V
.registers 3
iget-object v0, p0, Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;->mInstrumentationField:Ljava/lang/reflect/Field;
iget-object v1, p0, Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;->mActivityThread:Ljava/lang/Object;
invoke-virtual {v0, v1}, Ljava/lang/reflect/Field;->get(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v0
instance-of v0, v0, Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;
if-eqz v0, :cond_16
const-string/jumbo v0, "Tinker.Instrumentation"
const-string/jumbo v1, "already installed, skip rest logic."
invoke-static {v0, v1}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I
:goto_15
return-void
:cond_16
iget-object v0, p0, Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;->mInstrumentationField:Ljava/lang/reflect/Field;
iget-object v1, p0, Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;->mActivityThread:Ljava/lang/Object;
invoke-virtual {v0, v1, p0}, Ljava/lang/reflect/Field;->set(Ljava/lang/Object;Ljava/lang/Object;)V
goto :goto_15
.end method
.method public newActivity(Ljava/lang/Class;Landroid/content/Context;Landroid/os/IBinder;Landroid/app/Application;Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Ljava/lang/CharSequence;Landroid/app/Activity;Ljava/lang/String;Ljava/lang/Object;)Landroid/app/Activity;
.registers 12
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/lang/Class",
"<*>;",
"Landroid/content/Context;",
"Landroid/os/IBinder;",
"Landroid/app/Application;",
"Landroid/content/Intent;",
"Landroid/content/pm/ActivityInfo;",
"Ljava/lang/CharSequence;",
"Landroid/app/Activity;",
"Ljava/lang/String;",
"Ljava/lang/Object;",
")",
"Landroid/app/Activity;"
}
.end annotation
invoke-virtual {p2}, Landroid/content/Context;->getClassLoader()Ljava/lang/ClassLoader;
move-result-object v0
invoke-direct {p0, v0, p5}, Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;->processIntent(Ljava/lang/ClassLoader;Landroid/content/Intent;)Z
invoke-super/range {p0 .. p10}, Landroid/app/Instrumentation;->newActivity(Ljava/lang/Class;Landroid/content/Context;Landroid/os/IBinder;Landroid/app/Application;Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Ljava/lang/CharSequence;Landroid/app/Activity;Ljava/lang/String;Ljava/lang/Object;)Landroid/app/Activity;
move-result-object v0
return-object v0
.end method
.method public newActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity;
.registers 5
invoke-direct {p0, p1, p3}, Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;->processIntent(Ljava/lang/ClassLoader;Landroid/content/Intent;)Z
move-result v0
if-eqz v0, :cond_13
invoke-virtual {p3}, Landroid/content/Intent;->getComponent()Landroid/content/ComponentName;
move-result-object v0
invoke-virtual {v0}, Landroid/content/ComponentName;->getClassName()Ljava/lang/String;
move-result-object v0
invoke-super {p0, p1, v0, p3}, Landroid/app/Instrumentation;->newActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity;
move-result-object v0
:goto_12
return-object v0
:cond_13
invoke-super {p0, p1, p2, p3}, Landroid/app/Instrumentation;->newActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity;
move-result-object v0
goto :goto_12
.end method
.method public uninstall()V
.registers 4
iget-object v0, p0, Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;->mInstrumentationField:Ljava/lang/reflect/Field;
iget-object v1, p0, Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;->mActivityThread:Ljava/lang/Object;
iget-object v2, p0, Lcom/tencent/tinker/loader/hotplug/interceptor/TinkerHackInstrumentation;->mOriginal:Landroid/app/Instrumentation;
invoke-virtual {v0, v1, v2}, Ljava/lang/reflect/Field;->set(Ljava/lang/Object;Ljava/lang/Object;)V
return-void
.end method