
Com o aplicativo, você pode depurar remotamente seu aplicativo em execução na mesma sala ou em outro continente. Você pode medir o desempenho do aplicativo, visualizar conteúdo do banco de dados, logs, solicitações de rede e muito mais em tempo real. Este é o instrumento que você está procurando. Não se limite apenas a logs simples. A depuração não precisa ser dolorosa!
Cada aplicativo que você deseja usar com o Appspect SDK, você deve se registrar em nosso serviço na Web (https://app.appspector.com) ou no aplicativo de desktop. Depois de adicionar o aplicativo, navegue para as configurações do aplicativo e copie a tecla 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.+ "
}Caso quando você não quiser ter o aplicativo SDK em seu APK de liberação APPSPEPOR NO-OP ARTIFACT
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" );
}
}O aplicativo SDK coleta e armazena dados de usuário, incluindo logs, conteúdo do banco de dados e tráfego de rede. Tudo isso pode conter dados confidenciais, para proteger sua privacidade, oferecemos um módulo adicional com o recurso E2EE. Ele permite criptografar todos os envios de aplicativos de dados de ou para o seu dispositivo e certifique -se de apenas descriptografá -lo. Por motivos de segurança, as sessões criptografadas estão disponíveis apenas no aplicativo de desktop.
Para usar a criptografia, você deve selecionar a opção Enable End-To-End encryption durante o registro do seu aplicativo usando o aplicativo de desktop (o aplicativo registrado anteriormente não pode ser atualizado para suportar a criptografia).
Depois disso, você precisa adicionar o módulo android-sdk-encryption à sua declaração de dependências. Portanto, o seu build.gradle no nível do aplicativo deve conter as próximas linhas:
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, ative a criptografia colocando a enableEncryption na configuração do SDK. A Public Key do cliente que você pode encontrar na tela Configurações do aplicativo.
AppSpector
. build ( this )
. withDefaultMonitors ()
. enableEncryption ( "CLIENT_PUBLIC_KEY" )
. run ( "API_KEY" );Crie seu projeto e veja tudo funcionando! Quando seu aplicativo estiver em funcionamento, você pode acessar https://app.appspector.com e conectar -se à sua sessão de aplicativos.
Depois de chamar o método run o SDK inicia a coleta de dados e a transferência de dados para o serviço da web. A partir desse ponto, você pode ver sua sessão no cliente do aplicativo.
Como recomendamos manter a inicialização do SDK no método onCreate() do seu aplicativo, o SDK fornece métodos para ajudá -lo a controlar os métodos estáticos do aplicativo chamando stopSdk() e startSdk() . Você pode usar esses métodos somente após a inicialização do aplicativo.
O stop() diz ao aplicativo para desativar toda a coleta de dados e fechar a sessão atual.
AppSpector . stopSdk (); O startSdk() inicia novamente usando a configuração que você forneceu na inicialização.
AppSpector . startSdk (); Como o resultado, a nova sessão será criada e todas as atividades entre as chamadas stop() e start() não serão rastreadas.
Para verificar o estado do aplicativo, você pode usar o método isStarted() .
AppSpector . shared (). isStarted (); Você pode atribuir um nome personalizado ao seu dispositivo para encontrar facilmente as sessões necessárias na lista de sessões. Para fazer isso, você deve adicionar o nome desejado como um valor para AppSpector.METADATA_KEY_DEVICE_NAME Chave para o dicionário metadata :
AppSpector
. build ( this )
. withDefaultMonitors ()
. addMetadata ( AppSpector . METADATA_KEY_DEVICE_NAME , "YOUR_DEVICE_NAME" )
. run ( "YOUR_API_KEY" );Além disso, o SDK permite gerenciar o nome do dispositivo durante a vida útil do aplicativo usando
O método setMetadataValue para alterar o nome do dispositivo
AppSpector . shared (). setMetadataValue ( AppSpector . METADATA_KEY_DEVICE_NAME , "NEW_DEVICE_NAME" ); ou o removeMetadataValue para remover o nome do seu dispositivo personalizado
AppSpector . shared (). removeMetadataValue ( AppSpector . METADATA_KEY_DEVICE_NAME ); Para navegar e executar consultas SQL no banco de dados SQLCipher, você precisa executar algumas etapas adicionais. Primeiro de tudo, adicione o módulo sqlcipher-extension ao seu arquivo app/build.gradle no módulo SDK principal. Então, vai ficar assim:
dependencies {
implementation ' com.appspector:android-sdk:1.+ '
implementation ' com.appspector:sqlcipher-extension:1.+ '
} Depois disso, crie o DatabaseConnectionFactory e passe -o como um argumento do método addSQLMonitor .
Vamos imaginar que seu projeto contém um banco de dados SQLCIPHER com o nome "my_encrypted_db" e outros 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" );Às vezes, você pode querer ajustar ou pular completamente algumas peças de dados de dados de dados.
Para esse objetivo, o monitor HTTP fornece a interface HTTPFilter que pode ser passada para o método addHttpMonitor(HTTPFilter) .
Digamos que queremos pular nosso token de autenticação dos cabeçalhos de solicitações. Aqui está uma amostra deste 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 ;
}
} O monitor SharedPreferences permite especificar arquivos que você deseja observar usando SharedPreferencesSourceFactory .
SharedPreferencesSourceFactory.all() . Por padrão, o monitor usa esse valor.SharedPreferencesSourceFactory.excludeFiles("preferences_name") , onde "Preferências_name" é um nome do arquivo ignorado. Você pode passar quantos nomes de arquivos quiser.SharedPreferencesSourceFactory.only("preferences_name") , onde "Preferências_name" é um nome do arquivo para observar. Este método também recebe tantos argumentos quanto você quiser. Além disso, o monitor permite fornecer SharedPreferencesMonitor.Filter para remover ou modificar alguns valores antes de enviar dados no cliente.
Digamos que você queira remover key_1 e modificar as preferências key_2 nas preferences_name do arquivo_name. Então, seu filtro ficará assim:
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 essas personalizações, você precisa usar um desses métodos: addSharedPreferenceMonitor(SharedPreferencesMonitor.Filter) , addSharedPreferenceMonitor(SharedPreferencesSourceFactory) , addSharedPreferenceMonitor(SharedPreferencesSourceFactory, SharedPreferencesMonitor.Filter) .
Para filtrar os logs, você precisa implementar LogMonitor.Filter e passá -lo para o método addLogMonitor(LogMonitor.Filter) .
Vamos considerar um exemplo em que queremos alterar um nível de log para alertar para todas as mensagens com token de palavras:
public class LogFilter implements LogMonitor . Filter {
@ Nullable
@ Override
public LogEvent filter ( LogEvent event ) {
if ( event . message . contains ( "token" )) {
event . level = LogLevel . WARN ;
}
return request ;
}
}Vamos fornecer os filtes criados aos monitores:
AppSpector
. build ( this )
. withDefaultMonitors ()
. addHttpMonitor ( new TokenFilter ())
. addSharedPreferenceMonitor ( new SimpleSharedPreferencesFilter ())
. addLogMonitor ( new LogFilter ())
. run ( "YOUR_API_KEY" );Às vezes, pode ser necessário que o URL aponte para a sessão atual do código. Digamos que você queira o link Crash em seu repórter do Crash, escreva -o em logs ou exiba sua interface do usuário de depuração. Para obter este URL, você deve adicionar um retorno de chamada para iniciar uma sessão:
AppSpector . shared (). setSessionUrlListener ( new SessionUrlListener () {
@ Override
public void onReceived ( @ NonNull String sessionUrl ) {
// Save url for future use...
}
});Por padrão, o aplicativo SDK está ativo até que o aplicativo seja morto pelo sistema operacional Android, mesmo que não haja mais atividades. Pode levar a coleta de dados desnecessária e sessões longas para aplicativos inativos. Fornecemos API para desativar a coleta de dados para um caso quando o aplicativo não tiver atividades iniciadas.
AppSpector
. build ( this )
. collectDataInBackground ( false ) // Set this flag to disable data collection if no activities left
. withDefaultMonitors ()
. run ( "YOUR_API_KEY" ); Se você não deseja usar o plug -in Gradle Appspectle, pode usar uma maneira alternativa de interceptar solicitações e respostas HTTP. Você pode adicionar manualmente AppSpectorOkHttp3Interceptor ao seu OkhttpClient (ou AppSpectorOkHttp2Interceptor para a versão antiga do OKHTTPCLIENT). Além disso, não se esqueça de remover o plug -in do aplicativo do seu arquivo app/build.gradle se o plug -in for adicionado.
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 () No momento atual, o SDK fornece API para configuração manual na sua base de código. Para usá-lo no projeto, em primeiro lugar, você precisa adicionar a dependência gradle de urlconnection-extension :
dependencies {
implementation ' com.appspector:android-sdk:1.+ '
implementation ' com.appspector:urlconnection-extension:1.+ '
} Depois disso, substitua as chamadas url.openConnection() com UrlInstrument.openConnection(url) . Digamos que temos o método para obter a página do Google e queremos rastrear esta solicitação:
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 ();
}
}
}Após a integração do SDK, será parecido com este:
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 ();
}
}
} E é isso! Nota: Chamar o método disconnect é importante para nós. É um marcador que a solicitação foi concluída.
Se a madeira foi integrada ao seu projeto, você pode usá -lo facilmente com o Appspect:
Timber . plant ( new Timber . DebugTree () {
@ Override
void log ( int priority , String tag , @ NotNull String message , Throwable t ) {
Logger . log ( priority , tag , message , t )
}
})O Appspectores fornece muitos monitores que rastreiam diferentes atividades dentro do seu aplicativo:
Fornece navegador para bancos de dados SQLite encontrados em seu aplicativo. Permite rastrear todas as consultas, mostra o esquema de DB e os dados no banco de dados. Você pode emitir uma consulta SQL personalizada em qualquer banco de dados e ver resultados no navegador imediatamente.

Mostra todo o tráfego HTTP em seu aplicativo. Você pode examinar qualquer solicitação, consulte Cabeçalhos de solicitação/resposta e corpo. Fornecemos o XML e o JSON Highliting para solicitação/respostas com opções de formatação e dobra, para que até respostas enormes sejam fáceis de observar.

Exibe todos os logs gerados pelo seu aplicativo.

O Appspect Logger permite coletar uma mensagem de log apenas no serviço de aplicativos. É útil quando você registra alguns dados internos da bruxa pode ser vazada via logcat. O AppsPetor Logger possui a mesma API com a classe android.util.Log .
Logger . d ( "MyTAG" , "It won't be printed to the Logcat" );A maioria dos aplicativos tem reconhecimento de localização. Testá -lo requer alteração de locais você mesmo. Nesse caso, a localização zomba é um economizador em tempo real. Basta apontar para o local no mapa e seu aplicativo mudará suas geodatas imediatamente.

Exibe os gráficos em tempo real da CPU / Memory / Network / Disk / Battery Uso.

Simplesmente captura a captura de tela do dispositivo.

Fornece navegador e editor para SharedPreferences.

Fornece acesso à pasta interna do aplicativo. Portanto, usando este monitor, você pode baixar, remover ou fazer upload de arquivos, criar pastas e apenas percorrer as pastas do aplicativo.

O monitor permite que você envie todos os dados que deseja ver. O SDK fornece uma API simples para enviar seus eventos. Aqui está um exemplo:
CustomEventsSender . send ( new MyCustomEvent ()) No exemplo, a classe MyCustomEvent implementa a interface CustomEventPayload como aqui:
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 ;
}
}O monitor oferece uma oportunidade para acionar seu código remotamente do painel do Appspect. O código acionado deve ser envolvido no comando do Appspect's CommandCallback e registrado no SDK. O comando permite que você passe os parâmetros para o seu código e declare o tipo de resultado.
Digamos que você precise mostrar a torrada com o texto especificado e retornar um valor int.
Aqui está a declaração do seu comando que requer um argumento de mensagem e tem um resultado inteiro.
@ Command ( value = "Show message" , category = "Application" )
public class ShowToastCommand extends BaseCommand < Integer > {
@ Argument ( isRequired = true )
public String message ;
}E aqui está o registro do seu comando e a implementação do 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á na categoria Application e Show message no painel. Você pode usar suas próprias categorias para agrupar comandos no painel.
Os comandos podem ser registrados apenas após a execução do SDK.
Deixe -nos saber o que você acha ou o que gostaria de melhorar: [email protected].
Junte -se à nossa folga para discutir o processo de configuração e os recursos