LeakCanary可以在非Android应用程序上使用吗?例如,在JavaFx应用程序中?
TNX
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
我使用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) MainActivity
对于新项目来说很简单
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
在处理泄漏时,我得到了一个java.lang.IllegalStateException: FirebaseApp with name [DEFAULT] doesn't exist.
内部Application.onCreate
.根据我的理解,这是因为LeakCanary创建了我的应用程序类而没有所有Google Play服务,Firebase无法成功初始化.任何想法如何解决这一问题?
编辑:我正在使用leakcanary-android:1.4-beta2
,这是在转储堆后发生的.
我这样做:
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
我在 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 文档编写了一个基本的绑定服务,但 LeakCanary 告诉我该服务正在泄漏。
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) 我已将 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) 我创建了一个实现 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\n6153 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