
Avec l'application, vous pouvez déboguer à distance votre application en cours d'exécution dans la même pièce ou sur un autre continent. Vous pouvez mesurer les performances de l'application, afficher le contenu de la base de données, les journaux, les demandes de réseau et bien d'autres en temps réel. C'est l'instrument que vous recherchiez. Ne vous limitez pas uniquement aux journaux simples. Le débogage ne doit pas être douloureux!
Chaque application que vous souhaitez utiliser avec AppSpector SDK Vous devez vous inscrire sur notre service via le Web (https://app.appspector.com) ou l'application de bureau. Après avoir ajouté l'application, accédez à Paramètres de l'application et copiez la clé de l'API.
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.+ "
}Dans le cas où vous ne souhaitez pas avoir d'applications SDK dans votre sortie APK Utilisez l'application non opposée Artefact
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" );
}
}AppSpector SDK collecte et stocke les données utilisateur, y compris les journaux, le contenu de la base de données et le trafic réseau. Tout cela peut contenir des données sensibles afin que pour protéger votre confidentialité, nous proposons un module supplémentaire avec la fonction E2EE. Il vous permet de crypter toutes les données des applications de données envoies de ou vers votre appareil et assurez-vous que vous pouvez le déchiffrer. Pour des raisons de sécurité, les séances cryptées ne sont disponibles que dans l'application de bureau.
Pour utiliser le chiffrement, vous devez sélectionner l'option Enable End-To-End encryption lors de l'enregistrement de votre application à l'aide de l'application de bureau (l'application précédemment enregistrée ne peut pas être mise à jour pour prendre en charge le chiffrement).
Après cela, vous devez ajouter le module android-sdk-encryption à votre déclaration de dépendances. Ainsi, votre build.gradle au niveau de l'application. Gradle doit contenir les lignes suivantes:
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.+ '
} Enfin, activez le cryptage en mettant la configuration du SDK enableEncryption . La Public Key du client que vous pouvez trouver sur l'écran Paramètres de l'application.
AppSpector
. build ( this )
. withDefaultMonitors ()
. enableEncryption ( "CLIENT_PUBLIC_KEY" )
. run ( "API_KEY" );Construisez votre projet et voyez tout fonctionner! Lorsque votre application est opérationnelle, vous pouvez vous rendre sur https://app.appspector.com et vous connecter à votre session d'application.
Après avoir appelé la méthode run , le SDK démarre la collecte de données et le transfert de données vers le service Web. À partir de ce moment, vous pouvez voir votre session dans le client AppSpector.
Étant donné que nous vous recommandons de conserver l'initialisation du SDK dans la méthode onCreate() de votre application, le SDK fournit des méthodes pour vous aider à contrôler l'état d'applications en appelant stopSdk() et startSdk() statiques. Vous ne pouvez utiliser ces méthodes qu'après l'initialisation des applications.
Le stop() indique à AppSpector de désactiver toute la collecte de données et de fermer la session actuelle.
AppSpector . stopSdk (); Le startSdk() recommandait à nouveau à l'aide de la configuration que vous avez fournie à l'initialisation.
AppSpector . startSdk (); Comme la nouvelle session sera créée et toutes les activités entre les appels stop() et start() ne seront pas suivies.
Pour vérifier l'état AppSpector, vous pouvez utiliser la méthode isStarted() .
AppSpector . shared (). isStarted (); Vous pouvez attribuer un nom personnalisé à votre appareil pour trouver facilement les sessions nécessaires dans la liste des sessions. Pour ce faire, vous devez ajouter le nom souhaité comme valeur pour AppSpector.METADATA_KEY_DEVICE_NAME clé au dictionnaire metadata :
AppSpector
. build ( this )
. withDefaultMonitors ()
. addMetadata ( AppSpector . METADATA_KEY_DEVICE_NAME , "YOUR_DEVICE_NAME" )
. run ( "YOUR_API_KEY" );De plus, le SDK permet de gérer le nom de l'appareil pendant la durée de vie de l'application en utilisant
La méthode setMetadataValue pour modifier le nom du périphérique
AppSpector . shared (). setMetadataValue ( AppSpector . METADATA_KEY_DEVICE_NAME , "NEW_DEVICE_NAME" ); ou le removeMetadataValue pour supprimer le nom de votre appareil personnalisé
AppSpector . shared (). removeMetadataValue ( AppSpector . METADATA_KEY_DEVICE_NAME ); Pour la navigation et l'exécution des requêtes SQL dans la base de données SQLCIPHER, vous devez effectuer quelques étapes supplémentaires. Tout d'abord, ajoutez le module sqlcipher-extension à votre fichier app/build.gradle sous le module SDK principal. Donc, ça ressemblera à ça:
dependencies {
implementation ' com.appspector:android-sdk:1.+ '
implementation ' com.appspector:sqlcipher-extension:1.+ '
} Après cela, créez DatabaseConnectionFactory et passez-le comme un argument de la méthode addSQLMonitor .
Imaginons que votre projet contient la base de données SQLCIPHER avec le nom "my_encrypted_db" et autres sqlite:
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" );Parfois, vous voudrez peut-être ajuster ou ignorer complètement certains éléments d'application de données Rassembler.
Pour ce but, le moniteur HTTP fournit l'interface HTTPFilter qui peut être transféré sur la méthode addHttpMonitor(HTTPFilter) .
Disons que nous voulons sauter notre jeton Auth auprès des en-têtes de demandes. Voici un échantillon de ce filtre:
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 ;
}
} Le moniteur SharedPreferences permet de spécifier des fichiers que vous souhaitez observer en utilisant SharedPreferencesSourceFactory .
SharedPreferencesSourceFactory.all() . Par défaut, le moniteur utilise cette valeur.SharedPreferencesSourceFactory.excludeFiles("preferences_name") , où "Préférences_name" est un nom de fichier ignoré. Vous pouvez passer autant de noms de fichiers que vous le souhaitez.SharedPreferencesSourceFactory.only("preferences_name") , où "Préférences_name" est un nom de fichier pour l'observation. Cette méthode reçoit également autant d'arguments que vous le souhaitez. En additin, le moniteur permet de fournir SharedPreferencesMonitor.Filter pour supprimer ou modifier certaines valeurs avant d'envoyer des données sur le client.
Disons que vous souhaitez supprimer key_1 et modifier les préférences key_2 dans le fichier preferences_name . Donc, votre filtre ressemblera à ça:
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 ;
}
} Pour l'application de ces personnalisations, vous devez utiliser l'une de ces méthodes: addSharedPreferenceMonitor(SharedPreferencesMonitor.Filter) , addSharedPreferenceMonitor(SharedPreferencesSourceFactory) , addSharedPreferenceMonitor(SharedPreferencesSourceFactory, SharedPreferencesMonitor.Filter) .
Pour filtrer les journaux, vous devez implémenter LogMonitor.Filter et le transmettre à la méthode addLogMonitor(LogMonitor.Filter) .
Voyons un exemple où nous voulons modifier un niveau de journal pour avertir tous les messages avec un jeton de mots:
public class LogFilter implements LogMonitor . Filter {
@ Nullable
@ Override
public LogEvent filter ( LogEvent event ) {
if ( event . message . contains ( "token" )) {
event . level = LogLevel . WARN ;
}
return request ;
}
}Fournissons les filtes créées aux moniteurs:
AppSpector
. build ( this )
. withDefaultMonitors ()
. addHttpMonitor ( new TokenFilter ())
. addSharedPreferenceMonitor ( new SimpleSharedPreferencesFilter ())
. addLogMonitor ( new LogFilter ())
. run ( "YOUR_API_KEY" );Parfois, vous devrez peut-être obtenir une URL pointant vers la session actuelle à partir du code. Supposons que vous souhaitiez un lien sur votre journaliste de crash, écrivez-le dans les journaux ou affichez dans votre interface utilisateur de débogage. Pour obtenir cette URL, vous devez ajouter un rappel de démarrage de session:
AppSpector . shared (). setSessionUrlListener ( new SessionUrlListener () {
@ Override
public void onReceived ( @ NonNull String sessionUrl ) {
// Save url for future use...
}
});Par défaut, AppSpector SDK est actif jusqu'à ce que l'application soit tuée par Android OS, même si aucune activité ne reste. Cela peut conduire à une collecte de données inutile et à des sessions longues pour les applications inactives. Nous fournissons une API pour désactiver la collecte de données pour un cas où l'application n'a pas d'activités démarrées.
AppSpector
. build ( this )
. collectDataInBackground ( false ) // Set this flag to disable data collection if no activities left
. withDefaultMonitors ()
. run ( "YOUR_API_KEY" ); Si vous ne souhaitez pas utiliser le plugin AppSpector Gradle, vous pouvez utiliser un autre moyen d'intercepter les demandes et les réponses HTTP. Vous pouvez ajouter manuellement AppSpectorOkHttp3Interceptor à votre okhttpclient (ou AppSpectorOkHttp2Interceptor pour l'ancienne version d'OKHTTPCLIENT). N'oubliez pas non plus de supprimer le plugin AppSpector de votre fichier app/build.gradle si le plugin est ajouté.
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 () Au moment actuel, le SDK fournit une API pour la configuration manuelle dans votre base de code. Pour l'utiliser dans le projet, tout d'abord, vous devez ajouter la dépendance Gradle urlconnection-extension :
dependencies {
implementation ' com.appspector:android-sdk:1.+ '
implementation ' com.appspector:urlconnection-extension:1.+ '
} Après cela, remplacez les appels url.openConnection() par UrlInstrument.openConnection(url) . Disons que nous avons la méthode pour obtenir la page Google et que nous voulons suivre cette demande:
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 ();
}
}
}Après l'intégration du SDK, il ressemblera à celui-ci:
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 ();
}
}
} Et c'est tout! Remarque: l'appel de la méthode disconnect est important pour nous. C'est un marqueur que la demande a été terminée.
Si le bois a été intégré à votre projet, vous pouvez facilement l'utiliser avec AppSpector:
Timber . plant ( new Timber . DebugTree () {
@ Override
void log ( int priority , String tag , @ NotNull String message , Throwable t ) {
Logger . log ( priority , tag , message , t )
}
})AppSpector fournit de nombreux moniteurs qui suit différentes activités à l'intérieur de votre application:
Fournit un navigateur pour les bases de données SQLite trouvées dans votre application. Permet de suivre toutes les requêtes, affiche le schéma de base de données et les données en DB. Vous pouvez émettre une requête SQL personnalisée sur n'importe quelle base de données et voir immédiatement les résultats dans le navigateur.

Affiche tout le trafic HTTP dans votre application. Vous pouvez examiner n'importe quelle demande, voir les en-têtes de demande / réponse et le corps. Nous fournissons XML et JSON Highliting pour la demande / les réponses avec des options de formatage et de pliage, donc même les réponses énormes sont faciles à parcourir.

Affiche tous les journaux générés par votre application.

Apprespector Logger vous permet de collecter le message du journal uniquement dans le service AppSpector. Il est utile lorsque vous enregistrez des données internes que la sorcière peut être divulguée via LOGCAT. AppSpector Logger a la même API avec android.util.Log Class.
Logger . d ( "MyTAG" , "It won't be printed to the Logcat" );La plupart des applications sont conscientes de l'emplacement. Le tester nécessite de changer les emplacements vous-même. Dans ce cas, la moquerie de l'emplacement est un épargnant en temps réel. Pointez simplement vers l'emplacement sur la carte et votre application changera immédiatement ses géodata.

Affiche des graphiques en temps réel de l'utilisation du CPU / mémoire / réseau / disque / batterie.

Capture simplement la capture d'écran de l'appareil.

Fournit un navigateur et un éditeur pour les reprises partagées.

Donne accès au dossier interne de l'application. Ainsi, en utilisant ce moniteur, vous pouvez télécharger, supprimer ou télécharger des fichiers, créer des dossiers et simplement parcourir les dossiers de l'application.

Le moniteur vous permet d'envoyer toutes les données que vous souhaitez voir. Le SDK fournit une API simple pour envoyer vos événements. Voici un exemple:
CustomEventsSender . send ( new MyCustomEvent ()) Dans l'exemple, la classe MyCustomEvent implémente l'interface CustomEventPayload comme ici:
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 ;
}
}Le moniteur offre la possibilité de déclencher votre code à distance à partir du tableau de bord AppSpector. Le code déclenché doit être enveloppé dans CommandCallback d'AppSpector et enregistré sur SDK. La commande vous permet de transmettre des paramètres à votre code et de déclarer le type de résultat.
Disons que vous devez afficher le toast avec le texte spécifié et renvoyer une valeur int.
Voici la déclaration de votre commande qui nécessite un argument de message et a un résultat entier.
@ Command ( value = "Show message" , category = "Application" )
public class ShowToastCommand extends BaseCommand < Integer > {
@ Argument ( isRequired = true )
public String message ;
}Et voici l'enregistrement de votre commande et l'implémentation de 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 );
}
});
}
}); Cette commande apparaîtra dans la catégorie Application et aura le nom Show message sur le tableau de bord. Vous pouvez utiliser vos propres catégories pour regrouper les commandes sur le tableau de bord.
Les commandes ne peuvent être enregistrées qu'après l'exécution du SDK.
Faites-nous savoir ce que vous pensez ou que voudriez-vous être amélioré: [email protected].
Rejoignez notre Slack pour discuter du processus de configuration et des fonctionnalités