写在前面的话
一直不乐意写博客。因为在我看来很多自己记记就好了。网站上往往有一大堆的回答。不要自己再去多加一篇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。如果需要将整个全部重启启动。可以点击下图关闭