标签: leakcanary

在非Android应用程序上使用LeakCanary

LeakCanary可以在非Android应用程序上使用吗?例如,在JavaFx应用程序中?

TNX

java memory-leaks leakcanary

6
推荐指数
1
解决办法
136
查看次数

FragmentManager(v4)不从mCreatedMenus中删除片段

LeakCanary在我的代码中发现了泄漏

* classifieds.yalla.features.ad.page.seller.SellerAdPageFragment has leaked:
* GC ROOT android.view.inputmethod.InputMethodManager$1.this$0 (anonymous subclass of com.android.internal.view.IInputMethodClient$Stub)
* references android.view.inputmethod.InputMethodManager.mNextServedView
* references android.support.v4.widget.DrawerLayout.mContext
* references classifieds.yalla.features.host.HostActivity.fragNavController
* references com.ncapdevi.fragnav.FragNavController.mFragmentManager
* references android.support.v4.app.FragmentManagerImpl.mCreatedMenus
* references java.util.ArrayList.elementData
* references array java.lang.Object[].[0]
* leaks classifieds.yalla.features.ad.page.seller.SellerAdPageFragment instance
Run Code Online (Sandbox Code Playgroud)

但当我看着 FragmentManagerImpl

FragmentManagerImpl.mCreatedMenus得到清理时我没有找到.我找到的唯一代码是添加新片段的时候.不应该以某种方式管理它吗?

public boolean dispatchCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        boolean show = false;
        ArrayList<Fragment> newMenus = null;
        if (mAdded != null) {
            for (int i=0; i<mAdded.size(); i++) {
                Fragment f = mAdded.get(i);
                if (f != null) {
                    if (f.performCreateOptionsMenu(menu, …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-support-library leakcanary

6
推荐指数
2
解决办法
1095
查看次数

Android片段管理器内存泄漏

我使用LeakCanary检测我的应用程序中的内存泄漏。我的代码有什么问题,为什么会这样?一开始,我将片段管理器作为一个新对象使用,然后我尝试了,getSupportFragmentManager()但同样发生了。

这是日志

    ```
ApplicationLeak(className=com.dev.myApp.ViewDialog, leakTrace=
?
?? android.app.ActivityThread
?    Leaking: NO (ActivityThread? is not leaking and a class is never leaking)
?    GC Root: System class
?    ? static ActivityThread.sCurrentActivityThread
?? android.app.ActivityThread
?    Leaking: NO (ArrayMap? is not leaking)
?    ? ActivityThread.mActivities
?? android.util.ArrayMap
?    Leaking: NO (Object[]? is not leaking)
?    ? ArrayMap.mArray
?? java.lang.Object[]
?    Leaking: NO (ActivityThread$ActivityClientRecord? is not leaking)
?    ? array Object[].[3]
?? android.app.ActivityThread$ActivityClientRecord
?    Leaking: NO (Editor? is not leaking)
?    ? …
Run Code Online (Sandbox Code Playgroud)

android memory-leaks memory-management leakcanary

6
推荐指数
1
解决办法
260
查看次数

Android计费客户端导致内存泄漏

MainActivity对于新项目来说很简单

\n
public class MainActivity extends AppCompatActivity {\n  BillingClient billingClient;\n  PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {\n    @Override\n    public void onPurchasesUpdated(@NonNull BillingResult billingResult, @Nullable List<Purchase> list) {\n\n    }\n};\n@Override\nprotected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    setContentView(R.layout.activity_main);\n}\n\n\n@Override\nprotected void onStart() {\n    super.onStart();\n    billingClient = BillingClient.newBuilder(this)\n            .enablePendingPurchases()\n            .setListener(purchasesUpdatedListener)\n            .build();\n    billingClient.startConnection(new BillingClientStateListener() {\n        @Override\n        public void onBillingSetupFinished(@NonNull BillingResult billingResult) {\n\n        }\n\n        @Override\n        public void onBillingServiceDisconnected() {\n\n        }\n    });\n}\n\n@Override\nprotected void onStop() {\n    super.onStop();\n    billingClient.endConnection();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

在 Gradle 文件中:

\n
  ....\n  implementation 'com.android.billingclient:billing:3.0.2'\n  debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.5'\n
Run Code Online (Sandbox Code Playgroud)\n

金丝雀输出(1 个不同的泄漏): …

android memory-leaks in-app-billing leakcanary play-billing-library

6
推荐指数
0
解决办法
1204
查看次数

Leakcanary与Google的Firebase崩溃

在处理泄漏时,我得到了一个java.lang.IllegalStateException: FirebaseApp with name [DEFAULT] doesn't exist.内部Application.onCreate.根据我的理解,这是因为LeakCanary创建了我的应用程序类而没有所有Google Play服务,Firebase无法成功初始化.任何想法如何解决这一问题?

编辑:我正在使用leakcanary-android:1.4-beta2,这是在转储堆后发生的.

android firebase leakcanary

5
推荐指数
1
解决办法
871
查看次数

如何从 LeakCanary 中排除一个类?

我这样做:

ExcludedRefs excludedRefs = AndroidExcludedRefs.createAppDefaults()
                .clazz("androidx.lifecycle.ReportFragment")
                .reason("Very annoying report fragment leak that isn't a leak apparently")
                .alwaysExclude()
                .build();
        LeakCanary
                .refWatcher(context)
                .listenerServiceClass(DisplayLeakService.class)
                .excludedRefs(excludedRefs)
                .watchDelay(10, TimeUnit.SECONDS)
                .buildAndInstall();
Run Code Online (Sandbox Code Playgroud)

然而我仍然得到ReportFragment was never GCed but no leak found.

我的一项活动也得到了这一点,我不知道该怎么处理这些no leak found消息。

编辑:当前使用 LeakCanary 1.6.3

android leakcanary

5
推荐指数
1
解决办法
1201
查看次数

BottomSheetDialogFragment 内存泄漏(使用leakcanary)

我在 PopupDialog 中发现了内存泄漏,但我不知道为什么。

所以我注释掉了所有被覆盖的方法,但我仍然有漏洞。

底部表单对话框

class PopupDialog : BottomSheetDialogFragment() {

    // Annotated all methods and variable.

}
Run Code Online (Sandbox Code Playgroud)

活动

fun showPopupDialog() = 
    PopupDialog().show(supportFragmentManager, "DialogTag.POPUP_DIALOG")
Run Code Online (Sandbox Code Playgroud)

泄漏金丝雀

在此处输入图片说明

android memory-leaks leakcanary bottom-sheet

5
推荐指数
1
解决办法
1381
查看次数

绑定服务泄漏内存

根据 Android 文档编写了一个基本的绑定服务,但 LeakCanary 告诉我该服务正在泄漏。

  1. 是否存在泄漏或我是否错误配置了 LeakCanary?
  2. 如何编写不泄漏的绑定服务?

编码

class LocalService : Service() {

  private val binder = LocalBinder()
  private val generator = Random()

  val randomNumber: Int
    get() = generator.nextInt(100)

  inner class LocalBinder : Binder() {
    fun getService(): LocalService = this@LocalService
  }

  override fun onBind(intent: Intent): IBinder {
    return binder
  }

  override fun onDestroy() {
    super.onDestroy()
    LeakSentry.refWatcher.watch(this) // Only modification is to add LeakCanary
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我从一个活动绑定到服务如下,LeakCanary 检测到服务已经泄漏

class MainActivity: Activity() {

  private var service: LocalService? …
Run Code Online (Sandbox Code Playgroud)

android android-service android-service-binding leakcanary

5
推荐指数
1
解决办法
550
查看次数

谷歌地图 MapsView 泄漏

我已将 Google Maps MapView 添加到 Android 中的 Fragment。到目前为止,它是一张没有任何标记、选项或其他任何东西的清晰地图。尽管如此,每当我离开 Fragment 时,应用程序都会出现内存泄漏。

我已经尝试了我发现的所有建议的解决方案,例如将 MapView 附加到 Fragment Lifecycle,将其设置为不为 nullonDestroyView()等等,但内存泄漏仍然存在。

当前代码如下所示:

fragment_map.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.gms.maps.MapView
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

MapViewFragment.java

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_map, container, false);

        mMapView = view.findViewById(R.id.mapView);
        mMapView.onCreate(savedInstanceState);
        mMapView.onResume();

        MapsInitializer.initialize(Objects.requireNonNull(getActivity()).getApplicationContext());

        mMapView.getMapAsync(googleMap -> {
            mGoogleMap = googleMap;
        });

        return view;
    }

@Override
public void onResume() {
        super.onResume();
        mMapView.onResume();
    }

@Override
public …
Run Code Online (Sandbox Code Playgroud)

java android google-maps memory-leaks leakcanary

5
推荐指数
1
解决办法
791
查看次数

泄漏金丝雀检测 MediaBrowserServiceCompat 示例应用程序中的内存泄漏

我创建了一个实现 MediaBrowserServiceCompat 的测试应用程序。我已遵循本指南:\n https://developer.android.com/guide/topics/media-apps/audio-app/building-a-mediabrowserservice \n创建了 MediaPlaybackService 和 MainActivity。我添加了泄漏金丝雀,并在 onDestroy 方法中添加了 AppWatcher.objectWatcher.watch(this) 。打开和退出应用程序时,leak canary 会发现泄漏:

\n\n
6153 bytes retained\n    \xe2\x94\xac\n    \xe2\x94\x9c\xe2\x94\x80 android.service.media.MediaBrowserService$ServiceBinder\n    \xe2\x94\x82    Leaking: UNKNOWN\n    \xe2\x94\x82    GC Root: Global variable in native code\n    \xe2\x94\x82    \xe2\x86\x93 MediaBrowserService$ServiceBinder.this$0\n    \xe2\x94\x82                                        ~~~~~~\n    \xe2\x94\x9c\xe2\x94\x80 androidx.media.MediaBrowserServiceCompat$MediaBrowserServiceImplApi26$MediaBrowserServiceApi26\n    \xe2\x94\x82    Leaking: UNKNOWN\n    \xe2\x94\x82    MediaBrowserServiceCompat$MediaBrowserServiceImplApi26$MediaBrowserServiceApi26 does not wrap an activity context\n    \xe2\x94\x82    \xe2\x86\x93 MediaBrowserServiceCompat$MediaBrowserServiceImplApi26$MediaBrowserServiceApi26.mBase\n    \xe2\x94\x82                                                                                      ~~~~~\n    \xe2\x95\xb0\xe2\x86\x92 com.example.mediabrowsertestapp.MediaPlaybackService\n    \xe2\x80\x8b     Leaking: YES (ObjectWatcher was watching this)\n    \xe2\x80\x8b     MediaPlaybackService does not wrap an activity context\n    \xe2\x80\x8b     key = 11f40383-1498-4743-9f20-208cbd2839a1\n    \xe2\x80\x8b     watchDurationMillis = 5191\n …
Run Code Online (Sandbox Code Playgroud)

android memory-leaks android-service leakcanary mediabrowserservice

5
推荐指数
1
解决办法
1372
查看次数