写在前面的话

一直不乐意写博客。因为在我看来很多自己记记就好了。网站上往往有一大堆的回答。不要自己再去多加一篇copy来的文章了。

但是这次遇到这件坑事。所以人对instant  run  启动后报app类型转换异常都是说不要用instant  run 。我*你妹妹呀。copy能不能有点技术含量啊。不过我的也未必技术含量。但是好歹还是找到可以使用instant  run 的方法。



Instant Run

为什么要用Instant Run

Android studio 2.0以后可以快速启动app。

比如xml布局修改修改的话,application不会重新创建。只会重新加载Activity。

 

之前遇到的问题

在以开始android studio升级到2.0的时候,大家所有电脑运行app的时候都会报错

在ContentProvider报错。

报错内容:

com.android.tools.fd.runtime.BootstrapApplicationcannot be cast to  **APP

 

当时的解决方法是在Setting—>Instant Run中。将第一个选项去掉打钩


但是这个后果是导致,无法使用快速启动的新功能。下面就针对快速运行做处理。

 

概要

Android Studio 2.0 中引入的 InstantRun 是 Run 和 Debug  命令的行为,可以大幅缩短应用更新的时间。尽管首次构建可能需要花费较长的时间,Instant Run 在向应用推送后续更新时则无需构建新的 APK,因此,这样可以更快地看到更改。

 

使用环境要求

仅在您部署调试构建变体、使用 Android Plugin for Gradle 版本 2.0.0 或更高版本,以及在应用的模块级别 build.gradle 文件中将 minSdkVersion 设置为 15 或以上时,Instant Run 才受支持。为获得最佳性能,可以将 minSdkVersion 设置为 21 或更高。

Sdk 15和21的区别

21的好处是。在结构性的代码更改的时候,依然可以使用冷交换来处理。但是21以下,就只能完全部署。

 

Ps:关于冷交换什么的都可以不关注。只是在编译上处理方式的不同。但是对我们开发人员来说唯一的体验就是快。

 

如何配置快速运行?

答:

1.      打开 Settings 或者 Preferences 对话框。打开Instant Run 方法。

2.      所有使用调用获取Application的方法全部换掉(否则依然会类型转换异常)

调用以下的方法: 这个方法抽出来放某个公用地方

publicstatic APPgetRealApplication (Context applicationContext)
 {
     APP application = null;

     if (applicationContext instanceof APP)
     {
         application = (APP)applicationContext;
     }
     else
     {
         Application realApplication = null;
         Field magicField = null;
         try
         {
             magicField =applicationContext.getClass().getDeclaredField("realApplication");
             magicField.setAccessible(true);
             realApplication =(Application) magicField.get(applicationContext);
         }
         catch (NoSuchFieldException e)
         {
             //Log.e(TAG,e.getMessage());
         }
         catch (IllegalAccessException e)
         {
           //  Log.e(TAG, e.getMessage());
         }

         application = (APP)realApplication;
     }

     return application;
 }

如何运行

在没有运行项目的时候,我们的Run图标和以前是一样的。


运行成功后:如果前面没有一个闪电一样的图标。表示Instant Run失败


注意事项

使用instant Run 这个的时候。如果只修改xml布局的话,是不会重启application。如果需要将整个全部重启启动。可以点击下图关闭