Multidex的过程分两步,拆包和dex加载。
https://www.jianshu.com/p/9f02add8431f
拆包
拆分为多个dex是在编译构建Dex过程中完成的,通过如下配置即可,同时在main-dex-rule文件中指定哪些类要放在主dex中。dex的命名规则是classes.dex、classes2.dex、classes3.dex等。
dexOptions {
javaMaxHeapSize "1g"
preDexLibraries = false
additionalParameters = [//配置multidex参数
'--multi-dex',//多dex分包
'--set-max-idx-number=24000',//每个包内方法数上限
'--main-dex-list=' + projectDir + '/main-dex-rule', //打包到主classes.dex的文件列表
'--minimal-main-dex'
]
}
-----main-dex-rule文件格式----
com/pitaya/buckettool/BucketApplication.class
android/support/multidex/MultiDexExtractor.class
android/support/multidex/MultiDex.class
android/support/multidex/MultiDexExtractor$1.class
android/support/multidex/MultiDex$V19.class
android/support/multidex/MultiDex$V14.class
android/support/multidex/MultiDexApplication.class
android/support/multidex/ZipUtil$CentralDirectory.class
android/support/multidex/MultiDex$V4.class
android/support/multidex/ZipUtil.class
混淆语法https://www.diycode.cc/topics/380
加载
加载过程涉及多个目录文件、ClassLoader机制。
每个目录文件的作用
——/data/app/com.pitaya.buckettool-1.apk——applicationInfo.sourceDir sourceApk——系统用于存放APK原始安装文件
——/data/data/com.pitaya.buckettool——applicationInfo.dataDir——系统给每个应用创建的私有专用目录,存放SP、数据库等文件
——/data/data/com.pitaya.buckettool/code_cache/secondary-dexes——dexDir———Multidex工作过程中创建的目录,用于存放apk原始文件中的子dex,不包含主dex。
——/data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes2.zip——extractedFile——Multidex工作过程中,
提取APK中的子dex,并生成包含子dex的压缩文件com.pitaya.buckettool-1.apk.classes2.zip,注意:每个子dex对应一个压缩文件。压缩文件内的dex名字被替换为了classes.dex,
为什么要这样做?因DexPathList.java底层是根据"classes.dex"字符串来匹配文件的,不符合的不处理。
——/data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes2.dex——被dexOpt优化后生成的odex文件,可提高Dalvik执行效率,文件对比如下:
-rw-r--r-- u0_a52 u0_a52 440576 2017-10-26 10:53 com.pitaya.buckettool-1.apk.classes2.dex
-rw------- u0_a52 u0_a52 158841 2017-10-26 10:53 com.pitaya.buckettool-1.apk.classes2.zip
——/data/dalvik-cache/data@app@com.pitaya.buckettool-1.apk@classes.dex——系统用于存放主Dex
——/data/system/packages.xml——已安装应用的权限信息列表
ClassLoader机制
15865-15865/D/TagAppPath: ---------------------------
15865-15865/D/TagAppPath: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.pitaya.buckettool-2.apk", zip file "/data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes2.zip", zip file "/data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes3.zip", zip file "/data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes4.zip"],nativeLibraryDirectories=[/data/app-lib/com.pitaya.buckettool-2, /system/lib]]]
15865-15865/D/TagAppPath: Activity java.lang.BootClassLoader@acd54d78
15865-15865/D/TagAppPath: ArrayList java.lang.BootClassLoader@acd54d78
15865-15865/D/TagAppPath: ContextImpl java.lang.BootClassLoader@acd54d78
15865-15865/D/TagAppPath: ActivityThread java.lang.BootClassLoader@acd54d78
15865-15865/D/TagAppPath: ---------------------------
2321-2321/D/TagAppPath: loaderName dalvik.system.PathClassLoader
2321-2321/D/TagAppPath: loaderName java.lang.BootClassLoader
2321-2321/D/TagAppPath: ---------------------------
W/System.err: java.lang.RuntimeException: my RuntimeException
W/System.err: at com.pitaya.buckettool.BucketApplication.onCreate(BucketApplication.java:54)
W/System.err: at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
W/System.err: at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4344)
W/System.err: at android.app.ActivityThread.access$1500(ActivityThread.java:135)
W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err: at android.os.Looper.loop(Looper.java:136)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5017)
W/System.err: at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err: at java.lang.reflect.Method.invoke(Method.java:515)
W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
W/System.err: at dalvik.system.NativeStart.main(Native Method)
遵循ClassLoader的双亲委派机制,并且判定是同一个Class的条件 = 相同的 ClassName + PackageName + ClassLoader。
PathClassLoader和DexClassLoader的区别在于,DexClassLoader可以指定odex路径。
关于ClassLoader的双亲委派、compile和provided两种依赖方式带来的异常ClassNotFoundException、ClassCastException、IllegalAccessError: Class ref in pre-verified class等异常,参见拓展阅读
摘抄:通过以上三种情况,主要是为了更加深刻的理解类加载器的知识,同时得出我们在开发插件时,尽量避免出现插件和宿主中都compile依赖,只保证compile一次,其他provided即可,此外在自定义DexClassLoader的parent时要特别注意,不能随意设置,一般设置成应用默认的classLoader,而非系统默认的classLoader。
被
dexopt过程,对加载的Class做预校验,包含该Class内所有的被引用的类是否存在,若不存在则对不存在的类做标记;该Class内所有引用类均在当前dex中,则该Class被标记为CLASS_ISPREVERIFIED。
BootClassLoader在哪里被实例化的呢?
Activity、ArrayList、ContextImpl、ActivityThread等系统的类都是由BootClassLoader加载的,BootClassLoader的实例化时机是在ZygoteInit的preload()方法中。BootClassLoader的parent是null,并且没有设置路径,可以理解为BootClassLoader是对底层loadclass能力的代理。
然后代码里和堆栈对不上,要看下老罗了。。。。
BootClassLoader.class本身又是由谁来加载的呢?奇怪
---------ZygoteInit.preload()-------
static void preload() {
preloadClasses();
preloadResources();
preloadOpenGL();
}
---------ZygoteInit.preloadClasses()-------
Class.forName(line);
---------Class.forName()----------------------
if (loader == null) {
loader = BootClassLoader.getInstance();
}
用于加载自定义Application的PathClassLoader在哪里实例化的呢?
AcitivityThread.java内部调用核心流程
-handleBindApplication(){Application app = data.info.makeApplication(data.restrictedBackupMode, null);}
-LoadedApk.makeApplication()
-java.lang.ClassLoader cl = getClassLoader();
-createOrUpdateClassLoaderLocked()
-mClassLoader = ApplicationLoaders.getDefault().getClassLoader(zip,
mApplicationInfo.targetSdkVersion, isBundledApp, librarySearchPath,
libraryPermittedPath, mBaseClassLoader);//设置outZipPaths.add(appDir);用于加载主Dex
------PathClassLoader实例化完毕,parent为BootClassLoader,并加载appDir路径下的主classes.dex文件,
自己定义的Application要放在主classes.dex中,在***自定义拆包的时候要注意***否则makeApplication()失败,
因为ClassNotFoundException-----
然后有NoClassDefFoundError
在BucketApplication的onCreate()方法中调用initBugly(),发生如下错误:
private void initBugly() {
Beta.autoCheckUpgrade = false;
CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(getApplicationContext());
Bugly.init(getApplicationContext(), "1111", BuildConfig.ENV_OFFLINE, strategy);
}
public class CrashReport {
public CrashReport() {
}
public static class UserStrategy extends BuglyStrategy {
public UserStrategy(Context context) {
}
}
}
java.lang.NoClassDefFoundError: com.tencent.bugly.beta.Beta
at com.pitaya.buckettool.BucketApplication.initBugly(BucketApplication.java:118)
at com.pitaya.buckettool.BucketApplication.onCreate(BucketApplication.java:45)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4344)
仔细看dalvikvm加载class的日志还有如下提示
W/dalvikvm: Unable to resolve superclass of Lcom/tencent/bugly/beta/Beta; (68)
W/dalvikvm: Link of class 'Lcom/tencent/bugly/beta/Beta;' failed
W/dalvikvm: VFY: unable to resolve static field 154 (autoCheckUpgrade) in Lcom/tencent/bugly/beta/Beta;
D/dalvikvm: VFY: replacing opcode 0x6a at 0x0002
W/dalvikvm: Unable to resolve superclass of Lcom/tencent/bugly/crashreport/CrashReport$UserStrategy; (66)
W/dalvikvm: Link of class 'Lcom/tencent/bugly/crashreport/CrashReport$UserStrategy;' failed
D/dalvikvm: DexOpt: unable to opt direct call 0x0165 at 0x12 in Lcom/pitaya/buckettool/BucketApplication;.initBugly
关键词
1、superclass
2、unable to resolve static field
3、unable to resolve static method
4、unable to resolve new-instance
爽歪歪,后续的调试工作全是在为消灭这几句话做斗争。
解释下NoClassDefFoundError 和 ClassNotFoundException的区别:
- ClassNotFoundException是Dex中真的没有、也找不到时发生的;
- NoClassDefFoundError是Dex中有、但是该类被提前标记为无效类、在实例化的时候发生的;
为什么该类被提前标记为无效类呢?因为多Dex情况下,dexopt会扫描被该类A引用的所有的其他类是否存在,如果不存在,则其他类会被标记未无效类。
在加载Class到内存并初始化static、实例化Class时,发生NoClassDefFoundError异常。
如果初始化A的static块存在new B()并且类B的字节码还未被加载,则会产生ClassNotFoundException。
如果初始化A的static块存在new B()并且类B的字节码已被加载,但是new B()内构造函数抛出Exception导致类B实例化错误,同样导致类A字节码加载错误,后续有引用类A的地方也会发生ClassNotFoundException。看个腾讯Bugly的案例
D/dalvikvm: DexOpt: unable to opt direct call 0x0071 at 0x1b in Lcom/pitaya/buckettool/BucketApplication;.onCreate
案例中BucketApplication 引用类有Beta.autoCheckUpgrade 、Bugly.init()、 CrashReport.UserStrategy.class。在main-dex-rule文件中新增如下配置,顺利看到了MainActivity页面。
com/tencent/bugly/a.class
com/tencent/bugly/beta/Beta.class
com/tencent/bugly/Bugly.class
com/tencent/bugly/BuglyStrategy.class
com/tencent/bugly/crashreport/CrashReport$UserStrategy.class
JVM类加载过程
类的加载分清楚如下两点:
- 类的初始化是指为类中各个类成员(被static修饰的成员变量)赋初始值的过程,是类生命周期中的一个阶段。
- 类的实例化是指创建一个类的实例(对象)的过程;
摘要:一个类的生命周期包括加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using) 和 卸载(Unloading)七个阶段。
运行附件
10-28 23:00:02.060 11481-11481/? D/dalvikvm: Not late-enabling CheckJNI (already on)
10-28 23:00:02.110 11481-11481/com.pitaya.buckettool I/dalvikvm: Could not find method com.xiaomi.mistatistic.sdk.MiStatInterface.initialize, referenced from method com.pitaya.buckettool.BucketApplication.initXiaomi
10-28 23:00:02.110 11481-11481/com.pitaya.buckettool W/dalvikvm: VFY: unable to resolve static method 382: Lcom/xiaomi/mistatistic/sdk/MiStatInterface;.initialize (Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
10-28 23:00:02.110 11481-11481/com.pitaya.buckettool D/dalvikvm: VFY: replacing opcode 0x71 at 0x0006
10-28 23:00:02.110 11481-11481/com.pitaya.buckettool E/dalvikvm: Could not find class 'com.pitaya.buckettool.bind.BindPoiPresenter', referenced from method com.pitaya.buckettool.BucketApplication.onCreate
10-28 23:00:02.110 11481-11481/com.pitaya.buckettool W/dalvikvm: VFY: unable to resolve new-instance 47 (Lcom/pitaya/buckettool/bind/BindPoiPresenter;) in Lcom/pitaya/buckettool/BucketApplication;
10-28 23:00:02.110 11481-11481/com.pitaya.buckettool D/dalvikvm: VFY: replacing opcode 0x22 at 0x000c
10-28 23:00:02.110 11481-11481/com.pitaya.buckettool I/dalvikvm: Failed resolving Lcom/pitaya/buckettool/BucketApplication$1; interface 115 'Lcom/xiaomi/mistatistic/sdk/controller/HttpEventFilter;'
10-28 23:00:02.110 11481-11481/com.pitaya.buckettool W/dalvikvm: Link of class 'Lcom/pitaya/buckettool/BucketApplication$1;' failed
10-28 23:00:02.110 11481-11481/com.pitaya.buckettool D/dalvikvm: DexOpt: unable to opt direct call 0x006b at 0x1b in Lcom/pitaya/buckettool/BucketApplication;.initXiaomi
10-28 23:00:02.110 11481-11481/com.pitaya.buckettool D/dalvikvm: DexOpt: unable to opt direct call 0x0081 at 0x13 in Lcom/pitaya/buckettool/BucketApplication;.onCreate
10-28 23:00:02.110 11481-11481/com.pitaya.buckettool D/dalvikvm: DexOpt: unable to opt direct call 0x0071 at 0x1b in Lcom/pitaya/buckettool/BucketApplication;.onCreate
10-28 23:00:02.110 11481-11481/com.pitaya.buckettool E/smarking: attachBaseContext begin
10-28 23:00:02.110 11481-11481/com.pitaya.buckettool I/MultiDex: VM with version 1.6.0 does not have multidex support
10-28 23:00:02.110 11481-11481/com.pitaya.buckettool I/MultiDex: install
10-28 23:00:02.110 11481-11481/com.pitaya.buckettool I/MultiDex: MultiDexExtractor.load(/data/app/com.pitaya.buckettool-1.apk, false)
10-28 23:00:02.120 11481-11481/com.pitaya.buckettool I/MultiDex: Detected that extraction must be performed.
10-28 23:00:02.120 11481-11481/com.pitaya.buckettool I/MultiDex: Trying to delete old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes2.dex of size 3741880
10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Deleted old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes2.dex
10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Trying to delete old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes2.zip of size 1423256
10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Deleted old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes2.zip
10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Trying to delete old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes3.zip of size 1431792
10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Deleted old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes3.zip
10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Trying to delete old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes4.zip of size 1191948
10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Deleted old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes4.zip
10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Trying to delete old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes3.dex of size 4050264
10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Deleted old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes3.dex
10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Trying to delete old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes4.dex of size 3272272
10-28 23:00:02.130 11481-11481/com.pitaya.buckettool I/MultiDex: Deleted old file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-2.apk.classes4.dex
10-28 23:00:02.140 11481-11481/com.pitaya.buckettool I/MultiDex: Extraction is needed for file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes2.zip
10-28 23:00:02.150 11481-11481/com.pitaya.buckettool I/MultiDex: Extracting /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes-1608520623.zip
10-28 23:00:02.510 11481-11481/com.pitaya.buckettool I/MultiDex: Renaming to /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes2.zip
10-28 23:00:02.510 11481-11481/com.pitaya.buckettool I/MultiDex: Extraction success - length /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes2.zip: 1423256
10-28 23:00:02.510 11481-11481/com.pitaya.buckettool I/MultiDex: Extraction is needed for file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes3.zip
10-28 23:00:02.510 11481-11481/com.pitaya.buckettool I/MultiDex: Extracting /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes974557053.zip
10-28 23:00:02.820 11481-11481/com.pitaya.buckettool I/MultiDex: Renaming to /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes3.zip
10-28 23:00:02.820 11481-11481/com.pitaya.buckettool I/MultiDex: Extraction success - length /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes3.zip: 1431792
10-28 23:00:02.820 11481-11481/com.pitaya.buckettool I/MultiDex: Extraction is needed for file /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes4.zip
10-28 23:00:02.820 11481-11481/com.pitaya.buckettool I/MultiDex: Extracting /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes-633036696.zip
10-28 23:00:03.040 11481-11481/com.pitaya.buckettool I/MultiDex: Renaming to /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes4.zip
10-28 23:00:03.040 11481-11481/com.pitaya.buckettool I/MultiDex: Extraction success - length /data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes4.zip: 1191948
10-28 23:00:03.050 11481-11481/com.pitaya.buckettool I/MultiDex: load found 3 secondary dex files
10-28 23:00:03.050 11481-11514/com.pitaya.buckettool D/dalvikvm: GC_FOR_ALLOC freed 341K, 11% free 3273K/3676K, paused 5ms, total 5ms
10-28 23:00:03.080 11481-11481/com.pitaya.buckettool D/dalvikvm: DexOpt: --- BEGIN 'com.pitaya.buckettool-1.apk.classes2.zip' (bootstrap=0) ---
10-28 23:00:03.340 11481-11481/com.pitaya.buckettool D/dalvikvm: DexOpt: --- END 'com.pitaya.buckettool-1.apk.classes2.zip' (success) ---
10-28 23:00:03.340 11481-11481/com.pitaya.buckettool D/dalvikvm: DEX prep '/data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes2.zip': unzip in 28ms, rewrite 259ms
10-28 23:00:03.370 11481-11481/com.pitaya.buckettool D/dalvikvm: DexOpt: --- BEGIN 'com.pitaya.buckettool-1.apk.classes3.zip' (bootstrap=0) ---
10-28 23:00:03.550 11481-11481/com.pitaya.buckettool D/dalvikvm: DexOpt: --- END 'com.pitaya.buckettool-1.apk.classes3.zip' (success) ---
10-28 23:00:03.550 11481-11481/com.pitaya.buckettool D/dalvikvm: DEX prep '/data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes3.zip': unzip in 26ms, rewrite 186ms
10-28 23:00:03.580 11481-11481/com.pitaya.buckettool D/dalvikvm: DexOpt: --- BEGIN 'com.pitaya.buckettool-1.apk.classes4.zip' (bootstrap=0) ---
10-28 23:00:03.790 11481-11481/com.pitaya.buckettool D/dalvikvm: DexOpt: --- END 'com.pitaya.buckettool-1.apk.classes4.zip' (success) ---
10-28 23:00:03.790 11481-11481/com.pitaya.buckettool D/dalvikvm: DEX prep '/data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes4.zip': unzip in 22ms, rewrite 209ms
10-28 23:00:03.790 11481-11481/com.pitaya.buckettool I/MultiDex: install done
10-28 23:00:03.790 11481-11481/com.pitaya.buckettool E/smarking: attachBaseContext finish
10-28 23:00:03.790 11481-11481/com.pitaya.buckettool E/smarking: onCreate begin
10-28 23:00:03.790 11481-11481/com.pitaya.buckettool D/AndroidRuntime: Shutting down VM
10-28 23:00:03.790 11481-11481/com.pitaya.buckettool W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xaccaab20)
10-28 23:00:03.790 11481-11481/com.pitaya.buckettool E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.pitaya.buckettool, PID: 11481
java.lang.NoClassDefFoundError: com.pitaya.buckettool.bind.BindPoiPresenter
at com.pitaya.buckettool.BucketApplication.onCreate(BucketApplication.java:51)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4344)
at android.app.ActivityThread.access$1500(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
10-28 23:05:04.110 11481-11481/? I/Process: Sending signal. PID: 11481 SIG: 9