.class public final Landroid/support/multidex/MultiDex; .super Ljava/lang/Object; .source "MultiDex.java" # annotations .annotation system Ldalvik/annotation/MemberClasses; value = { Landroid/support/multidex/MultiDex$V14;, Landroid/support/multidex/MultiDex$V19;, Landroid/support/multidex/MultiDex$V4; } .end annotation # static fields .field private static final IS_VM_MULTIDEX_CAPABLE:Z .field private static final MAX_SUPPORTED_SDK_VERSION:I = 0x14 .field private static final MIN_SDK_VERSION:I = 0x4 .field private static final OLD_SECONDARY_FOLDER_NAME:Ljava/lang/String; = "secondary-dexes" .field private static final SECONDARY_FOLDER_NAME:Ljava/lang/String; .field static final TAG:Ljava/lang/String; = "MultiDex" .field private static final VM_WITH_MULTIDEX_VERSION_MAJOR:I = 0x2 .field private static final VM_WITH_MULTIDEX_VERSION_MINOR:I = 0x1 .field private static final installedApk:Ljava/util/Set; .annotation system Ldalvik/annotation/Signature; value = { "Ljava/util/Set", "<", "Ljava/lang/String;", ">;" } .end annotation .end field # direct methods .method static constructor ()V .locals 2 .prologue .line 63 new-instance v0, Ljava/lang/StringBuilder; const-string v1, "code_cache" invoke-direct {v0, v1}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V sget-object v1, Ljava/io/File;->separator:Ljava/lang/String; invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v0 .line 64 const-string v1, "secondary-dexes" invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v0 .line 63 invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v0 sput-object v0, Landroid/support/multidex/MultiDex;->SECONDARY_FOLDER_NAME:Ljava/lang/String; .line 74 new-instance v0, Ljava/util/HashSet; invoke-direct {v0}, Ljava/util/HashSet;->()V sput-object v0, Landroid/support/multidex/MultiDex;->installedApk:Ljava/util/Set; .line 77 const-string v0, "java.vm.version" invoke-static {v0}, Ljava/lang/System;->getProperty(Ljava/lang/String;)Ljava/lang/String; move-result-object v0 invoke-static {v0}, Landroid/support/multidex/MultiDex;->isVMMultidexCapable(Ljava/lang/String;)Z move-result v0 .line 76 sput-boolean v0, Landroid/support/multidex/MultiDex;->IS_VM_MULTIDEX_CAPABLE:Z .line 77 return-void .end method .method private constructor ()V .locals 0 .prologue .line 79 invoke-direct {p0}, Ljava/lang/Object;->()V return-void .end method .method static synthetic access$0(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/reflect/Field; .locals 1 .annotation system Ldalvik/annotation/Throws; value = { Ljava/lang/NoSuchFieldException; } .end annotation .prologue .line 290 invoke-static {p0, p1}, Landroid/support/multidex/MultiDex;->findField(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/reflect/Field; move-result-object v0 return-object v0 .end method .method static synthetic access$1(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;)V .locals 0 .annotation system Ldalvik/annotation/Throws; value = { Ljava/lang/NoSuchFieldException;, Ljava/lang/IllegalArgumentException;, Ljava/lang/IllegalAccessException; } .end annotation .prologue .line 346 invoke-static {p0, p1, p2}, Landroid/support/multidex/MultiDex;->expandFieldArray(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;)V return-void .end method .method static synthetic access$2(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method; .locals 1 .annotation system Ldalvik/annotation/Throws; value = { Ljava/lang/NoSuchMethodException; } .end annotation .prologue .line 318 invoke-static {p0, p1, p2}, Landroid/support/multidex/MultiDex;->findMethod(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method; move-result-object v0 return-object v0 .end method .method private static checkValidZipFiles(Ljava/util/List;)Z .locals 3 .annotation system Ldalvik/annotation/Signature; value = { "(", "Ljava/util/List", "<", "Ljava/io/File;", ">;)Z" } .end annotation .prologue .line 274 .local p0, "files":Ljava/util/List;, "Ljava/util/List;" invoke-interface {p0}, Ljava/util/List;->iterator()Ljava/util/Iterator; move-result-object v1 :cond_0 invoke-interface {v1}, Ljava/util/Iterator;->hasNext()Z move-result v2 if-nez v2, :cond_1 .line 279 const/4 v1, 0x1 :goto_0 return v1 .line 274 :cond_1 invoke-interface {v1}, Ljava/util/Iterator;->next()Ljava/lang/Object; move-result-object v0 check-cast v0, Ljava/io/File; .line 275 .local v0, "file":Ljava/io/File; invoke-static {v0}, Landroid/support/multidex/MultiDexExtractor;->verifyZipFile(Ljava/io/File;)Z move-result v2 if-nez v2, :cond_0 .line 276 const/4 v1, 0x0 goto :goto_0 .end method .method private static clearOldDexDir(Landroid/content/Context;)V .locals 9 .param p0, "context" # Landroid/content/Context; .annotation system Ldalvik/annotation/Throws; value = { Ljava/lang/Exception; } .end annotation .prologue .line 359 new-instance v0, Ljava/io/File; invoke-virtual {p0}, Landroid/content/Context;->getFilesDir()Ljava/io/File; move-result-object v3 const-string v4, "secondary-dexes" invoke-direct {v0, v3, v4}, Ljava/io/File;->(Ljava/io/File;Ljava/lang/String;)V .line 360 .local v0, "dexDir":Ljava/io/File; invoke-virtual {v0}, Ljava/io/File;->isDirectory()Z move-result v3 if-eqz v3, :cond_0 .line 361 const-string v3, "MultiDex" new-instance v4, Ljava/lang/StringBuilder; const-string v5, "Clearing old secondary dex dir (" invoke-direct {v4, v5}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {v0}, Ljava/io/File;->getPath()Ljava/lang/String; move-result-object v5 invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v4 const-string v5, ")." invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v4 invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v4 invoke-static {v3, v4}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I .line 362 invoke-virtual {v0}, Ljava/io/File;->listFiles()[Ljava/io/File; move-result-object v1 .line 363 .local v1, "files":[Ljava/io/File; if-nez v1, :cond_1 .line 364 const-string v3, "MultiDex" new-instance v4, Ljava/lang/StringBuilder; const-string v5, "Failed to list secondary dex dir content (" invoke-direct {v4, v5}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {v0}, Ljava/io/File;->getPath()Ljava/lang/String; move-result-object v5 invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v4 const-string v5, ")." invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v4 invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v4 invoke-static {v3, v4}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I .line 382 .end local v1 # "files":[Ljava/io/File; :cond_0 :goto_0 return-void .line 367 .restart local v1 # "files":[Ljava/io/File; :cond_1 array-length v4, v1 const/4 v3, 0x0 :goto_1 if-lt v3, v4, :cond_2 .line 376 invoke-virtual {v0}, Ljava/io/File;->delete()Z move-result v3 if-nez v3, :cond_4 .line 377 const-string v3, "MultiDex" new-instance v4, Ljava/lang/StringBuilder; const-string v5, "Failed to delete secondary dex dir " invoke-direct {v4, v5}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {v0}, Ljava/io/File;->getPath()Ljava/lang/String; move-result-object v5 invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v4 invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v4 invoke-static {v3, v4}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I goto :goto_0 .line 367 :cond_2 aget-object v2, v1, v3 .line 368 .local v2, "oldFile":Ljava/io/File; const-string v5, "MultiDex" new-instance v6, Ljava/lang/StringBuilder; const-string v7, "Trying to delete old file " invoke-direct {v6, v7}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {v2}, Ljava/io/File;->getPath()Ljava/lang/String; move-result-object v7 invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v6 const-string v7, " of size " invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v6 .line 369 invoke-virtual {v2}, Ljava/io/File;->length()J move-result-wide v7 invoke-virtual {v6, v7, v8}, Ljava/lang/StringBuilder;->append(J)Ljava/lang/StringBuilder; move-result-object v6 invoke-virtual {v6}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v6 .line 368 invoke-static {v5, v6}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I .line 370 invoke-virtual {v2}, Ljava/io/File;->delete()Z move-result v5 if-nez v5, :cond_3 .line 371 const-string v5, "MultiDex" new-instance v6, Ljava/lang/StringBuilder; const-string v7, "Failed to delete old file " invoke-direct {v6, v7}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {v2}, Ljava/io/File;->getPath()Ljava/lang/String; move-result-object v7 invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v6 invoke-virtual {v6}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v6 invoke-static {v5, v6}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I .line 367 :goto_2 add-int/lit8 v3, v3, 0x1 goto :goto_1 .line 373 :cond_3 const-string v5, "MultiDex" new-instance v6, Ljava/lang/StringBuilder; const-string v7, "Deleted old file " invoke-direct {v6, v7}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {v2}, Ljava/io/File;->getPath()Ljava/lang/String; move-result-object v7 invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v6 invoke-virtual {v6}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v6 invoke-static {v5, v6}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I goto :goto_2 .line 379 .end local v2 # "oldFile":Ljava/io/File; :cond_4 const-string v3, "MultiDex" new-instance v4, Ljava/lang/StringBuilder; const-string v5, "Deleted old secondary dex dir " invoke-direct {v4, v5}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {v0}, Ljava/io/File;->getPath()Ljava/lang/String; move-result-object v5 invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v4 invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v4 invoke-static {v3, v4}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I goto/16 :goto_0 .end method .method private static expandFieldArray(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;)V .locals 7 .param p0, "instance" # Ljava/lang/Object; .param p1, "fieldName" # Ljava/lang/String; .param p2, "extraElements" # [Ljava/lang/Object; .annotation system Ldalvik/annotation/Throws; value = { Ljava/lang/NoSuchFieldException;, Ljava/lang/IllegalArgumentException;, Ljava/lang/IllegalAccessException; } .end annotation .prologue const/4 v6, 0x0 .line 349 invoke-static {p0, p1}, Landroid/support/multidex/MultiDex;->findField(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/reflect/Field; move-result-object v1 .line 350 .local v1, "jlrField":Ljava/lang/reflect/Field; invoke-virtual {v1, p0}, Ljava/lang/reflect/Field;->get(Ljava/lang/Object;)Ljava/lang/Object; move-result-object v2 check-cast v2, [Ljava/lang/Object; .line 352 .local v2, "original":[Ljava/lang/Object; invoke-virtual {v2}, Ljava/lang/Object;->getClass()Ljava/lang/Class; move-result-object v3 invoke-virtual {v3}, Ljava/lang/Class;->getComponentType()Ljava/lang/Class; move-result-object v3 array-length v4, v2 array-length v5, p2 add-int/2addr v4, v5 .line 351 invoke-static {v3, v4}, Ljava/lang/reflect/Array;->newInstance(Ljava/lang/Class;I)Ljava/lang/Object; move-result-object v0 check-cast v0, [Ljava/lang/Object; .line 353 .local v0, "combined":[Ljava/lang/Object; array-length v3, v2 invoke-static {v2, v6, v0, v6, v3}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V .line 354 array-length v3, v2 array-length v4, p2 invoke-static {p2, v6, v0, v3, v4}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V .line 355 invoke-virtual {v1, p0, v0}, Ljava/lang/reflect/Field;->set(Ljava/lang/Object;Ljava/lang/Object;)V .line 356 return-void .end method .method private static findField(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/reflect/Field; .locals 5 .param p0, "instance" # Ljava/lang/Object; .param p1, "name" # Ljava/lang/String; .annotation system Ldalvik/annotation/Throws; value = { Ljava/lang/NoSuchFieldException; } .end annotation .prologue .line 291 invoke-virtual {p0}, Ljava/lang/Object;->getClass()Ljava/lang/Class; move-result-object v0 .local v0, "clazz":Ljava/lang/Class;, "Ljava/lang/Class<*>;" :goto_0 if-nez v0, :cond_0 .line 306 new-instance v2, Ljava/lang/NoSuchFieldException; new-instance v3, Ljava/lang/StringBuilder; const-string v4, "Field " invoke-direct {v3, v4}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {v3, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v3 const-string v4, " not found in " invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v3 invoke-virtual {p0}, Ljava/lang/Object;->getClass()Ljava/lang/Class; move-result-object v4 invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; move-result-object v3 invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v3 invoke-direct {v2, v3}, Ljava/lang/NoSuchFieldException;->(Ljava/lang/String;)V throw v2 .line 293 :cond_0 :try_start_0 invoke-virtual {v0, p1}, Ljava/lang/Class;->getDeclaredField(Ljava/lang/String;)Ljava/lang/reflect/Field; move-result-object v1 .line 296 .local v1, "field":Ljava/lang/reflect/Field; invoke-virtual {v1}, Ljava/lang/reflect/Field;->isAccessible()Z move-result v2 if-nez v2, :cond_1 .line 297 const/4 v2, 0x1 invoke-virtual {v1, v2}, Ljava/lang/reflect/Field;->setAccessible(Z)V :try_end_0 .catch Ljava/lang/NoSuchFieldException; {:try_start_0 .. :try_end_0} :catch_0 .line 300 :cond_1 return-object v1 .line 301 .end local v1 # "field":Ljava/lang/reflect/Field; :catch_0 move-exception v2 .line 291 invoke-virtual {v0}, Ljava/lang/Class;->getSuperclass()Ljava/lang/Class; move-result-object v0 goto :goto_0 .end method .method private static varargs findMethod(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method; .locals 5 .param p0, "instance" # Ljava/lang/Object; .param p1, "name" # Ljava/lang/String; .param p2, "parameterTypes" # [Ljava/lang/Class; .annotation system Ldalvik/annotation/Signature; value = { "(", "Ljava/lang/Object;", "Ljava/lang/String;", "[", "Ljava/lang/Class", "<*>;)", "Ljava/lang/reflect/Method;" } .end annotation .annotation system Ldalvik/annotation/Throws; value = { Ljava/lang/NoSuchMethodException; } .end annotation .prologue .line 320 invoke-virtual {p0}, Ljava/lang/Object;->getClass()Ljava/lang/Class; move-result-object v0 .local v0, "clazz":Ljava/lang/Class;, "Ljava/lang/Class<*>;" :goto_0 if-nez v0, :cond_0 .line 335 new-instance v2, Ljava/lang/NoSuchMethodException; new-instance v3, Ljava/lang/StringBuilder; const-string v4, "Method " invoke-direct {v3, v4}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {v3, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v3 const-string v4, " with parameters " invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v3 .line 336 invoke-static {p2}, Ljava/util/Arrays;->asList([Ljava/lang/Object;)Ljava/util/List; move-result-object v4 invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; move-result-object v3 const-string v4, " not found in " invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v3 invoke-virtual {p0}, Ljava/lang/Object;->getClass()Ljava/lang/Class; move-result-object v4 invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; move-result-object v3 invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v3 .line 335 invoke-direct {v2, v3}, Ljava/lang/NoSuchMethodException;->(Ljava/lang/String;)V throw v2 .line 322 :cond_0 :try_start_0 invoke-virtual {v0, p1, p2}, Ljava/lang/Class;->getDeclaredMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method; move-result-object v1 .line 325 .local v1, "method":Ljava/lang/reflect/Method; invoke-virtual {v1}, Ljava/lang/reflect/Method;->isAccessible()Z move-result v2 if-nez v2, :cond_1 .line 326 const/4 v2, 0x1 invoke-virtual {v1, v2}, Ljava/lang/reflect/Method;->setAccessible(Z)V :try_end_0 .catch Ljava/lang/NoSuchMethodException; {:try_start_0 .. :try_end_0} :catch_0 .line 329 :cond_1 return-object v1 .line 330 .end local v1 # "method":Ljava/lang/reflect/Method; :catch_0 move-exception v2 .line 320 invoke-virtual {v0}, Ljava/lang/Class;->getSuperclass()Ljava/lang/Class; move-result-object v0 goto :goto_0 .end method .method private static getApplicationInfo(Landroid/content/Context;)Landroid/content/pm/ApplicationInfo; .locals 6 .param p0, "context" # Landroid/content/Context; .annotation system Ldalvik/annotation/Throws; value = { Landroid/content/pm/PackageManager$NameNotFoundException; } .end annotation .prologue const/4 v0, 0x0 .line 194 :try_start_0 invoke-virtual {p0}, Landroid/content/Context;->getPackageManager()Landroid/content/pm/PackageManager; move-result-object v3 .line 195 .local v3, "pm":Landroid/content/pm/PackageManager; invoke-virtual {p0}, Landroid/content/Context;->getPackageName()Ljava/lang/String; :try_end_0 .catch Ljava/lang/RuntimeException; {:try_start_0 .. :try_end_0} :catch_0 move-result-object v2 .line 205 .local v2, "packageName":Ljava/lang/String; if-eqz v3, :cond_0 if-nez v2, :cond_1 .line 211 .end local v2 # "packageName":Ljava/lang/String; .end local v3 # "pm":Landroid/content/pm/PackageManager; :cond_0 :goto_0 return-object v0 .line 196 :catch_0 move-exception v1 .line 201 .local v1, "e":Ljava/lang/RuntimeException; const-string v4, "MultiDex" const-string v5, "Failure while trying to obtain ApplicationInfo from Context. Must be running in test mode. Skip patching." invoke-static {v4, v5, v1}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I goto :goto_0 .line 210 .end local v1 # "e":Ljava/lang/RuntimeException; .restart local v2 # "packageName":Ljava/lang/String; .restart local v3 # "pm":Landroid/content/pm/PackageManager; :cond_1 const/16 v4, 0x80 invoke-virtual {v3, v2, v4}, Landroid/content/pm/PackageManager;->getApplicationInfo(Ljava/lang/String;I)Landroid/content/pm/ApplicationInfo; move-result-object v0 .line 211 .local v0, "applicationInfo":Landroid/content/pm/ApplicationInfo; goto :goto_0 .end method .method public static install(Landroid/content/Context;)V .locals 11 .param p0, "context" # Landroid/content/Context; .prologue const/16 v9, 0x14 const/4 v10, 0x4 .line 92 const-string v7, "MultiDex" const-string v8, "install" invoke-static {v7, v8}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I .line 93 sget-boolean v7, Landroid/support/multidex/MultiDex;->IS_VM_MULTIDEX_CAPABLE:Z if-eqz v7, :cond_1 .line 94 const-string v7, "MultiDex" const-string v8, "VM has multidex support, MultiDex support library is disabled." invoke-static {v7, v8}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I .line 181 :cond_0 :goto_0 return-void .line 98 :cond_1 sget v7, Landroid/os/Build$VERSION;->SDK_INT:I if-ge v7, v10, :cond_2 .line 99 new-instance v7, Ljava/lang/RuntimeException; new-instance v8, Ljava/lang/StringBuilder; const-string v9, "Multi dex installation failed. SDK " invoke-direct {v8, v9}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V sget v9, Landroid/os/Build$VERSION;->SDK_INT:I invoke-virtual {v8, v9}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object v8 .line 100 const-string v9, " is unsupported. Min SDK version is " invoke-virtual {v8, v9}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v8 invoke-virtual {v8, v10}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object v8 const-string v9, "." invoke-virtual {v8, v9}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v8 invoke-virtual {v8}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v8 .line 99 invoke-direct {v7, v8}, Ljava/lang/RuntimeException;->(Ljava/lang/String;)V throw v7 .line 104 :cond_2 :try_start_0 invoke-static {p0}, Landroid/support/multidex/MultiDex;->getApplicationInfo(Landroid/content/Context;)Landroid/content/pm/ApplicationInfo; move-result-object v1 .line 105 .local v1, "applicationInfo":Landroid/content/pm/ApplicationInfo; if-eqz v1, :cond_0 .line 110 sget-object v8, Landroid/support/multidex/MultiDex;->installedApk:Ljava/util/Set; monitor-enter v8 :try_end_0 .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0 .line 111 :try_start_1 iget-object v0, v1, Landroid/content/pm/ApplicationInfo;->sourceDir:Ljava/lang/String; .line 112 .local v0, "apkPath":Ljava/lang/String; sget-object v7, Landroid/support/multidex/MultiDex;->installedApk:Ljava/util/Set; invoke-interface {v7, v0}, Ljava/util/Set;->contains(Ljava/lang/Object;)Z move-result v7 if-eqz v7, :cond_3 .line 113 monitor-exit v8 goto :goto_0 .line 110 .end local v0 # "apkPath":Ljava/lang/String; :catchall_0 move-exception v7 monitor-exit v8 :try_end_1 .catchall {:try_start_1 .. :try_end_1} :catchall_0 :try_start_2 throw v7 :try_end_2 .catch Ljava/lang/Exception; {:try_start_2 .. :try_end_2} :catch_0 .line 176 .end local v1 # "applicationInfo":Landroid/content/pm/ApplicationInfo; :catch_0 move-exception v3 .line 177 .local v3, "e":Ljava/lang/Exception; const-string v7, "MultiDex" const-string v8, "Multidex installation failure" invoke-static {v7, v8, v3}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I .line 178 new-instance v7, Ljava/lang/RuntimeException; new-instance v8, Ljava/lang/StringBuilder; const-string v9, "Multi dex installation failed (" invoke-direct {v8, v9}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {v3}, Ljava/lang/Exception;->getMessage()Ljava/lang/String; move-result-object v9 invoke-virtual {v8, v9}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v8 const-string v9, ")." invoke-virtual {v8, v9}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v8 invoke-virtual {v8}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v8 invoke-direct {v7, v8}, Ljava/lang/RuntimeException;->(Ljava/lang/String;)V throw v7 .line 115 .end local v3 # "e":Ljava/lang/Exception; .restart local v0 # "apkPath":Ljava/lang/String; .restart local v1 # "applicationInfo":Landroid/content/pm/ApplicationInfo; :cond_3 :try_start_3 sget-object v7, Landroid/support/multidex/MultiDex;->installedApk:Ljava/util/Set; invoke-interface {v7, v0}, Ljava/util/Set;->add(Ljava/lang/Object;)Z .line 117 sget v7, Landroid/os/Build$VERSION;->SDK_INT:I if-le v7, v9, :cond_4 .line 118 const-string v7, "MultiDex" new-instance v9, Ljava/lang/StringBuilder; const-string v10, "MultiDex is not guaranteed to work in SDK version " invoke-direct {v9, v10}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V .line 119 sget v10, Landroid/os/Build$VERSION;->SDK_INT:I invoke-virtual {v9, v10}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object v9 const-string v10, ": SDK version higher than " invoke-virtual {v9, v10}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v9 .line 120 const/16 v10, 0x14 invoke-virtual {v9, v10}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object v9 const-string v10, " should be backed by " invoke-virtual {v9, v10}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v9 .line 121 const-string v10, "runtime with built-in multidex capabilty but it\'s not the " invoke-virtual {v9, v10}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v9 .line 122 const-string v10, "case here: java.vm.version=\"" invoke-virtual {v9, v10}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v9 .line 123 const-string v10, "java.vm.version" invoke-static {v10}, Ljava/lang/System;->getProperty(Ljava/lang/String;)Ljava/lang/String; move-result-object v10 invoke-virtual {v9, v10}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v9 const-string v10, "\"" invoke-virtual {v9, v10}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v9 invoke-virtual {v9}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v9 .line 118 invoke-static {v7, v9}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I :try_end_3 .catchall {:try_start_3 .. :try_end_3} :catchall_0 .line 133 :cond_4 :try_start_4 invoke-virtual {p0}, Landroid/content/Context;->getClassLoader()Ljava/lang/ClassLoader; :try_end_4 .catch Ljava/lang/RuntimeException; {:try_start_4 .. :try_end_4} :catch_1 .catchall {:try_start_4 .. :try_end_4} :catchall_0 move-result-object v5 .line 143 .local v5, "loader":Ljava/lang/ClassLoader; if-nez v5, :cond_5 .line 145 :try_start_5 const-string v7, "MultiDex" .line 146 const-string v9, "Context class loader is null. Must be running in test mode. Skip patching." .line 145 invoke-static {v7, v9}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I .line 148 monitor-exit v8 goto/16 :goto_0 .line 134 .end local v5 # "loader":Ljava/lang/ClassLoader; :catch_1 move-exception v3 .line 139 .local v3, "e":Ljava/lang/RuntimeException; const-string v7, "MultiDex" const-string v9, "Failure while trying to obtain Context class loader. Must be running in test mode. Skip patching." invoke-static {v7, v9, v3}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I .line 141 monitor-exit v8 :try_end_5 .catchall {:try_start_5 .. :try_end_5} :catchall_0 goto/16 :goto_0 .line 152 .end local v3 # "e":Ljava/lang/RuntimeException; .restart local v5 # "loader":Ljava/lang/ClassLoader; :cond_5 :try_start_6 invoke-static {p0}, Landroid/support/multidex/MultiDex;->clearOldDexDir(Landroid/content/Context;)V :try_end_6 .catch Ljava/lang/Throwable; {:try_start_6 .. :try_end_6} :catch_2 .catchall {:try_start_6 .. :try_end_6} :catchall_0 .line 158 :goto_1 :try_start_7 new-instance v2, Ljava/io/File; iget-object v7, v1, Landroid/content/pm/ApplicationInfo;->dataDir:Ljava/lang/String; sget-object v9, Landroid/support/multidex/MultiDex;->SECONDARY_FOLDER_NAME:Ljava/lang/String; invoke-direct {v2, v7, v9}, Ljava/io/File;->(Ljava/lang/String;Ljava/lang/String;)V .line 159 .local v2, "dexDir":Ljava/io/File; const/4 v7, 0x0 invoke-static {p0, v1, v2, v7}, Landroid/support/multidex/MultiDexExtractor;->load(Landroid/content/Context;Landroid/content/pm/ApplicationInfo;Ljava/io/File;Z)Ljava/util/List; move-result-object v4 .line 160 .local v4, "files":Ljava/util/List;, "Ljava/util/List;" invoke-static {v4}, Landroid/support/multidex/MultiDex;->checkValidZipFiles(Ljava/util/List;)Z move-result v7 if-eqz v7, :cond_6 .line 161 invoke-static {v5, v2, v4}, Landroid/support/multidex/MultiDex;->installSecondaryDexes(Ljava/lang/ClassLoader;Ljava/io/File;Ljava/util/List;)V .line 110 :goto_2 monitor-exit v8 :try_end_7 .catchall {:try_start_7 .. :try_end_7} :catchall_0 .line 180 const-string v7, "MultiDex" const-string v8, "install done" invoke-static {v7, v8}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I goto/16 :goto_0 .line 153 .end local v2 # "dexDir":Ljava/io/File; .end local v4 # "files":Ljava/util/List;, "Ljava/util/List;" :catch_2 move-exception v6 .line 154 .local v6, "t":Ljava/lang/Throwable; :try_start_8 const-string v7, "MultiDex" const-string v9, "Something went wrong when trying to clear old MultiDex extraction, continuing without cleaning." invoke-static {v7, v9, v6}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I goto :goto_1 .line 163 .end local v6 # "t":Ljava/lang/Throwable; .restart local v2 # "dexDir":Ljava/io/File; .restart local v4 # "files":Ljava/util/List;, "Ljava/util/List;" :cond_6 const-string v7, "MultiDex" const-string v9, "Files were not valid zip files. Forcing a reload." invoke-static {v7, v9}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I .line 165 const/4 v7, 0x1 invoke-static {p0, v1, v2, v7}, Landroid/support/multidex/MultiDexExtractor;->load(Landroid/content/Context;Landroid/content/pm/ApplicationInfo;Ljava/io/File;Z)Ljava/util/List; move-result-object v4 .line 167 invoke-static {v4}, Landroid/support/multidex/MultiDex;->checkValidZipFiles(Ljava/util/List;)Z move-result v7 if-eqz v7, :cond_7 .line 168 invoke-static {v5, v2, v4}, Landroid/support/multidex/MultiDex;->installSecondaryDexes(Ljava/lang/ClassLoader;Ljava/io/File;Ljava/util/List;)V goto :goto_2 .line 171 :cond_7 new-instance v7, Ljava/lang/RuntimeException; const-string v9, "Zip files were not valid." invoke-direct {v7, v9}, Ljava/lang/RuntimeException;->(Ljava/lang/String;)V throw v7 :try_end_8 .catchall {:try_start_8 .. :try_end_8} :catchall_0 .end method .method private static installSecondaryDexes(Ljava/lang/ClassLoader;Ljava/io/File;Ljava/util/List;)V .locals 2 .param p0, "loader" # Ljava/lang/ClassLoader; .param p1, "dexDir" # Ljava/io/File; .annotation system Ldalvik/annotation/Signature; value = { "(", "Ljava/lang/ClassLoader;", "Ljava/io/File;", "Ljava/util/List", "<", "Ljava/io/File;", ">;)V" } .end annotation .annotation system Ldalvik/annotation/Throws; value = { Ljava/lang/IllegalArgumentException;, Ljava/lang/IllegalAccessException;, Ljava/lang/NoSuchFieldException;, Ljava/lang/reflect/InvocationTargetException;, Ljava/lang/NoSuchMethodException;, Ljava/io/IOException; } .end annotation .prologue .line 258 .local p2, "files":Ljava/util/List;, "Ljava/util/List;" invoke-interface {p2}, Ljava/util/List;->isEmpty()Z move-result v0 if-nez v0, :cond_0 .line 259 sget v0, Landroid/os/Build$VERSION;->SDK_INT:I const/16 v1, 0x13 if-lt v0, v1, :cond_1 .line 260 invoke-static {p0, p2, p1}, Landroid/support/multidex/MultiDex$V19;->access$0(Ljava/lang/ClassLoader;Ljava/util/List;Ljava/io/File;)V .line 267 :cond_0 :goto_0 return-void .line 261 :cond_1 sget v0, Landroid/os/Build$VERSION;->SDK_INT:I const/16 v1, 0xe if-lt v0, v1, :cond_2 .line 262 invoke-static {p0, p2, p1}, Landroid/support/multidex/MultiDex$V14;->access$0(Ljava/lang/ClassLoader;Ljava/util/List;Ljava/io/File;)V goto :goto_0 .line 264 :cond_2 invoke-static {p0, p2}, Landroid/support/multidex/MultiDex$V4;->access$0(Ljava/lang/ClassLoader;Ljava/util/List;)V goto :goto_0 .end method .method static isVMMultidexCapable(Ljava/lang/String;)Z .locals 7 .param p0, "versionString" # Ljava/lang/String; .prologue const/4 v6, 0x2 const/4 v4, 0x1 .line 221 const/4 v0, 0x0 .line 222 .local v0, "isMultidexCapable":Z if-eqz p0, :cond_1 .line 223 const-string v5, "(\\d+)\\.(\\d+)(\\.\\d+)?" invoke-static {v5}, Ljava/util/regex/Pattern;->compile(Ljava/lang/String;)Ljava/util/regex/Pattern; move-result-object v5 invoke-virtual {v5, p0}, Ljava/util/regex/Pattern;->matcher(Ljava/lang/CharSequence;)Ljava/util/regex/Matcher; move-result-object v2 .line 224 .local v2, "matcher":Ljava/util/regex/Matcher; invoke-virtual {v2}, Ljava/util/regex/Matcher;->matches()Z move-result v5 if-eqz v5, :cond_1 .line 226 const/4 v5, 0x1 :try_start_0 invoke-virtual {v2, v5}, Ljava/util/regex/Matcher;->group(I)Ljava/lang/String; move-result-object v5 invoke-static {v5}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I move-result v1 .line 227 .local v1, "major":I const/4 v5, 0x2 invoke-virtual {v2, v5}, Ljava/util/regex/Matcher;->group(I)Ljava/lang/String; move-result-object v5 invoke-static {v5}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I :try_end_0 .catch Ljava/lang/NumberFormatException; {:try_start_0 .. :try_end_0} :catch_0 move-result v3 .line 228 .local v3, "minor":I if-gt v1, v6, :cond_2 .line 229 if-ne v1, v6, :cond_0 .line 228 if-ge v3, v4, :cond_2 :cond_0 const/4 v0, 0x0 .line 236 .end local v1 # "major":I .end local v2 # "matcher":Ljava/util/regex/Matcher; .end local v3 # "minor":I :cond_1 :goto_0 const-string v5, "MultiDex" new-instance v4, Ljava/lang/StringBuilder; const-string v6, "VM with version " invoke-direct {v4, v6}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {v4, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v6 .line 237 if-eqz v0, :cond_3 .line 238 const-string v4, " has multidex support" .line 237 :goto_1 invoke-virtual {v6, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v4 invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v4 .line 236 invoke-static {v5, v4}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I .line 240 return v0 .restart local v1 # "major":I .restart local v2 # "matcher":Ljava/util/regex/Matcher; .restart local v3 # "minor":I :cond_2 move v0, v4 .line 228 goto :goto_0 .line 239 .end local v1 # "major":I .end local v2 # "matcher":Ljava/util/regex/Matcher; .end local v3 # "minor":I :cond_3 const-string v4, " does not have multidex support" goto :goto_1 .line 231 .restart local v2 # "matcher":Ljava/util/regex/Matcher; :catch_0 move-exception v4 goto :goto_0 .end method