
ด้วยแอพพลิเคชั่นคุณสามารถดีบักแอปของคุณจากระยะไกลที่ทำงานในห้องเดียวกันหรือในทวีปอื่น คุณสามารถวัดประสิทธิภาพของแอปดูเนื้อหาฐานข้อมูลบันทึกคำขอเครือข่ายและอื่น ๆ อีกมากมายในแบบเรียลไทม์ นี่คือเครื่องมือที่คุณกำลังมองหา อย่า จำกัด ตัวเองในบันทึกง่าย ๆ เท่านั้น การดีบักไม่จำเป็นต้องเจ็บปวด!
แต่ละแอพที่คุณต้องการใช้กับ AppSpector SDK คุณต้องลงทะเบียนบนบริการของเราผ่านเว็บ (https://app.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.+ "
}ในกรณีที่คุณไม่ต้องการให้ Appspector SDK ในการเปิดตัว apk ใช้แอพพลิเคชั่น 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" );
}
}AppSpector SDK รวบรวมและจัดเก็บข้อมูลผู้ใช้รวมถึงบันทึกเนื้อหาฐานข้อมูลและทราฟฟิกเครือข่าย ทั้งหมดนี้สามารถมีข้อมูลที่ละเอียดอ่อนดังนั้นเพื่อปกป้องความเป็นส่วนตัวของคุณเรานำเสนอโมดูลเพิ่มเติมด้วยคุณสมบัติ E2EE ช่วยให้คุณเข้ารหัสแอปข้อมูลทั้งหมดส่งจากหรือไปยังอุปกรณ์ของคุณและตรวจสอบให้แน่ใจว่ามีเพียงคุณเท่านั้นที่สามารถถอดรหัสได้ เนื่องจากเหตุผลด้านความปลอดภัยเซสชันที่เข้ารหัสมีเฉพาะในแอปพลิเคชันเดสก์ท็อป
ในการใช้การเข้ารหัสคุณต้องเลือกเปิดใช้งานตัวเลือก Enable End-To-End encryption ในระหว่างการลงทะเบียนแอปของคุณโดยใช้แอปพลิเคชันเดสก์ท็อป (แอปพลิเคชันที่ลงทะเบียนก่อนหน้านี้ไม่สามารถอัปเดตเพื่อรองรับการเข้ารหัส)
หลังจากนั้นคุณต้องเพิ่มโมดูล android-sdk-encryption ในการประกาศการพึ่งพาของคุณ ดังนั้นระดับแอพของคุณ build.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 จะเริ่มการรวบรวมข้อมูลและการถ่ายโอนข้อมูลไปยังบริการเว็บ จากจุดนั้นคุณสามารถเห็นเซสชันของคุณในไคลเอนต์แอปพลิเคชัน
เนื่องจากเราแนะนำให้ทำการเริ่มต้น SDK ในวิธีการ onCreate() ของแอปพลิเคชันของคุณ SDK จึงให้วิธีการที่จะช่วยคุณควบคุมสถานะแอพพลิเคชั่นโดยการโทร stopSdk() และ startSdk() วิธีการคงที่ คุณสามารถใช้วิธีการเหล่านี้ได้เฉพาะหลังจากที่แอปตรวจสอบเริ่มต้นแล้ว
The stop() บอกให้ AppSpector ปิดใช้งานการรวบรวมข้อมูลทั้งหมดและปิดเซสชันปัจจุบัน
AppSpector . stopSdk (); startSdk() เริ่มต้นอีกครั้งโดยใช้การกำหนดค่าที่คุณให้ไว้ในการเริ่มต้น
AppSpector . startSdk (); เนื่องจากผลลัพธ์ใหม่จะถูกสร้างขึ้นและกิจกรรมทั้งหมดระหว่าง stop() และ start() การโทรจะไม่ถูกติดตาม
ในการตรวจสอบสถานะของแอพพลิเคชั่นคุณสามารถใช้วิธีการ 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") เมธอดโดยที่ "predences_name" เป็นชื่อของไฟล์ที่ถูกละเว้น คุณอาจส่งชื่อไฟล์ได้มากเท่าที่คุณต้องการSharedPreferencesSourceFactory.only("preferences_name") เมธอดโดยที่ "predences_name" เป็นชื่อของไฟล์สำหรับการสังเกต วิธีนี้ยังได้รับ argumens มากเท่าที่คุณต้องการ ใน Additinal จอภาพอนุญาตให้จัดหา SharedPreferencesMonitor.Filter สำหรับการลบหรือแก้ไขค่าบางอย่างก่อนที่จะส่งข้อมูลไปยังไคลเอนต์
สมมติว่าคุณต้องการลบ key_1 และแก้ไขการตั้งค่า key_2 ในไฟล์ preferences_name _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 addSharedPreferenceMonitor(SharedPreferencesSourceFactory) addSharedPreferenceMonitor(SharedPreferencesSourceFactory, SharedPreferencesMonitor.Filter) , AddsharedPreferencemonitor
ในการกรองบันทึกคุณต้องใช้ LogMonitor.Filter และส่งผ่านไปยังวิธีการ addLogMonitor(LogMonitor.Filter)
ลองพิจารณาตัวอย่างที่เราต้องการเปลี่ยนระดับบันทึกเพื่อเตือนสำหรับข้อความทั้งหมดด้วย Token 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 ที่ชี้ไปที่เซสชันปัจจุบันจากรหัส สมมติว่าคุณต้องการให้ลิงก์ขัดข้องในผู้รายงานข่าวของคุณเขียนลงในบันทึกหรือแสดงใน UI Debug ของคุณ ในการรับ URL นี้คุณต้องเพิ่มเซสชันเริ่มโทรกลับ:
AppSpector . shared (). setSessionUrlListener ( new SessionUrlListener () {
@ Override
public void onReceived ( @ NonNull String sessionUrl ) {
// Save url for future use...
}
});โดยค่าเริ่มต้น AppSpector SDK จะทำงานจนกว่าแอปพลิเคชันจะถูกฆ่าโดย Android OS แม้ว่าจะไม่มีกิจกรรมเหลืออยู่ก็ตาม มันอาจนำไปสู่การรวบรวมข้อมูลที่ไม่จำเป็นและเซสชันที่ยาวนานสำหรับแอพที่ไม่ได้ใช้งาน เราจัดเตรียม API เพื่อปิดใช้งานการรวบรวมข้อมูลสำหรับกรณีที่แอปไม่มีกิจกรรมเริ่มต้น
AppSpector
. build ( this )
. collectDataInBackground ( false ) // Set this flag to disable data collection if no activities left
. withDefaultMonitors ()
. run ( "YOUR_API_KEY" ); หากคุณไม่ต้องการใช้ปลั๊กอิน Gradle Appspector คุณสามารถใช้วิธีอื่นในการสกัดกั้นคำขอและการตอบกลับ HTTP คุณสามารถเพิ่ม AppSpectorOkHttp3Interceptor ด้วยตนเองลงใน OkhttpClient ของคุณ (หรือ AppSpectorOkHttp2Interceptor สำหรับ OkhttpClient เวอร์ชันเก่า) นอกจากนี้ อย่าลืม ลบปลั๊กอินแอพพลิเคชั่นออกจากไฟล์ 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 สำหรับการตั้งค่าด้วยตนเองใน codebase ของคุณ ในการใช้งานในโครงการประการแรกคุณต้องเพิ่ม urlconnection-extension GRADLE PRIDLE:
dependencies {
implementation ' com.appspector:android-sdk:1.+ '
implementation ' com.appspector:urlconnection-extension:1.+ '
} หลังจากนั้นให้แทนที่ url.openConnection() การโทรด้วย UrlInstrument.openConnection(url) สมมติว่าเรามีวิธีการรับ Google Page และเราต้องการติดตามคำขอนี้:
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 เป็นสิ่งสำคัญสำหรับเรา มันเป็นเครื่องหมายที่คำขอเสร็จสมบูรณ์
หากไม้ได้ถูกรวมเข้ากับโครงการของคุณคุณสามารถใช้งานกับ 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 มีจอภาพมากมายที่ติดตามกิจกรรมต่าง ๆ ภายในแอพของคุณ:
จัดเตรียมเบราว์เซอร์สำหรับฐานข้อมูล SQLite ที่พบในแอพของคุณ อนุญาตให้ติดตามการสืบค้นทั้งหมดแสดงรูปแบบ DB และข้อมูลใน DB คุณสามารถออกแบบสอบถาม SQL แบบกำหนดเองบนฐานข้อมูลใด ๆ และดูผลลัพธ์ในเบราว์เซอร์ได้ทันที

แสดงปริมาณการใช้งาน HTTP ทั้งหมดในแอพของคุณ คุณสามารถตรวจสอบคำขอใด ๆ ดูส่วนหัวคำขอ/การตอบกลับและร่างกาย เราให้บริการ XML และ JSON Highliting สำหรับการร้องขอ/การตอบกลับด้วยตัวเลือกการจัดรูปแบบและการพับดังนั้นแม้กระทั่งการตอบสนองที่ยิ่งใหญ่ก็เป็นเรื่องง่ายที่จะมองผ่าน

แสดงบันทึกทั้งหมดที่สร้างโดยแอปของคุณ

AppSpector Logger ช่วยให้คุณสามารถรวบรวมข้อความบันทึกลงในบริการ AppSpector เท่านั้น มันมีประโยชน์เมื่อคุณเข้าสู่ระบบแม่มดข้อมูลภายในบางอย่างสามารถรั่วไหลผ่าน logcat AppSpector Logger มี API เดียวกันกับคลาส android.util.Log
Logger . d ( "MyTAG" , "It won't be printed to the Logcat" );แอพส่วนใหญ่เป็นที่ทราบกับสถานที่ การทดสอบต้องมีการเปลี่ยนตำแหน่งด้วยตัวเอง ในกรณีนี้การเยาะเย้ยตำแหน่งคือการประหยัดเวลาเรียลไทม์ เพียงชี้ไปที่ตำแหน่งบนแผนที่และแอปของคุณจะเปลี่ยน geodata ทันที

แสดงกราฟแบบเรียลไทม์ของ CPU / หน่วยความจำ / เครือข่าย / ดิสก์ / แบตเตอรี่

เพียงแค่จับภาพหน้าจอจากอุปกรณ์

จัดเตรียมเบราว์เซอร์และบรรณาธิการสำหรับ 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 ของ AppSpector และลงทะเบียนกับ 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 ของเราเพื่อหารือเกี่ยวกับกระบวนการตั้งค่าและคุณสมบัติ