5 回答
TA贡献1829条经验 获得超7个赞
您可以在不使用Strict Mode进行反射的情况下实现完全相同的结果。具体来说,是这样的:
StrictMode.setVmPolicy(new VmPolicy.Builder()
.detectLeakedClosableObjects()
.penaltyLog()
.build());
一般来说,严格模式可以为您做更多事情(参见上面的文档链接),对于默认设置,您需要做的就是:
StrictMode.enableDefaults(); # <-- This includes warning on leaked closeables
要“尽快”启用严格模式,您可以将上述任一代码选项添加到应用程序类的构造函数中,例如:
public class MyApp extends Application {
public MyApp() {
if(BuildConfig.DEBUG)
StrictMode.enableDefaults();
}
}
请注意,除了只创建上面的类之外,您还需要告诉 Android 您已经在其中创建了一个自定义应用程序类AndroidManifest.xml(以便在您的应用程序进程启动时创建它的实例,而不是 Android 创建默认Application类)。您需要添加/修改标签android:name的属性<application>以指向您的自定义应用程序类(MyApp在本例中)的完全解析包路径:
<application
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:name="com.example.app.MyApp" <-- IMPORTANT PART: ADAPT FOR YOUR ACTUAL PROJECT
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
TA贡献1776条经验 获得超12个赞
此消息来自dalvik.system.CloseGuard。调试时,您可以将其设置为在创建资源时创建堆栈跟踪,以便您可以追踪哪些对象没有被关闭。
它不是框架 API 的一部分,所以我使用反射来打开它:
try {
Class.forName("dalvik.system.CloseGuard")
.getMethod("setEnabled", boolean.class)
.invoke(null, true);
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
}
更多信息:https://wh0.github.io/2020/08/12/closeguard.html
TA贡献1824条经验 获得超8个赞
我不认为您可以从 Logcat 中获得更多信息。
Android Profiler的内存视图可能是一个很好的起点。在使用您的应用程序时查看它应该可以让您了解哪些操作会导致内存被分配而不是被释放。您还可以从时间轴中选择部分,并按类别深入到特定分配。
另外,LeakCanary是一个检测内存泄漏的好库。
TA贡献1854条经验 获得超8个赞
迟到的答案,但它可能对其他人有用:
我遇到了同样的错误,但我忘记了我的 VPN 在后台运行。断开 VPN 对我有用。这就是说,这可能是由于与您的应用程序或您可能想要检查的 IDE 无关的资源造成的,例如防病毒软件、VPN 等。
添加回答
举报