
Dengan Appspector, Anda dapat men -debug aplikasi Anda dari jarak yang sama di ruangan yang sama atau di benua lain. Anda dapat mengukur kinerja aplikasi, melihat konten basis data, log, permintaan jaringan, dan banyak lagi secara realtime. Ini adalah instrumen yang telah Anda cari. Jangan batasi diri Anda hanya pada log sederhana. Debugging tidak harus menyakitkan!
Setiap aplikasi yang ingin Anda gunakan dengan Appspector SDK Anda harus mendaftar di layanan kami melalui web (https://app.appspector.com) atau aplikasi desktop. Setelah menambahkan aplikasi, navigasikan ke pengaturan aplikasi dan salin tombol 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.+ "
}Jika Anda tidak ingin memiliki Appspector SDK di rilis Anda APK menggunakan appspector no-op 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 mengumpulkan dan menyimpan data pengguna termasuk log, konten basis data, dan lalu lintas jaringan. Semua ini dapat berisi data sensitif sehingga untuk melindungi privasi Anda, kami menawarkan modul tambahan dengan fitur E2EE. Ini memungkinkan Anda untuk mengenkripsi semua Apppector data yang dikirim dari atau ke perangkat Anda dan pastikan hanya Anda yang dapat mendekripsi. Karena alasan keamanan, sesi terenkripsi hanya tersedia dalam aplikasi desktop.
Untuk menggunakan enkripsi, Anda harus memilih opsi Enable End-To-End encryption selama pendaftaran aplikasi Anda menggunakan aplikasi desktop (aplikasi terdaftar sebelumnya tidak dapat diperbarui untuk mendukung enkripsi).
Setelah itu, Anda perlu menambahkan modul android-sdk-encryption ke deklarasi dependensi Anda. Jadi, level Anda build.gradle harus berisi baris berikutnya:
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.+ '
} Akhirnya, aktifkan enkripsi dengan menempatkan enableEncryption ke konfigurasi SDK. Public Key klien yang dapat Anda temukan di layar Pengaturan Aplikasi.
AppSpector
. build ( this )
. withDefaultMonitors ()
. enableEncryption ( "CLIENT_PUBLIC_KEY" )
. run ( "API_KEY" );Bangun proyek Anda dan lihat semuanya berhasil! Saat aplikasi Anda sudah habis dan berjalan, Anda dapat pergi ke https://app.appspector.com dan terhubung ke sesi aplikasi Anda.
Setelah menelepon metode run SDK memulai pengumpulan data dan transfer data ke layanan web. Dari titik itu Anda dapat melihat sesi Anda di klien Apppector.
Karena kami merekomendasikan untuk menyimpan inisialisasi SDK dalam metode onCreate() dari aplikasi Anda, SDK menyediakan metode untuk membantu Anda mengontrol status apppector dengan menelepon stopSdk() dan startSdk() Statis. Anda dapat menggunakan metode ini hanya setelah Apppector diinisialisasi.
stop() memberi tahu Appspector untuk menonaktifkan semua pengumpulan data dan menutup sesi saat ini.
AppSpector . stopSdk (); startSdk() memulainya lagi menggunakan konfigurasi yang Anda berikan pada inisialisasi.
AppSpector . startSdk (); Karena hasil sesi baru akan dibuat dan semua aktivitas antara stop() dan start() panggilan tidak akan dilacak.
Untuk memeriksa status apppector, Anda dapat menggunakan metode isStarted() .
AppSpector . shared (). isStarted (); Anda dapat menetapkan nama khusus ke perangkat Anda untuk dengan mudah menemukan sesi yang diperlukan dalam daftar Sesi. Untuk melakukan ini, Anda harus menambahkan nama yang diinginkan sebagai nilai untuk kunci AppSpector.METADATA_KEY_DEVICE_NAME ke kamus metadata :
AppSpector
. build ( this )
. withDefaultMonitors ()
. addMetadata ( AppSpector . METADATA_KEY_DEVICE_NAME , "YOUR_DEVICE_NAME" )
. run ( "YOUR_API_KEY" );Juga, SDK memungkinkan mengelola nama perangkat selama seumur hidup aplikasi menggunakan
Metode setMetadataValue untuk mengubah nama perangkat
AppSpector . shared (). setMetadataValue ( AppSpector . METADATA_KEY_DEVICE_NAME , "NEW_DEVICE_NAME" ); atau removeMetadataValue untuk menghapus nama perangkat khusus Anda
AppSpector . shared (). removeMetadataValue ( AppSpector . METADATA_KEY_DEVICE_NAME ); Untuk menjelajah dan menjalankan kueri SQL di database SQLCipher, Anda perlu melakukan beberapa langkah tambahan. Pertama-tama, tambahkan modul sqlcipher-extension ke file app/build.gradle Anda di bawah modul SDK utama. Jadi, akan terlihat seperti itu:
dependencies {
implementation ' com.appspector:android-sdk:1.+ '
implementation ' com.appspector:sqlcipher-extension:1.+ '
} Setelah itu, Buat DataBaseConnectionFactory dan lulus sebagai argumen dari metode addSQLMonitor .
Mari kita bayangkan proyek Anda berisi database sqlcipher dengan nama "my_encrypted_db" dan yang sqlite lainnya:
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" );Terkadang Anda mungkin ingin menyesuaikan atau benar -benar melewatkan beberapa bagian dari Aplikasi Aplikasi Data.
Untuk tujuan ini, monitor HTTP menyediakan antarmuka HTTPFilter yang dapat diteruskan ke metode addHttpMonitor(HTTPFilter) .
Katakanlah kami ingin melewatkan token auth kami dari header permintaan. Berikut adalah contoh filter ini:
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 ;
}
} Monitor SharedPreferences memungkinkan menentukan file yang ingin Anda amati dengan menggunakan SharedPreferencesSourceFactory .
SharedPreferencesSourceFactory.all() . Secara default, monitor menggunakan nilai ini.SharedPreferencesSourceFactory.excludeFiles("preferences_name") , di mana "Preferensi_name" adalah nama file yang diabaikan. Anda dapat memberikan nama file sebanyak yang Anda inginkan.SharedPreferencesSourceFactory.only("preferences_name") , di mana "preferensi_name" adalah nama file untuk mengamati. Metode ini juga menerima argumen sebanyak yang Anda inginkan. Di Additinal, monitor memungkinkan untuk menyediakan SharedPreferencesMonitor.Filter untuk menghapus atau memodifikasi beberapa nilai sebelum mengirim data pada klien.
Katakanlah Anda ingin menghapus key_1 dan memodifikasi preferensi key_2 di file preferences_name . Jadi, filter Anda akan terlihat seperti itu:
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 ;
}
} Untuk menerapkan kustomisasi ini, Anda perlu menggunakan salah satu metode ini: addSharedPreferenceMonitor(SharedPreferencesMonitor.Filter) , addSharedPreferenceMonitor(SharedPreferencesSourceFactory) , addSharedPreferenceMonitor(SharedPreferencesSourceFactory, SharedPreferencesMonitor.Filter) , sharedprefendering.
Untuk memfilter log, Anda perlu mengimplementasikan metode LogMonitor.Filter dan meneruskannya ke addLogMonitor(LogMonitor.Filter) .
Mari kita pertimbangkan contoh di mana kita ingin mengubah level log untuk memperingatkan semua pesan dengan Word Token :
public class LogFilter implements LogMonitor . Filter {
@ Nullable
@ Override
public LogEvent filter ( LogEvent event ) {
if ( event . message . contains ( "token" )) {
event . level = LogLevel . WARN ;
}
return request ;
}
}Mari berikan filte yang dibuat untuk monitor:
AppSpector
. build ( this )
. withDefaultMonitors ()
. addHttpMonitor ( new TokenFilter ())
. addSharedPreferenceMonitor ( new SimpleSharedPreferencesFilter ())
. addLogMonitor ( new LogFilter ())
. run ( "YOUR_API_KEY" );Terkadang Anda mungkin perlu menunjuk URL ke sesi saat ini dari kode. Katakanlah Anda ingin tautan crash di reporter crash Anda dengan itu, tuliskan ke log atau tampilkan di UI debug Anda. Untuk mendapatkan URL ini, Anda harus menambahkan Sesi Mulai Callback:
AppSpector . shared (). setSessionUrlListener ( new SessionUrlListener () {
@ Override
public void onReceived ( @ NonNull String sessionUrl ) {
// Save url for future use...
}
});Secara default, Appspector SDK aktif sampai aplikasi dibunuh oleh Android OS, bahkan jika tidak ada aktivitas yang tersisa. Ini dapat menyebabkan pengumpulan data yang tidak perlu dan sesi panjang untuk aplikasi yang tidak aktif. Kami menyediakan API untuk menonaktifkan pengumpulan data untuk suatu kasus ketika aplikasi tidak memiliki kegiatan yang dimulai.
AppSpector
. build ( this )
. collectDataInBackground ( false ) // Set this flag to disable data collection if no activities left
. withDefaultMonitors ()
. run ( "YOUR_API_KEY" ); Jika Anda tidak ingin menggunakan plugin Gradle Appspector, Anda dapat menggunakan cara alternatif untuk mencegat permintaan dan tanggapan HTTP. Anda dapat secara manual menambahkan AppSpectorOkHttp3Interceptor ke okhttpClient Anda (atau AppSpectorOkHttp2Interceptor untuk versi lama okhttpClient). Juga, jangan lupa untuk menghapus plugin Appspector dari file app/build.gradle Anda jika plugin ditambahkan.
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 () Pada saat saat ini, SDK menyediakan API untuk pengaturan manual di basis kode Anda. Untuk menggunakannya dalam proyek, pertama, Anda perlu menambahkan ketergantungan lulusan urlconnection-extension :
dependencies {
implementation ' com.appspector:android-sdk:1.+ '
implementation ' com.appspector:urlconnection-extension:1.+ '
} Setelah itu, ganti panggilan url.openConnection() dengan UrlInstrument.openConnection(url) . Katakanlah kami memiliki metode untuk mendapatkan halaman Google dan kami ingin melacak permintaan ini:
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 ();
}
}
}Setelah integrasi SDK, itu akan terlihat seperti ini:
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 ();
}
}
} Dan itu saja! CATATAN: Memanggil metode disconnect penting bagi kami. Ini adalah penanda bahwa permintaan itu selesai.
Jika kayu telah diintegrasikan ke dalam proyek Anda, Anda dapat dengan mudah menggunakannya dengan Apppector:
Timber . plant ( new Timber . DebugTree () {
@ Override
void log ( int priority , String tag , @ NotNull String message , Throwable t ) {
Logger . log ( priority , tag , message , t )
}
})AppSpector menyediakan banyak monitor yang melacak berbagai aktivitas di dalam aplikasi Anda:
Menyediakan browser untuk database SQLite yang ditemukan di aplikasi Anda. Memungkinkan untuk melacak semua pertanyaan, menunjukkan skema DB dan data di DB. Anda dapat mengeluarkan kueri SQL khusus pada DB apa pun dan segera melihat hasil di browser.

Menampilkan semua lalu lintas HTTP di aplikasi Anda. Anda dapat memeriksa permintaan apa pun, lihat header permintaan/respons dan tubuh. Kami menyediakan xml dan json highliting untuk permintaan/tanggapan dengan format dan opsi lipat sehingga bahkan tanggapan besar mudah dilihat.

Menampilkan semua log yang dihasilkan oleh aplikasi Anda.

Appspector Logger memungkinkan Anda untuk mengumpulkan pesan log hanya ke Layanan Appspector. Ini berguna ketika Anda mencatat beberapa penyihir data internal dapat dibocorkan melalui logcat. Appspector Logger memiliki API yang sama dengan kelas android.util.Log .
Logger . d ( "MyTAG" , "It won't be printed to the Logcat" );Sebagian besar aplikasi sadar lokasi. Menguji itu membutuhkan perubahan lokasi sendiri. Dalam hal ini, mengejek lokasi adalah penghemat waktu nyata. Tunjuk saja ke lokasi di peta dan aplikasi Anda akan segera mengubah geodata.

Menampilkan grafik real-time dari CPU / memori / jaringan / disk / penggunaan baterai.

Cukup menangkap tangkapan layar dari perangkat.

Menyediakan browser dan editor untuk SharedPreferences.

Memberikan akses ke folder internal aplikasi. Jadi, dengan menggunakan monitor ini Anda dapat mengunduh, menghapus atau mengunggah file, membuat folder dan hanya berjalan melalui folder aplikasi.

Monitor memungkinkan Anda untuk mengirim data apa pun yang ingin Anda lihat. SDK menyediakan API sederhana untuk mengirim acara Anda. Inilah contohnya:
CustomEventsSender . send ( new MyCustomEvent ()) Dalam contoh, kelas MyCustomEvent mengimplementasikan antarmuka CustomEventPayload seperti di sini:
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 ;
}
}Monitor memberikan kesempatan untuk memicu kode Anda dari jarak jauh dari dasbor Appspector. Kode yang dipicu harus dibungkus dengan CommandCallback Apppector dan terdaftar ke SDK. Perintah ini memungkinkan Anda untuk meneruskan Params ke kode Anda dan menyatakan jenis hasilnya.
Katakanlah Anda perlu menunjukkan roti panggang dengan teks yang ditentukan dan mengembalikan nilai int.
Berikut adalah deklarasi perintah Anda yang membutuhkan argumen pesan dan memiliki hasil integer.
@ Command ( value = "Show message" , category = "Application" )
public class ShowToastCommand extends BaseCommand < Integer > {
@ Argument ( isRequired = true )
public String message ;
}Dan di sini adalah pendaftaran perintah Anda dan implementasi 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 );
}
});
}
}); Perintah ini akan muncul di bawah kategori Application dan akan memiliki nama Show message di dasbor. Anda dapat menggunakan kategori Anda sendiri untuk mengelompokkan perintah di dasbor.
Perintah dapat didaftarkan hanya setelah menjalankan SDK.
Beri tahu kami bagaimana menurut Anda atau apa yang ingin Anda tingkatkan: [email protected].
Bergabunglah dengan Slack kami untuk membahas proses dan fitur pengaturan