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 等。
添加回答
舉報