Skip to content

Instantly share code, notes, and snippets.


PY pyricau

View GitHub Profile
View WindowSpy.kt
import android.annotation.TargetApi
import android.os.Build.VERSION_CODES
import android.view.View
import android.view.Window
object WindowSpy {
* Installs a listener for new [Window] instances. This should only be called once, any new call
* will uninstall the previous listener.
pyricau / AndroidLeaks.kt
Created Jan 15, 2020
Fixing a SpellChecker leak in Android M
View AndroidLeaks.kt
* Every editable TextView has an Editor instance which has a SpellChecker instance. SpellChecker
* is in charge of displaying the little squiggle spans that show typos. SpellChecker starts a
* SpellCheckerSession as needed and then closes it when the TextView is detached from the window.
* A SpellCheckerSession is in charge of communicating with the spell checker service (which lives
* in another process) through TextServicesManager.
* The SpellChecker sends the TextView content to the spell checker service every 400ms, ie every
* time the service calls back with a result the SpellChecker schedules another check for 400ms
* later.
View TraceTest.kt
package com.example
import kotlin.annotation.AnnotationRetention.RUNTIME
import kotlin.annotation.AnnotationTarget.FUNCTION
* @see TracingRunListener
View CrashingRunListener.kt
package com.example
import android.os.Bundle
import android.util.Log
import androidx.test.internal.runner.listener.InstrumentationResultPrinter
import org.junit.runner.Description
import org.junit.runner.notification.RunListener
View BugsnagLeakUploader.kt
package com.squareup.leakcanary
import com.squareup.leakcanary.BugsnagLeakUploader.ReportType.FAILURE
import com.squareup.leakcanary.BugsnagLeakUploader.ReportType.LEAK
import com.squareup.leakcanary.BugsnagLeakUploader.ReportType.NOT_FOUND
import com.squareup.leakcanary.BugsnagLeakUploader.ReportType.WONT_FIX_LEAK
View build.gradle
dependencies {
debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.1'
releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.1'
// Optional, if you use support library fragments:
debugImplementation 'com.squareup.leakcanary:leakcanary-support-fragment:1.6.1'
import java.util.concurrent.Callable;
public enum Lol implements Callable<CharSequence> {
ಠ_ಠ {
@Override public String call() {
return "Foo";
View gist:8becbc14aeb670368ff8
GC Roots: 242256
System class root total: 197490 real: 90556 undefined: 106934
Undefined System Class roots:
long[] of size 65200: 26310
java.lang.Class[] of size 7570: 26310
java.lang.Class[] of size 3405: 12342
long[] of size 32034: 12342
long[] of size 29221: 10101
java.lang.Class[] of size 3097: 10101
pyricau /
Created May 9, 2015
Sending Leak Traces to a Slack Channel (and HipChat, see the comments)
import android.util.Log;
import com.squareup.leakcanary.AnalysisResult;
import com.squareup.leakcanary.DisplayLeakService;
import com.squareup.leakcanary.HeapDump;
import retrofit.RestAdapter;
import retrofit.RetrofitError;
import retrofit.http.Multipart;
import retrofit.http.POST;
import retrofit.http.Part;
import retrofit.mime.TypedFile;
You can’t perform that action at this time.