
С Appspector вы можете удаленно отлаживать ваше приложение, работающее в одной комнате или на другом континенте. Вы можете измерить производительность приложения, просмотр контента базы данных, журналов, сетевых запросов и многих других в реальном времени. Это инструмент, который вы искали. Не ограничивайте себя только простыми журналами. Отладка не должна быть болезненной!
Каждое приложение, которое вы хотите использовать с Appceppector SDK, вы должны зарегистрироваться в нашей службе через Интернет (https://appspector.com) или настольное приложение. После добавления приложения перейдите в настройки приложения и скопируйте клавишу 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.+ "
}В случае, если вы не хотите иметь Appceppepepor SDK в вашем релизе APK Используйте Appcepepepor 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" );
}
}Appseppeper SDK собирает и хранит пользовательские данные, включая журналы, контент базы данных и сетевой трафик. Все это может содержать конфиденциальные данные, поэтому для защиты вашей конфиденциальности мы предлагаем дополнительный модуль с функцией E2EE. Это позволяет зашифровать все данные Data Appcepeper, отправляя с или на ваше устройство, и убедитесь, что только вы можете расшифровать его. Из -за соображений безопасности зашифрованные сеансы доступны только в настольном приложении.
Чтобы использовать шифрование, необходимо выбрать опцию Enable End-To-End encryption во время регистрации вашего приложения с помощью приложения для настольного компьютера (ранее зарегистрированное приложение не может быть обновлено для поддержки шифрования).
После этого вам необходимо добавить модуль android-sdk-encryption в ваше объявление зависимостей. Таким образом, ваш build.gradle на уровне приложения. Gradle должна содержать следующие строки:
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.+ '
} Наконец, включите шифрование, поместив enableEncryption в конфигурацию SDK. Клиентский Public Key вы можете найти на экране «Настройки приложения».
AppSpector
. build ( this )
. withDefaultMonitors ()
. enableEncryption ( "CLIENT_PUBLIC_KEY" )
. run ( "API_KEY" );Создайте свой проект и увидите, что все работает! Когда ваше приложение будет запущено и запускается, вы можете перейти на https://app.appspector.com и подключиться к сеансу приложения.
После вызова метода run SDK запускает сбор данных и передачу данных в веб -службу. С этого момента вы можете увидеть свой сеанс в клиенте AppSeppector.
Поскольку мы рекомендуем сохранить инициализацию SDK в методе onCreate() вашего приложения, SDK предоставляет методы, которые помогут вам контролировать состояние AppSepepor, позвонив stopSdk() и startSdk() статические методы. Вы можете использовать эти методы только после того, как Appcepepor был инициализирован.
stop() сообщает AppSepepor отключить все сбор данных и закрыть текущий сеанс.
AppSpector . stopSdk (); startSdk() запускает его снова, используя конфигурацию, которую вы предоставили при инициализации.
AppSpector . startSdk (); В результате будет создан новый сеанс, и все действия между stop() и start() вызовы не будут отслеживаться.
Чтобы проверить состояние AppSpector, вы можете использовать метод isStarted() .
AppSpector . shared (). isStarted (); Вы можете назначить пользовательское имя своему устройству, чтобы легко найти необходимые сеансы в списке сессий. Для этого вы должны добавить желаемое имя в качестве значения для AppSpector.METADATA_KEY_DEVICE_NAME Ключ к словарь metadata :
AppSpector
. build ( this )
. withDefaultMonitors ()
. addMetadata ( AppSpector . METADATA_KEY_DEVICE_NAME , "YOUR_DEVICE_NAME" )
. run ( "YOUR_API_KEY" );Кроме того, SDK позволяет управлять именем устройства во время срока службы приложения, используя
Метод setMetadataValue для изменения имени устройства
AppSpector . shared (). setMetadataValue ( AppSpector . METADATA_KEY_DEVICE_NAME , "NEW_DEVICE_NAME" ); или removeMetadataValue для удаления пользовательского имени устройства
AppSpector . shared (). removeMetadataValue ( AppSpector . METADATA_KEY_DEVICE_NAME ); Для просмотра и запуска запросов SQL в базе данных SQLCIPHER вам необходимо выполнить несколько дополнительных шагов. Прежде всего, добавьте модуль sqlcipher-extension в ваш файл app/build.gradle в основном модуле SDK. Итак, это будет выглядеть так:
dependencies {
implementation ' com.appspector:android-sdk:1.+ '
implementation ' com.appspector:sqlcipher-extension:1.+ '
} После этого создайте DatabaseConnectionFactory и передайте его как аргумент метода addSQLMonitor .
Давайте представим, что ваш проект содержит базу данных SQLCIPHER с именем "MY_ENCRYPTED_DB" и другими 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" );Иногда вы можете настроить или полностью пропустить некоторые кусочки сбора приложений для данных.
Для этой цели монитор HTTP предоставляет интерфейс HTTPFilter , который можно передать методу addHttpMonitor(HTTPFilter) .
Допустим, мы хотим пропустить наш токен Auth от заголовков запросов. Вот образец этого фильтра:
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 ;
}
} Монитор SharedPreferences позволяет определять файлы, которые вы хотите наблюдать, используя SharedPreferencesSourceFactory .
SharedPreferencesSourceFactory.all() . По умолчанию монитор использует это значение.SharedPreferencesSourceFactory.excludeFiles("preferences_name") . Вы можете передать столько имен файлов, сколько хотите.SharedPreferencesSourceFactory.only("preferences_name") , где «Preferences_name» является именем файла для наблюдения. Этот метод также получает столько аргументов, сколько вы хотите. В Additinal монитор позволяет предоставлять SharedPreferencesMonitor.Filter для удаления или изменения некоторых значений перед отправкой данных на клиент.
Допустим, вы хотите удалить key_1 и изменить настройки key_2 в файле preferences_name . Итак, ваш фильтр будет выглядеть так:
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 ;
}
} Для применения этих настроек вам необходимо использовать один из этих методов: addSharedPreferenceMonitor(SharedPreferencesMonitor.Filter) , addSharedPreferenceMonitor(SharedPreferencesSourceFactory) , addSharedPreferenceMonitor(SharedPreferencesSourceFactory, SharedPreferencesMonitor.Filter) .
Для фильтрации журналов вам необходимо реализовать LogMonitor.Filter и передать его методу addLogMonitor(LogMonitor.Filter) .
Давайте рассмотрим пример, где мы хотим изменить уровень журнала, чтобы предупредить все сообщения с токеном Word:
public class LogFilter implements LogMonitor . Filter {
@ Nullable
@ Override
public LogEvent filter ( LogEvent event ) {
if ( event . message . contains ( "token" )) {
event . level = LogLevel . WARN ;
}
return request ;
}
}Давайте предоставим созданные файлы для мониторов:
AppSpector
. build ( this )
. withDefaultMonitors ()
. addHttpMonitor ( new TokenFilter ())
. addSharedPreferenceMonitor ( new SimpleSharedPreferencesFilter ())
. addLogMonitor ( new LogFilter ())
. run ( "YOUR_API_KEY" );Иногда вам может потребоваться получить URL -адрес, указывающий на текущий сеанс из кода. Скажем, вы хотите, чтобы ссылка сбои в своем репортере с аварией с ним, напишите в журналах или отображение в вашем интерфейсе отладки. Чтобы получить этот URL, вы должны добавить обратный вызов начала сеанса:
AppSpector . shared (). setSessionUrlListener ( new SessionUrlListener () {
@ Override
public void onReceived ( @ NonNull String sessionUrl ) {
// Save url for future use...
}
});По умолчанию Appceppeper SDK активен до тех пор, пока приложение не будет убито ОС Android, даже если не осталось деятельности. Это может привести к ненужному сбору данных и длинным сеансам для неактивных приложений. Мы предоставляем API для отключения сбора данных для случая, когда приложение не имеет начала деятельности.
AppSpector
. build ( this )
. collectDataInBackground ( false ) // Set this flag to disable data collection if no activities left
. withDefaultMonitors ()
. run ( "YOUR_API_KEY" ); Если вы не хотите использовать плагин Appceppector Gradle, вы можете использовать альтернативный способ перехвата HTTP -запросов и ответов. Вы можете вручную добавить AppSpectorOkHttp3Interceptor в свой okhttpclient (или AppSpectorOkHttp2Interceptor для старой версии Okhttpclient). Кроме того, не забудьте удалить плагин AppSpector из вашего файла app/build.gradle если добавлен плагин.
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 () В настоящее время SDK предоставляет API для ручной настройки в вашей кодовой базе. Чтобы использовать его в проекте, во-первых, вам нужно добавить зависимость urlconnection-extension Gradle:
dependencies {
implementation ' com.appspector:android-sdk:1.+ '
implementation ' com.appspector:urlconnection-extension:1.+ '
} После этого замените вызовы url.openConnection() на UrlInstrument.openConnection(url) . Допустим, у нас есть метод получить страницу Google, и мы хотим отслеживать этот запрос:
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 ();
}
}
}После интеграции SDK он будет выглядеть как этот:
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 ();
}
}
} И это все! Примечание. Вызов метода disconnect для нас важен. Это маркер, что запрос был завершен.
Если древесина была интегрирована в ваш проект, вы можете легко использовать его с помощью Appceppepor:
Timber . plant ( new Timber . DebugTree () {
@ Override
void log ( int priority , String tag , @ NotNull String message , Throwable t ) {
Logger . log ( priority , tag , message , t )
}
})Appsepeper предоставляет много мониторов, которые отслеживают различные действия в вашем приложении:
Предоставляет браузер для баз данных SQLite, найденных в вашем приложении. Позволяет отслеживать все запросы, показывает схему DB и данные в DB. Вы можете задать пользовательский SQL -запрос на любой БД и немедленно увидеть результаты в браузере.

Показывает весь http -трафик в вашем приложении. Вы можете осмотреть любой запрос, см. Заголовки запроса/ответа и тело. Мы предоставляем XML и JSON, чтобы ориентироваться на запросы/ответы с параметрами форматирования и складывания, чтобы даже просмотреть даже огромные ответы.

Отображает все журналы, сгенерированные вашим приложением.

Logger AppSeppepor позволяет собирать сообщение журнала только в службу AppSpector. Это полезно, когда вы регистрируете некоторые внутренние данные ведьмы с помощью LogCat. Logger Appspector имеет тот же API с классом android.util.Log .
Logger . d ( "MyTAG" , "It won't be printed to the Logcat" );Большинство приложений связаны с местоположением. Тестирование для этого требует меняющихся мест самостоятельно. В этом случае насмешка местоположения является вставкой в реальном времени. Просто укажите на место на карте, и ваше приложение сразу же изменит свою геодату.

Отображает графики в реальном времени ЦП / память / сеть / диск / батарея.

Просто улавливает скриншот с устройства.

Предоставляет браузер и редактор для SharedPreferences.

Предоставляет доступ к внутренней папке приложения. Таким образом, используя этот монитор, вы можете загружать, удалять или загружать файлы, создавать папки и просто проходить папки приложения.

Монитор позволяет отправлять любые данные, которые вы хотите увидеть. SDK предоставляет простой API для отправки ваших событий. Вот пример:
CustomEventsSender . send ( new MyCustomEvent ()) В примере класс MyCustomEvent реализует интерфейс CustomEventPayload , как здесь:
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 ;
}
}Монитор дает возможность дистанционно запустить ваш код от Dashboard Appspector. Запускаемый код должен быть завершен в CommandCallback Appcepector и зарегистрирован в SDK. Команда позволяет вам передавать параметры в ваш код и объявить тип результата.
Допустим, вам нужно показать тост с указанным текстом и вернуть значение int.
Вот объявление вашей команды, которая требует аргумента сообщения и имеет целочисленный результат.
@ Command ( value = "Show message" , category = "Application" )
public class ShowToastCommand extends BaseCommand < Integer > {
@ Argument ( isRequired = true )
public String message ;
}И вот регистрация вашей команды и реализация 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 );
}
});
}
}); Эта команда будет отображаться в категории Application и будет иметь имя Show message на панели инструментов. Вы можете использовать свои собственные категории для группировки команд на панели панели.
Команды могут быть зарегистрированы только после запуска SDK.
Дайте нам знать, что вы думаете или что бы вы хотели быть улучшенными: [email protected].
Присоединяйтесь к нашему Slack, чтобы обсудить процесс настройки и функции