-
-
Save nesterchung/0fdc12ef10393d3b74006db621076026 to your computer and use it in GitHub Desktop.
Sending Leak Traces to a Slack Channel (and HipChat, see the comments)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
public final class LeakSlackUploadService extends DisplayLeakService { | |
/** See https://api.slack.com/ for documentation. */ | |
public interface SlackApi { | |
String TOKEN = "xoxp-SOME-USER-TOKEN"; | |
String MEMORY_LEAK_CHANNEL = "SOME-CHANNEL-TOKEN"; | |
@Multipart @POST("/api/files.upload") UploadFileResponse uploadFile(@Part("token") String token, | |
@Part("file") TypedFile file, @Part("filetype") String filetype, | |
@Part("filename") String filename, @Part("title") String title, | |
@Part("initial_comment") String initialComment, @Part("channels") String channels); | |
} | |
public static class UploadFileResponse { | |
boolean ok; | |
String error; | |
@Override public String toString() { | |
return "UploadFileResponse{" + | |
"ok=" + ok + | |
", error='" + error + '\'' + | |
'}'; | |
} | |
} | |
private static final String TAG = "LeakListenerService"; | |
private static String classSimpleName(String className) { | |
int separator = className.lastIndexOf('.'); | |
return separator == -1 ? className : className.substring(separator + 1); | |
} | |
private SlackApi slackApi; | |
@Override public void onCreate() { | |
super.onCreate(); | |
slackApi = new RestAdapter.Builder() // | |
.setEndpoint("https://slack.com") // | |
.build() // | |
.create(SlackApi.class); | |
} | |
@Override | |
protected void afterDefaultHandling(HeapDump heapDump, AnalysisResult result, String leakInfo) { | |
if (!result.leakFound || result.excludedLeak) { | |
return; | |
} | |
String name = classSimpleName(result.className); | |
if (!heapDump.referenceName.equals("")) { | |
name += "(" + heapDump.referenceName + ")"; | |
} | |
String title = name + " has leaked"; | |
String initialComment = leakInfo; | |
try { | |
slackApi.uploadFile(SlackApi.TOKEN, | |
new TypedFile("application/octet-stream", heapDump.heapDumpFile), null, | |
heapDump.heapDumpFile.getName(), title, initialComment, SlackApi.MEMORY_LEAK_CHANNEL); | |
} catch (RetrofitError e) { | |
Log.e(TAG, "Error when uploading heap dump", e); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class SquareDebugApplication extends SquareApplication { | |
@Override protected RefWatcher installLeakCanary() { | |
return LeakCanary.install(app, LeakSlackUploadService.class); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment