
Mit AppSpector können Sie Ihre App im selben Raum oder auf einem anderen Kontinent aus der Ferne debuggen. Sie können die App -Leistung messen, Datenbankinhalte, Protokolle, Netzwerkanforderungen und vieles mehr in Echtzeit anzeigen. Dies ist das Instrument, das Sie gesucht haben. Beschränken Sie sich nicht nur auf einfache Protokolle. Debugging muss nicht schmerzhaft sein!
Jede App, die Sie mit AppSpector SDK verwenden möchten, müssen Sie sich über das Web (https://app.appspector.com) oder die Desktop -App in unserem Dienst registrieren. Nach dem Hinzufügen der Anwendung navigieren Sie zu App -Einstellungen und kopieren Sie den API -Schlüssel.
apply plugin : ' com.android.application '
// Add AppSpector maven repository
repositories {
maven { url " https://maven.appspector.com/artifactory/android-sdk " }
}
dependencies {
implementation " com.appspector:android-sdk:1.+ "
}Falls Sie nicht AppSector SDK in Ihrer Release-APK verwenden möchten, verwenden Sie Appspector No-op-Artefakt
dependencies {
debugImplementation " com.appspector:android-sdk:1.6.+ "
releaseImplementation( " com.appspector:android-sdk:1.6.+ " ) {
exclude group : ' com.appspector ' , module : ' android-core '
}
} import android . app . Application ;
import com . appspector . sdk . AppSpector ;
public class AmazingApp extends Application {
@ Override
public void onCreate () {
super . onCreate ();
// We recommend to start AppSpector from Application#onCreate method
// You can start all monitors
AppSpector
. build ( this )
. withDefaultMonitors ()
. run ( "API_KEY" );
// Or you can select monitors that you want to use
AppSpector
. build ( this )
. addPerformanceMonitor ()
. addLogMonitor ()
// Next line disables added monitor above. In our case, Log and Performace monitors.
. disableProvidedMonitors () // Disabled monitors can be enabled from Dashboard.
. addHttpMonitor ()
. addScreenshotMonitor ()
. addSQLMonitor ()
// Monitors that were not added to config will be ignored till declared here.
. run ( "API_KEY" );
}
}AppSector SDK sammelt und speichert Benutzerdaten einschließlich Protokolle, Datenbankinhalt und Netzwerkverkehr. All dies kann sensible Daten enthalten. Um Ihre Privatsphäre zu schützen, bieten wir ein zusätzliches Modul mit E2EE -Funktion an. Sie können alle Daten -AppSector -Senden von oder an Ihr Gerät verschlüsseln und sicherstellen, dass Sie es nur entschlüsseln können. Aus Sicherheitsgründen sind verschlüsselte Sitzungen nur in der Desktop -Anwendung verfügbar.
Um die Verschlüsselung zu verwenden, müssen Sie die Option Enable End-To-End encryption während der Registrierung Ihrer App mithilfe der Desktop-Anwendung aktivieren (zuvor registrierte Anwendung kann nicht zur Unterstützung der Verschlüsselung aktualisiert werden).
Danach müssen Sie das android-sdk-encryption Modul zu Ihrer Abhängigkeitserklärung hinzufügen. Ihr build.gradle auf App-Ebene. Gradle sollte die nächsten Zeilen enthalten:
apply plugin : ' com.android.application '
// Add AppSpector maven repository
repositories {
maven { url " https://maven.appspector.com/artifactory/android-sdk " }
}
dependencies {
implementation " com.appspector:android-sdk:1.+ "
implementation ' com.appspector:android-sdk-encryption:1.+ '
} Aktivieren Sie schließlich die Verschlüsselung, indem Sie die enableEncryption in die SDK -Konfiguration setzen. Der Public Key den Sie auf dem Bildschirm "Anwendungseinstellungen" finden können.
AppSpector
. build ( this )
. withDefaultMonitors ()
. enableEncryption ( "CLIENT_PUBLIC_KEY" )
. run ( "API_KEY" );Bauen Sie Ihr Projekt auf und sehen Sie alles funktionieren! Wenn Ihre App in Betrieb ist, können Sie zu https://app.appspector.com gehen und eine Verbindung zu Ihrer Bewerbungssitzung herstellen.
Nach dem Aufrufen der run -Methode startet die SDK die Datenerfassung und die Daten, die in den Webdienst übertragen werden. Ab diesem Zeitpunkt können Sie Ihre Sitzung im Appspector -Client sehen.
Da wir empfehlen, die SDK -Initialisierung in der onCreate() -Methode Ihrer Anwendung beizubehalten, bietet der SDK Methoden, mit denen Sie den Appspector -Status durch Aufrufen von stopSdk() und statischen startSdk() -Methoden kontrollieren können. Sie können diese Methoden erst anwenden, nachdem Appspector initialisiert wurde.
Der stop() fordert Appspector auf, alle Datenerfassung zu deaktivieren und die aktuelle Sitzung zu schließen.
AppSpector . stopSdk (); Der startSdk() startet es erneut mit der Konfiguration, die Sie bei der Initialisierung bereitgestellt haben.
AppSpector . startSdk (); Als Ergebnis wird eine neue Sitzung erstellt und alle Aktivitäten zwischen stop() und start() Anrufe werden nicht verfolgt.
Um den Appspector -Status zu überprüfen, können Sie die isStarted() -Methode verwenden.
AppSpector . shared (). isStarted (); Sie können Ihrem Gerät einen benutzerdefinierten Namen zuweisen, um die benötigten Sitzungen in der Liste der Sitzungen problemlos zu finden. Dazu sollten Sie den gewünschten Namen als Wert für AppSpector.METADATA_KEY_DEVICE_NAME Key zum metadata -Wörterbuch hinzufügen:
AppSpector
. build ( this )
. withDefaultMonitors ()
. addMetadata ( AppSpector . METADATA_KEY_DEVICE_NAME , "YOUR_DEVICE_NAME" )
. run ( "YOUR_API_KEY" );Außerdem ermöglicht das SDK die Verwaltung des Gerätenamens während der Anwendungslebensdauer mit Verwendung
Die setMetadataValue -Methode zum Ändern des Gerätenamens
AppSpector . shared (). setMetadataValue ( AppSpector . METADATA_KEY_DEVICE_NAME , "NEW_DEVICE_NAME" ); oder der removeMetadataValue , um Ihren benutzerdefinierten Gerätenamen zu entfernen
AppSpector . shared (). removeMetadataValue ( AppSpector . METADATA_KEY_DEVICE_NAME ); Für das Durchsuchen und Ausführen von SQL -Abfragen in der SQLCipher -Datenbank müssen Sie einige zusätzliche Schritte ausführen. Fügen Sie zunächst das sqlcipher-extension Ihrer app/build.gradle Datei unter dem Haupt-SDK-Modul hinzu. Also wird es so aussehen:
dependencies {
implementation ' com.appspector:android-sdk:1.+ '
implementation ' com.appspector:sqlcipher-extension:1.+ '
} Erstellen Sie danach DatabaseConnectionFactory und geben Sie sie als Argument der addSQLMonitor -Methode weiter.
Stellen Sie uns vor, Ihr Projekt enthält die SQLCipher -Datenbank mit "my_encrypted_db" -Name und anderen SQLite -Angaben:
AppSpector
. build ( this )
. withDefaultMonitors ()
. addSQLMonitor ( new SQLiteMonitor . DatabaseConnectionFactory () {
@ NonNull
@ Override
public DatabaseConnection createDatabaseConnection ( @ NonNull Database database ) {
if ( "my_encrypted_db" . equals ( database . name )) {
return new SQLCipherDatabaseConnection ( database , "password" );
}
return new SQLiteDatabaseConnection ( database );
}
})
. run ( "YOUR_API_KEY" );Manchmal möchten Sie einige Daten -Appspector -Teile anpassen oder komplett überspringen.
Zu diesem Zeitpunkt bietet der HTTP -Monitor die Schnittstelle HTTPFilter , die an addHttpMonitor(HTTPFilter) -Methode vorbeigegeben werden kann.
Nehmen wir an, wir möchten unser Auth -Token von Anfragen Headers überspringen. Hier ist ein Beispiel dieses Filters:
public class TokenFilter implements HTTPFilter {
@ Nullable
@ Override
public HttpRequest filter ( HttpRequest request ) {
if ( request . getHeaders (). containsKey ( "YOUR-AUTH-HEADER" )) {
request . getHeaders (). remove ( "YOUR-AUTH-HEADER" );
}
return request ;
}
@ Nullable
@ Override
public HttpResponse filter ( HttpResponse response ) {
return response ;
}
} Mit dem SharedPreferences -Monitor können Sie Dateien angeben, die Sie beobachten möchten, indem Sie SharedPreferencesSourceFactory verwenden.
SharedPreferencesSourceFactory.all() -Methode bereitstellt. Standardmäßig verwendet der Monitor diesen Wert.SharedPreferencesSourceFactory.excludeFiles("preferences_name") -Methode, wobei "Preferences_Name" ein Name ignorierter Datei ist. Sie können so viele Dateinamen übergeben, wie Sie möchten.SharedPreferencesSourceFactory.only("preferences_name") -Methode, wobei "Preferences_Name" ein Name der Datei zur Beobachtung ist. Diese Methode empfängt auch so viele Argumens, wie Sie möchten. Zusätzlich ermöglicht der Monitor, SharedPreferencesMonitor.Filter zum Entfernen oder Ändern einiger Werte vor dem Senden von Daten auf den Client bereitzustellen.
Nehmen wir an, Sie möchten key_1 entfernen und key_2 -Einstellungen in der preferences_name ändern. Ihr Filter sieht also so aus:
public class SimpleSharedPreferencesFilter implements SharedPreferencesMonitor . Filter {
@ NonNull
@ Override
public Map < String , PreferenceValue > filter ( @ NonNull String fileName , @ NonNull Map < String , PreferenceValue > values ) {
if ( fileName . equals ( "preferences_name" )) {
values . remove ( "key_1" );
if ( values . containsKey ( "key_2" )) {
values . put ( "key_2" , PreferenceValue . stringValue ( "modified value" ));
}
}
return values ;
}
} Um diese Anpassungen anzuwenden, müssen Sie eine dieser Methoden verwenden: addSharedPreferenceMonitor(SharedPreferencesMonitor.Filter) , addSharedPreferenceMonitor(SharedPreferencesSourceFactory) , addSharedPreferenceMonitor(SharedPreferencesSourceFactory, SharedPreferencesMonitor.Filter) .
Um Protokolle zu filtern, müssen Sie LogMonitor.Filter implementieren und an addLogMonitor(LogMonitor.Filter) weitergeben.
Betrachten wir ein Beispiel, in dem wir eine Protokollebene ändern möchten, um alle Nachrichten mit Word -Token zu warnen:
public class LogFilter implements LogMonitor . Filter {
@ Nullable
@ Override
public LogEvent filter ( LogEvent event ) {
if ( event . message . contains ( "token" )) {
event . level = LogLevel . WARN ;
}
return request ;
}
}Lassen Sie uns den Monitoren die erstellten Filptes zur Verfügung stellen:
AppSpector
. build ( this )
. withDefaultMonitors ()
. addHttpMonitor ( new TokenFilter ())
. addSharedPreferenceMonitor ( new SimpleSharedPreferencesFilter ())
. addLogMonitor ( new LogFilter ())
. run ( "YOUR_API_KEY" );Manchmal müssen Sie möglicherweise eine URL auf die aktuelle Sitzung aus dem Code verweisen. Angenommen, Sie möchten einen Linkabsturz in Ihrem Crash -Reporter damit, schreiben Sie ihn an eine Protokolle oder zeigen Sie in Ihrer Debug -Benutzeroberfläche an. Um diese URL zu erhalten, müssen Sie einen Sitzungsstart -Rückruf hinzufügen:
AppSpector . shared (). setSessionUrlListener ( new SessionUrlListener () {
@ Override
public void onReceived ( @ NonNull String sessionUrl ) {
// Save url for future use...
}
});Standardmäßig ist Appspector SDK aktiv, bis die Anwendung von Android OS getötet wird, auch wenn keine Aktivitäten übrig sind. Dies kann zu unnötigen Datenerfassung und langen Sitzungen für inaktive Apps führen. Wir bieten API zur Deaktivierung der Datenerfassung für einen Fall, in dem die App keine Aktivitäten gestartet hat.
AppSpector
. build ( this )
. collectDataInBackground ( false ) // Set this flag to disable data collection if no activities left
. withDefaultMonitors ()
. run ( "YOUR_API_KEY" ); Wenn Sie Appspector Gradle Plugin nicht verwenden möchten, können Sie eine alternative Möglichkeit verwenden, um HTTP -Anforderungen und Antworten abzufangen. Sie können AppSpectorOkHttp3Interceptor zu Ihrem Okhttpclient (oder AppSpectorOkHttp2Interceptor für die alte Version von Okhttpclient) manuell hinzufügen. Vergessen Sie auch nicht , das AppSPector -Plugin aus Ihrer app/build.gradle -Datei zu entfernen, wenn das Plugin hinzugefügt wird.
new OkHttpClient . Builder ()
. addInterceptor ( new AuthenticationInterceptor ()) // for example, it adds auth token to you request
. addInterceptor ( new AppSpectorOkHttp3Interceptor ()) // it will track your requests and responses
. build () Zum aktuellen Moment bietet die SDK API für manuelle Einrichtung in Ihrer Codebasis. Um es im Projekt zu verwenden, müssen Sie zunächst die Abhängigkeit urlconnection-extension Gradle hinzufügen:
dependencies {
implementation ' com.appspector:android-sdk:1.+ '
implementation ' com.appspector:urlconnection-extension:1.+ '
} Ersetzen Sie danach die url.openConnection() -Aufrufe durch UrlInstrument.openConnection(url) . Angenommen, wir haben die Methode, um die Google -Seite zu erhalten, und wir möchten diese Anfrage verfolgen:
import java . net . HttpURLConnection ;
import java . net . URL ;
public void getGooglePage () {
HttpURLConnection connection = null ;
try {
connection = ( HttpURLConnection ) new URL ( "https://google.com" ). openConnection ();
if ( connection . getResponseCode () == 200 ) {
//Read data from connection.inputStream
}
} catch ( IOException ex ) {
Log . d ( "UrlConnectionSample" , "Request was failed" , ex );
} finally {
if ( connection != null ) {
connection . disconnect ();
}
}
}Nach der Integration des SDK sieht es so aus wie dieser:
import com . appspector . sdk . urlconnection . instrumentation . UrlInstrument ;
import java . net . HttpURLConnection ;
import java . net . URL ;
public void getGooglePage () {
HttpURLConnection connection = null ;
try {
connection = ( HttpURLConnection ) UrlInstrument . openConnection ( new URL ( "https://google.com" ));
if ( connection . getResponseCode () == 200 ) {
//Read data from connection.inputStream
}
} catch ( IOException ex ) {
Log . d ( "UrlConnectionSample" , "Request was failed" , ex );
} finally {
if ( connection != null ) {
connection . disconnect ();
}
}
} Und das war's! Hinweis: Für uns ist es wichtig, die disconnect aufzurufen. Es ist ein Marker, dass die Anfrage abgeschlossen wurde.
Wenn Holz in Ihr Projekt integriert wurde, können Sie es problemlos mit AppSpector verwenden:
Timber . plant ( new Timber . DebugTree () {
@ Override
void log ( int priority , String tag , @ NotNull String message , Throwable t ) {
Logger . log ( priority , tag , message , t )
}
})Appspector bietet viele Monitore, die verschiedene Aktivitäten in Ihrer App verfolgen:
Bietet Browser für SQLite -Datenbanken in Ihrer App. Ermöglicht, alle Abfragen zu verfolgen, zeigt das DB -Schema und die Daten in DB an. Sie können eine benutzerdefinierte SQL -Abfrage auf jedem DB ausstellen und die Ergebnisse im Browser sofort sehen.

Zeigt alle HTTP -Datenverkehr in Ihrer App an. Sie können jede Anfrage prüfen, siehe Anforderungs-/Antwort -Header und Körper. Wir bieten XML und JSON Highliting für Anforderungs-/Antworten mit Formatierungs- und Faltoptionen, sodass selbst große Antworten leicht zu schauen sind.

Zeigt alle von Ihrer App generierten Protokolle an.

Mit AppSPector Logger können Sie die Protokollnachricht nur in den AppSPector -Dienst sammeln. Es ist nützlich, wenn Sie eine interne Datenhexe melden können, die über LogCat durchgesickert werden können. Appspector Logger hat die gleiche API mit android.util.Log -Klasse.
Logger . d ( "MyTAG" , "It won't be printed to the Logcat" );Die meisten Apps sind Standortbewusstsein. Das Testen erfordert die Änderung der Standorte selbst. In diesem Fall ist der Standortverspotten ein Echtzeit -Sparer. Zeigen Sie einfach auf den Standort auf der Karte und Ihre App ändert sofort die Geodata.

Zeigt Echtzeitdiagramme der Nutzung von CPU / Memory / Network / Disk / Battery an.

Erfasst einfach Screenshot vom Gerät.

Bietet Browser und Editor für SharedPreferences.

Bietet Zugriff auf den internen Anwendungsordner. Mit diesem Monitor können Sie also Dateien herunterladen, entfernen oder hochladen, Ordner erstellen und einfach durch die Ordner der App gehen.

Mit dem Monitor können Sie alle Daten senden, die Sie sehen möchten. Der SDK bietet eine einfache API, um Ihre Veranstaltungen zu senden. Hier ist ein Beispiel:
CustomEventsSender . send ( new MyCustomEvent ()) Im Beispiel implementiert die MyCustomEvent -Klasse die CustomEventPayload -Schnittstelle wie hier:
public class MyCustomEvent implements CustomEventPayload {
@ NonNull
@ Override
public String getName () {
return "Custom Event" ;
}
@ NonNull
@ Override
public String getCategory () {
return "Application" ;
}
@ NonNull
@ Override
public Map < String , Object > getPayload () {
final Map < String , Object > payload = new HashMap <>();
payload . put ( "sampleDate" , new Date ());
payload . put ( "sampleBool" , false );
payload . put ( "sampleInt" , 42 );
payload . put ( "sampleString" , "Test" );
return payload ;
}
}Der Monitor bietet die Möglichkeit, Ihren Code von AppSector Dashboard remote auszulösen. Der ausgelöste Code sollte in den Befehlscallback von AppSPector eingeschlossen und bei SDK registriert werden. Mit dem Befehl können Sie Parameter an Ihren Code übergeben und den Ergebnistyp deklarieren.
Nehmen wir an, Sie müssen den Toast mit dem angegebenen Text anzeigen und einen INT -Wert zurückgeben.
Hier ist die Erklärung Ihres Befehls, die ein Nachrichtenargument erfordert und ein ganzzahliges Ergebnis hat.
@ Command ( value = "Show message" , category = "Application" )
public class ShowToastCommand extends BaseCommand < Integer > {
@ Argument ( isRequired = true )
public String message ;
}Und hier ist die Registrierung Ihres Befehls und die Implementierung von CommandCallback.
AppSpector . shared (). commands (). register ( ShowToastCommand . class , new CommandCallback < Integer , ShowToastCommand >() {
@ Override
public void exec ( @ NonNull final ShowToastCommand command , @ NonNull final Responder < Integer > responder ) {
new Handler ( Looper . getMainLooper ()). post ( new Runnable () {
@ Override
public void run () {
Toast . makeText ( getContext (), command . message , Toast . LENGTH_SHORT ). show ();
responder . ok ( 42 );
}
});
}
}); Dieser Befehl wird in der Application angezeigt und hat den Meldennamen im Dashboard Show message . Sie können Ihre eigenen Kategorien zum Gruppieren von Befehlen auf dem Dashboard verwenden.
Befehle können erst nach dem Ausführen des SDK registriert werden.
Lassen Sie uns wissen, was Sie denken oder was Sie verbessern möchten: [email protected].
Schließen Sie sich unserem Slack an, um den Setup -Prozess und die Funktionen zu diskutieren