
Con AppSpector puede depurar de forma remota su aplicación en la misma habitación o en otro continente. Puede medir el rendimiento de la aplicación, ver el contenido de la base de datos, los registros, las solicitudes de red y muchos más en tiempo real. Este es el instrumento que has estado buscando. No se limite solo a registros simples. ¡La depuración no tiene que ser dolorosa!
Cada aplicación que desea utilizar con AppSpector SDK debe registrarse en nuestro servicio a través de la web (https://app.appspector.com) o la aplicación de escritorio. Después de agregar la aplicación, navegue a la configuración de la aplicación y copie la clave 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.+ "
}En caso de que no desee tener el SDK de AppSpector en su versión APK, use el artefacto de appSpector no-op
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 recopila y almacena datos de usuarios, incluidos registros, contenido de la base de datos y tráfico de red. Todo esto puede contener datos confidenciales, por lo que para proteger su privacidad ofrecemos un módulo adicional con la función E2EE. Le permite cifrar todos los datos de datos envían desde o hacia su dispositivo y asegurarse de que solo pueda descifrarlo. Debido a razones de seguridad, las sesiones cifradas solo están disponibles en la aplicación de escritorio.
Para usar el cifrado, debe seleccionar la opción Enable End-To-End encryption durante el registro de su aplicación utilizando la aplicación de escritorio (la aplicación registrada previamente no se puede actualizar para admitir el cifrado).
Después de eso, debe agregar el módulo android-sdk-encryption a su declaración de dependencias. Por lo tanto, su build.gradle a nivel de aplicación. La gradle debe contener las siguientes líneas:
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.+ '
} Finalmente, habilite el cifrado colocando la configuración enableEncryption de SDK. La Public Key del cliente que puede encontrar en la pantalla Configuración de la aplicación.
AppSpector
. build ( this )
. withDefaultMonitors ()
. enableEncryption ( "CLIENT_PUBLIC_KEY" )
. run ( "API_KEY" );¡Construya su proyecto y vea que todo funcione! Cuando su aplicación está en funcionamiento, puede ir a https://app.appspector.com y conectarse a su sesión de aplicación.
Después de llamar al método run el SDK inicia la recopilación de datos y la transferencia de datos al servicio web. Desde ese momento puede ver su sesión en el cliente AppSpector.
Dado que recomendamos mantener la inicialización de SDK en el método onCreate() de su aplicación, el SDK proporciona métodos para ayudarlo a controlar el estado de AppSpector llamando a los métodos estáticos stopSdk() e startSdk() . Puede usar estos métodos solo después de que AppSpector se inicialice.
El stop() le dice a AppSpector que deshabilite toda la recopilación de datos y cierre la sesión actual.
AppSpector . stopSdk (); startSdk() lo inicia nuevamente usando la configuración que proporcionó en la inicialización.
AppSpector . startSdk (); Como resultado, se creará una nueva sesión y no se rastreará toda la actividad entre las llamadas stop() e start() .
Para verificar el estado de AppSpector, puede usar el método isStarted() .
AppSpector . shared (). isStarted (); Puede asignar un nombre personalizado a su dispositivo para encontrar fácilmente las sesiones necesarias en la lista de sesiones. Para hacer esto, debe agregar el nombre deseado como valor para AppSpector.METADATA_KEY_DEVICE_NAME Key al diccionario metadata :
AppSpector
. build ( this )
. withDefaultMonitors ()
. addMetadata ( AppSpector . METADATA_KEY_DEVICE_NAME , "YOUR_DEVICE_NAME" )
. run ( "YOUR_API_KEY" );Además, el SDK permite administrar el nombre del dispositivo durante la vida útil de la aplicación utilizando
el método setMetadataValue para cambiar el nombre del dispositivo
AppSpector . shared (). setMetadataValue ( AppSpector . METADATA_KEY_DEVICE_NAME , "NEW_DEVICE_NAME" ); o el removeMetadataValue para eliminar el nombre de su dispositivo personalizado
AppSpector . shared (). removeMetadataValue ( AppSpector . METADATA_KEY_DEVICE_NAME ); Para navegar y ejecutar consultas SQL en la base de datos SQLCIPHER, debe realizar un par de pasos adicionales. En primer lugar, agregue el módulo sqlcipher-extension a su archivo app/build.gradle en el módulo SDK principal. Entonces, se verá así:
dependencies {
implementation ' com.appspector:android-sdk:1.+ '
implementation ' com.appspector:sqlcipher-extension:1.+ '
} Después de eso, cree DatabaseConnectionFactory y paselo como un argumento del método addSQLMonitor .
Imaginemos que su proyecto contiene la base de datos SQLCIPHER con el nombre "My_Encrypted_DB" y otros 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" );A veces, es posible que desee ajustar o omitir por completo algunos datos de datos AppSpector.
Para este objetivo, el monitor HTTP proporciona la interfaz HTTPFilter que puede pasar al método addHttpMonitor(HTTPFilter) .
Digamos que queremos omitir nuestra token de autenticación de los encabezados de solicitudes. Aquí hay una muestra de este filtro:
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 ;
}
} El monitor SharedPreferences permite especificar archivos que desea observar utilizando SharedPreferencesSourceFactory .
SharedPreferencesSourceFactory.all() . Por defecto, el monitor usa este valor.SharedPreferencesSourceFactory.excludeFiles("preferences_name") , donde "Preferences_Name" es un nombre de archivo ignorado. Puede pasar tantos nombres de archivo como desee.SharedPreferencesSourceFactory.only("preferences_name") , donde "Preferences_Name" es un nombre de archivo para observar. Este método también recibe tantos argumentos como desee. Además, el monitor permite proporcionar SharedPreferencesMonitor.Filter para eliminar o modificar algunos valores antes de enviar datos al cliente.
Supongamos que desea eliminar key_1 y modificar las preferencias key_2 en el archivo preferences_name . Entonces, su filtro se verá así:
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 ;
}
} Para aplicar estas personalizaciones, debe utilizar uno de estos métodos: addSharedPreferenceMonitor(SharedPreferencesMonitor.Filter) , addSharedPreferenceMonitor(SharedPreferencesSourceFactory) , addSharedPreferenceMonitor(SharedPreferencesSourceFactory, SharedPreferencesMonitor.Filter) .
Para filtrar los registros, debe implementar LogMonitor.Filter y pasarlo al método addLogMonitor(LogMonitor.Filter) .
Consideremos un ejemplo en el que queremos cambiar un nivel de registro para advertir para todos los mensajes con token de palabras:
public class LogFilter implements LogMonitor . Filter {
@ Nullable
@ Override
public LogEvent filter ( LogEvent event ) {
if ( event . message . contains ( "token" )) {
event . level = LogLevel . WARN ;
}
return request ;
}
}Proporcionemos los filtos creados a los monitores:
AppSpector
. build ( this )
. withDefaultMonitors ()
. addHttpMonitor ( new TokenFilter ())
. addSharedPreferenceMonitor ( new SimpleSharedPreferencesFilter ())
. addLogMonitor ( new LogFilter ())
. run ( "YOUR_API_KEY" );A veces es posible que deba obtener la URL apuntando a la sesión actual desde el código. Digamos que desea un bloqueo de enlace en su reportero de bloqueo con él, escríbelo en registros o muestre en su interfaz de usuario de depuración. Para obtener esta URL, debe agregar una devolución de llamada de inicio de sesión:
AppSpector . shared (). setSessionUrlListener ( new SessionUrlListener () {
@ Override
public void onReceived ( @ NonNull String sessionUrl ) {
// Save url for future use...
}
});De manera predeterminada, AppSpector SDK está activo hasta que la aplicación sea matada por Android OS, incluso si no quedan actividades. Puede conducir a una recopilación de datos innecesaria y sesiones largas para aplicaciones inactivas. Proporcionamos API para deshabilitar la recopilación de datos para un caso en el que la aplicación no tiene actividades iniciales.
AppSpector
. build ( this )
. collectDataInBackground ( false ) // Set this flag to disable data collection if no activities left
. withDefaultMonitors ()
. run ( "YOUR_API_KEY" ); Si no desea utilizar el complemento de Gradle AppSpector, puede usar una forma alternativa de interceptar solicitudes y respuestas HTTP. Puede agregar manualmente AppSpectorOkHttp3Interceptor a su OkhttpClient (o AppSpectorOkHttp2Interceptor para la versión anterior de OKHTTPClient). Además, no olvide eliminar el complemento AppSpector de su archivo app/build.gradle si se agrega el complemento.
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 () En el momento actual, el SDK proporciona API para la configuración manual en su base de código. Para usarlo en el proyecto, en primer lugar, debe agregar la dependencia de la gradle urlconnection-extension :
dependencies {
implementation ' com.appspector:android-sdk:1.+ '
implementation ' com.appspector:urlconnection-extension:1.+ '
} Después de eso, reemplace las llamadas url.openConnection() con UrlInstrument.openConnection(url) . Digamos que tenemos el método para obtener la página de Google y queremos rastrear esta solicitud:
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 ();
}
}
}Después de la integración del SDK, se verá así:
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 ();
}
}
} ¡Y eso es todo! Nota: Llamar al método disconnect es importante para nosotros. Es un marcador que la solicitud se completó.
Si Timber se ha integrado en su proyecto, puede usarlo fácilmente con 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 proporciona muchos monitores que rastrean diferentes actividades dentro de su aplicación:
Proporciona el navegador para bases de datos SQLite que se encuentran en su aplicación. Permite rastrear todas las consultas, muestra el esquema de DB y los datos en DB. Puede emitir una consulta SQL personalizada en cualquier DB y ver los resultados en el navegador de inmediato.

Muestra todo el tráfico HTTP en su aplicación. Puede examinar cualquier solicitud, consulte los encabezados y el cuerpo de solicitud/respuesta. Proporcionamos la creciente XML y JSON para solicitudes/respuestas con opciones de formato y plegamiento, por lo que incluso las grandes respuestas son fáciles de mirar.

Muestra todos los registros generados por su aplicación.

AppSpector Logger le permite recopilar el mensaje de registro solo en el servicio AppSpector. Es útil cuando registra algunos datos internos que Witch se puede filtrar a través de LogCat. AppSpector Logger tiene la misma API con la clase android.util.Log .
Logger . d ( "MyTAG" , "It won't be printed to the Logcat" );La mayoría de las aplicaciones son conscientes de la ubicación. Probarlo requiere cambiar las ubicaciones usted mismo. En este caso, la burla de la ubicación es un ahorrador en tiempo real. Simplemente apunte a la ubicación del mapa y su aplicación cambiará su geodata de inmediato.

Muestra gráficos en tiempo real de la CPU / memoria / red / disco / uso de la batería.

Simplemente captura la captura de pantalla del dispositivo.

Proporciona el navegador y el editor para SharedPreferencias.

Proporciona acceso a la carpeta interna de la aplicación. Entonces, con este monitor que puede descargar, eliminar o cargar archivos, crear carpetas y simplemente caminar por las carpetas de la aplicación.

El monitor le permite enviar cualquier datos que desee ver. El SDK proporciona una API simple para enviar sus eventos. Aquí hay un ejemplo:
CustomEventsSender . send ( new MyCustomEvent ()) En el ejemplo, la clase MyCustomEvent implementa la interfaz CustomEventPayload como aquí:
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 ;
}
}El monitor brinda la oportunidad de activar su código de forma remota desde el tablero AppSpector. El código activado debe envolverse en CommandCallback de AppSpector y registrarse en SDK. El comando le permite pasar parámetros a su código y declarar el tipo de resultado.
Supongamos que necesita mostrar la tostada con el texto especificado y devolver un valor int.
Aquí está la declaración de su comando que requiere un argumento de mensaje y tiene un resultado entero.
@ Command ( value = "Show message" , category = "Application" )
public class ShowToastCommand extends BaseCommand < Integer > {
@ Argument ( isRequired = true )
public String message ;
}Y aquí está el registro de su comando y la implementación 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 );
}
});
}
}); Este comando aparecerá en la categoría Application y tendrá el nombre Show message en el tablero. Puede usar sus propias categorías para agrupar comandos en el tablero.
Los comandos solo se pueden registrar después de ejecutar el SDK.
Háganos saber qué piensa o qué le gustaría mejorarse: [email protected].
Únase a nuestra holgura para discutir el proceso de configuración y las características