在过去的几天里,我一直在追逐并修复应用程序中的内存泄漏.在达到我认为已经修复它们的点之后,我实现了一个类似于Android StrictMode和堆转储中描述的失败响应机制(启用实例跟踪并判处死刑,拦截关闭错误消息,转储堆,发送应用程序启动时的遇险信号).当然,所有这些只是在调试版本中.
相信我已经修复了所有活动泄漏,某些活动仍会导致屏幕旋转时出现严格的模式实例违规警告.奇怪的是,只有一些,而不是所有应用程序的活动都这样做.
我已经审查了发生此类违规时所采取的堆转储,并检查了相关活动的代码以查找泄漏,但没有得到任何结果.
所以在这一点上,我试图做出尽可能小的测试用例.我创建了一个完全空白的活动(甚至没有布局),看起来像这样:
package com.example.app;
import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
StrictMode.setVmPolicy(
new StrictMode.VmPolicy.Builder()
.detectAll()
.penaltyLog()
.build());
StrictMode.setThreadPolicy(
new StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyDeath()
.penaltyLog()
.build());
super.onCreate(savedInstanceState);
}
}
Run Code Online (Sandbox Code Playgroud)
为了完整,清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.app" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.app.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
我打开活动(设备持有肖像).我旋转到横向,然后回到肖像,此时我在LogCat中从StrictMode看到:
01-15 17:24:23.248:E/StrictMode(13867):class com.example.app.MainActivity; 实例= 2; …
我已经开始使用Android StrictMode,并发现在开发期间始终运行它并不仅仅是我在git中创建的特殊分支上会很棒.我这样做的原因是我的应用程序要求以1.6及更高版本运行.
我在Android开发者博客上看到你可以设置它,以便通过反射激活它.我只是想知道它实际上是什么样的,如果有可能在这里(或其他地方)记录这些,而不是让所有想要使用它的人自己解决.