Move leakcanary to open source and add build files

Summary:
Made sure it builds with both buck and Gradle.

Follow-up to D8865149.

Reviewed By: danielbuechele

Differential Revision: D9178885

fbshipit-source-id: 46efaa532efdc1d59ce76e04be6680e233084881
This commit is contained in:
Pascal Hartig
2018-08-06 03:02:03 -07:00
committed by Facebook Github Bot
parent 5c81aefe9a
commit dedd953c28
4 changed files with 114 additions and 0 deletions

View File

@@ -51,6 +51,7 @@ android {
implementation deps.lithoCore implementation deps.lithoCore
implementation deps.lithoWidget implementation deps.lithoWidget
implementation deps.rhino implementation deps.rhino
implementation deps.leakcanary
} }
} }

View File

@@ -0,0 +1,76 @@
/*
* Copyright (c) 2018-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the LICENSE
* file in the root directory of this source tree.
*
*/
package com.facebook.sonar.plugins.leakcanary;
import android.util.Log;
import com.facebook.sonar.core.SonarConnection;
import com.facebook.sonar.core.SonarObject;
import com.facebook.sonar.core.SonarPlugin;
import com.facebook.sonar.core.SonarReceiver;
import com.facebook.sonar.core.SonarResponder;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class LeakCanarySonarPlugin implements SonarPlugin {
private static final String TAG = "LeakCanarySonarPlugin";
private static final String REPORT_LEAK_EVENT = "reportLeak";
private static final String CLEAR_EVENT = "clear";
private static final String LEAKS_KEY = "leaks";
private SonarConnection mConnection;
private final List<String> leakList = new ArrayList<>();
@Override
public String getId() {
return "LeakCanary";
}
@Override
public void onConnect(SonarConnection connection) {
mConnection = connection;
sendLeakList();
mConnection.receive(
CLEAR_EVENT,
new SonarReceiver() {
@Override
public void onReceive(SonarObject params, SonarResponder responder) throws Exception {
leakList.clear();
}
});
}
@Override
public void onDisconnect() throws Exception {
mConnection = null;
}
private void sendLeakList() {
if (mConnection != null) {
JSONObject obj = new JSONObject();
try {
obj.put(LEAKS_KEY, new JSONArray(leakList));
mConnection.send(REPORT_LEAK_EVENT, new SonarObject(obj));
} catch (JSONException e) {
Log.w(TAG, "Failure to serialize leak list: ", e);
}
}
}
public void reportLeak(String leakInfo) {
leakList.add(leakInfo);
sendLeakList();
}
}

View File

@@ -0,0 +1,36 @@
/*
* Copyright (c) 2018-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the LICENSE
* file in the root directory of this source tree.
*
*/
package com.facebook.sonar.plugins.leakcanary;
import static com.squareup.leakcanary.LeakCanary.leakInfo;
import com.facebook.sonar.android.AndroidSonarClient;
import com.facebook.sonar.core.SonarClient;
import com.squareup.leakcanary.AbstractAnalysisResultService;
import com.squareup.leakcanary.AnalysisResult;
import com.squareup.leakcanary.HeapDump;
/**
* When a leak is detected, sends results to connected Sonar desktop app. In order to use this
* service in place of the default, a custom RefWatcher will need to be created See
* https://github.com/square/leakcanary/wiki/Customizing-LeakCanary#uploading-to-a-server
*/
public class RecordLeakService extends AbstractAnalysisResultService {
@Override
protected void onHeapAnalyzed(HeapDump heapDump, AnalysisResult result) {
final String leakInfo = leakInfo(this, heapDump, result, true);
final SonarClient client = AndroidSonarClient.getInstance(this);
if (client != null) {
final LeakCanarySonarPlugin plugin = client.getPlugin("LeakCanary");
if (plugin != null) {
plugin.reportLeak(leakInfo);
}
}
}
}

View File

@@ -66,6 +66,7 @@ ext.deps = [
junit : 'junit:junit:4.12', junit : 'junit:junit:4.12',
stetho : 'com.facebook.stetho:stetho:1.5.0', stetho : 'com.facebook.stetho:stetho:1.5.0',
okhttp3 : 'com.squareup.okhttp3:okhttp:3.10.0', okhttp3 : 'com.squareup.okhttp3:okhttp:3.10.0',
leakcanary : 'com.squareup.leakcanary:leakcanary-android:1.6.1',
// Plugin dependencies // Plugin dependencies
rhino : 'org.mozilla:rhino:1.7.10', rhino : 'org.mozilla:rhino:1.7.10',
] ]