我有一个媒体播放器作为成员变量的活动。
我的媒体播放器是这样初始化的:
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setDataSource(MyActivity.this, URL);
mMediaPlayer.prepareAsync();
//i set a on Prepared Listener to start playing on Prepared
Run Code Online (Sandbox Code Playgroud)
一切正常,然后我覆盖我的活动 onStop 方法以释放媒体播放器。
if(mMediaPlayer!=null){
if(mMediaPlayer.isPlaying()){
mMediaPlayer.stop();
}
mMediaPlayer.release();
mMediaPlayer=null;
}
Run Code Online (Sandbox Code Playgroud)
但是在活动停止后,我从 LeakCanary 收到了内存泄漏报告。
报告是这样的:
MyApp.Instance->
MyApp.mLoadedApk->
LoadedApk.mReceivers->
ArrayMap.mArray->
arrayObject[].[3]->
ArrayMap.mArray->
arrayObject[][0]->
MediaPlayer.mProxyReceiver->
MediaPlayer.mProxyContext->
leaks MyActivity instance.
MyApp.Instance->
MyApp.mLoadedApk->
LoadedApk.mReceivers->
ArrayMap.mArray->
arrayObject[].[3]->
ArrayMap.mArray->
arrayObject[][0]->
MediaPlayer.mProxyReceiver->
MediaPlayer.mProxyContext->
leaks MyActivity instance.
Run Code Online (Sandbox Code Playgroud)
是的,我有一个扩展 Application 的 MyApp 类,并且我在静态字段中持有对 MyApp 实例的引用,但我从未在我的活动中使用该引用,我该如何解决这个泄漏?
[编辑]
这是我的活动代码:
public class PlayActivity extends ActionBarActivity {
private MediaPlayer mediaPlayer;
@Override
protected void …
Run Code Online (Sandbox Code Playgroud) 我是LeakCanary工具的新手,在确定这个泄漏是否是由我的代码或Android本身泄漏引起的问题时遇到了问题.
我的猜测是这是一个Android问题,应该添加到AndroidExcludedRefs.java,但由于我是该工具的新手,我想在这个主题上提供一些帮助.
这是泄漏痕迹:
In com.visma.ruby:2.14.0:20.
* com.visma.ruby.invoice.create.InvoiceActivity has leaked:
* GC ROOT static android.view.WindowManagerGlobal.sDefaultWindowManager
* references android.view.WindowManagerGlobal.mRoots
* references java.util.ArrayList.array
* references array java.lang.Object[].[3]
* references android.view.ViewRootImpl.mContext
* references android.view.ContextThemeWrapper.mBase
* leaks com.visma.ruby.invoice.create.InvoiceActivity instance
* Retaining: 26 KB.
* Reference Key: ecc25c5b-2e09-492d-bdf4-cf5c02029ae3
* Device: LGE google Nexus 5 hammerhead
* Android Version: 6.0.1 API: 23 LeakCanary: 1.5 00f37f5
* Durations: watch=643568ms, gc=155ms, heap dump=3193ms, analysis=51151ms
* Details:
* Class android.view.WindowManagerGlobal
| static ADD_INVALID_TYPE = -10
| static RELAYOUT_RES_SURFACE_CHANGED = 4 …
Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中使用Crashlytics 2.6.5。金丝雀泄漏总是报告内存泄漏CrashlyticsUncaughtExceptionHandler
。有人面对过吗?请参考所附图片以获取更多信息
我搜索了一个答案,找不到任何东西,这可能意味着这是一个基本问题.冒着表达我无知的风险,无论如何我都会问.我正在准备我的应用程序发布,并希望确保泄漏金丝雀不会弹出我的用户.我的泄漏金丝雀相关的依赖关系就是这样.
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
}
Run Code Online (Sandbox Code Playgroud)
我认为,因为releaseCompile包含no-op
它意味着我可以按原样继续我的发布版本而不删除Leak Canary代码.我对吗?
我正在解决对这三个类的引用:
木材
泄漏金丝雀
我在我的 gradle 中为这些添加了依赖项,我在其他项目中也有这些依赖项,但我在这里遇到了问题。
我试图:
摇篮文件:
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.oss.licenses.plugin'
apply plugin: 'androidx.navigation.safeargs'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
compileSdkVersion 28
buildToolsVersion '28.0.0 rc2'
defaultConfig {
applicationId "com.nrs.sid.creditcardsecurity"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
}
sourceSets {
androidTest.assets.srcDirs += files("$projectDir/schemas".toString())
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
buildTypes { …
Run Code Online (Sandbox Code Playgroud) android android-navigation android-gradle-plugin leakcanary timber-android
我有一个活动,它的工具栏中有一个 SearchView,并且还包含 2 个片段(一个列出过去的搜索词,另一个显示结果)。加载该活动和片段后,LeakCanary 开始显示通知,指出该活动和两个片段都已泄漏。这三个都有类似的报告,如下所示:
它还从一个叫做 ReportFragment 的东西开始(我猜是一个系统片段,其泄漏报告也与上面发布的内容基本相同):
我无法弄清楚可能会泄漏什么,但我想知道是否有人遇到过类似的问题?
每次我尝试显示 DialogFragment 时,都会出现内存泄漏。
这是我的测试对话框(取自 android 开发人员页面)的样子:
public class TestDialog extends DialogFragment {
public static TestDialog newInstance(int title) {
TestDialog frag = new TestDialog();
Bundle args = new Bundle();
args.putInt("title", title);
frag.setArguments(args);
return frag;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
int title = getArguments().getInt("title");
return new AlertDialog.Builder(getActivity())
.setIcon(R.drawable.ic_action_about)
.setTitle(title)
.setPositiveButton(R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
//((FragmentAlertDialog)getActivity()).doPositiveClick();
}
}
)
.setNegativeButton(R.string.cancel,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
//((FragmentAlertDialog)getActivity()).doNegativeClick();
}
}
)
.create(); …
Run Code Online (Sandbox Code Playgroud) 我正在使用LeakCanary检测应用程序中的内存泄漏。我使用它成功地识别并修复了一些泄漏,但是我正在努力寻找该泄漏的根源:
* android.support.constraint.ConstraintLayout has leaked:
* Toast$TN.mNextView
* ? LinearLayout.mContext
* ? HomeActivity.!(mDelegate)!
* ? AppCompatDelegateImplN.!(mActionBar)!
* ? ToolbarActionBar.!(mDecorToolbar)!
* ? ToolbarWidgetWrapper.!(mToolbar)!
* ? Toolbar.mParent
* ? ConstraintLayout
* Reference Key: 552b5bc5-409d-44c4-8412-87341237ae6d
* Device: samsung samsung SM-G960F starltexx
* Android Version: 8.0.0 API: 26 LeakCanary: 1.6.2 0ebc1fc
* Durations: watch=5769ms, gc=153ms, heap dump=933ms, analysis=5802ms
Run Code Online (Sandbox Code Playgroud)
这是由Android SDK或应用专用代码引起的吗?
我们正在使用 firebase inapp 消息传递,它似乎在应用程序中任意泄漏(如泄漏金丝雀所示)多个内容。
这种泄漏有时会出现飞溅活动、OTP 片段或任何其他属于应用程序启动的内容。,
通常leakcanary将平台内容报告为Exclude,但这似乎没有被排除,令人惊讶的是,在任何这些片段/活动中都没有与inappmessage或firebae相关的代码。
* Details:
* Instance of com.app.nhs.NHSApplication
| static __nhsApplicationContext = com.app.nhs.NHSApplication@1115479984 (0x427cdfb0)
| static $staticOverhead = byte[48]@1115478585 (0x427cda39)
| static TAG = "NHSApplication"
| exoConfig = im.ene.toro.exoplayer.Config@1121658096 (0x42db24f0)
| profileId = null
| profileObj = null
| simpleCache = com.google.android.exoplayer2.upstream.cache.SimpleCache@1121423792 (0x42d791b0)
| mActivityLifecycleCallbacks = java.util.ArrayList@1115480056 (0x427cdff8)
| mAssistCallbacks = null
| mComponentCallbacks = java.util.ArrayList@1115480032 (0x427cdfe0)
| mLoadedApk = android.app.LoadedApk@1115461752 (0x427c9878)
| mBase = android.app.ContextImpl@1115551592 (0x427df768)
* Instance of java.util.ArrayList
| static $staticOverhead = …
Run Code Online (Sandbox Code Playgroud) android memory-leaks firebase leakcanary firebase-in-app-messaging
经过多次轮换并且应用程序处于后台后,我收到此泄漏。这是堆栈跟踪,我无法理解原因。另外32474006字节保留的对象非常多。我有 10 个相同的泄漏。
\n32474006 bytes retained by leaking objects\nDisplaying only 1 leak trace out of 10 with the same signature\nSignature: 329ec5b3be0cfe3ed2fc888129f5a6be93fb9\n\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n\xe2\x94\x82 GC Root: Global variable in native code\n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80 android.app.LoadedApk$ServiceDispatcher$DeathMonitor instance\n\xe2\x94\x82 Leaking: UNKNOWN\n\xe2\x94\x82 \xe2\x86\x93 LoadedApk$ServiceDispatcher$DeathMonitor.this$0\n\xe2\x94\x82 ~~~~~~\n\xe2\x94\x9c\xe2\x94\x80 android.app.LoadedApk$ServiceDispatcher instance\n\xe2\x94\x82 Leaking: UNKNOWN\n\xe2\x94\x82 \xe2\x86\x93 LoadedApk$ServiceDispatcher.mContext\n\xe2\x94\x82 ~~~~~~~~\n\xe2\x95\xb0\xe2\x86\x92 com.ics.homework.ui.MainActivity instance\n\xe2\x80\x8b Leaking: YES (ObjectWatcher was watching this because com.ics.homework.ui.MainActivity received Activity#onDestroy() callback and Activity#mDestroyed is true)\n\xe2\x80\x8b key = 8bcc50f8-ea3f-47d9-8dc3-904042a58df4\n\xe2\x80\x8b watchDurationMillis = 60220\n\xe2\x80\x8b retainedDurationMillis = 55216\n====================================\n0 LIBRARY LEAKS\n
Run Code Online (Sandbox Code Playgroud)\n泄漏原因
\n@AndroidEntryPoint\nclass MainActivity : AppCompatActivity(), NavController.OnDestinationChangedListener { …
Run Code Online (Sandbox Code Playgroud)