
使用AppSpector,您可以在同一房間或在另一個大陸上運行的應用程序遠程調試。您可以實時衡量應用程序性能,查看數據庫內容,日誌,網絡請求等。這是您一直在尋找的工具。不要將自己限制在簡單的日誌中。調試不必痛苦!
您要與AppSpector SDK一起使用的每個應用程序都必須通過Web(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時,請使用AppSpector no-op trifact
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.+ '
}最後,通過將啟用加密放置為SDK配置來啟用enableEncryption 。您可以在應用程序設置屏幕上找到的客戶Public Key 。
AppSpector
. build ( this )
. withDefaultMonitors ()
. enableEncryption ( "CLIENT_PUBLIC_KEY" )
. run ( "API_KEY" );建立您的項目,看看一切工作!當您的應用程序啟動並運行時,您可以訪問https://app.appspector.com並連接到您的申請會話。
調用run方法後,SDK啟動數據收集和數據傳輸到Web服務。從那時起,您可以在AppSpector客戶端中看到您的會話。
由於我們建議將SDK初始化保留在您應用程序的onCreate()方法中,因此SDK通過調用stopSdk()和startsdk()和startSdk()靜態方法提供了幫助您控制應用程序狀態的方法。您只能在初始化AppSpector之後才能使用這些方法。
stop()告訴應用程序範圍禁用所有數據收集並關閉當前會話。
AppSpector . stopSdk (); startSdk()使用您在初始化時提供的配置再次啟動它。
AppSpector . startSdk ();結果將創建新的會話,並且將不會跟踪stop()和start()調用之間的所有活動。
要檢查應用程序狀態,您可以使用isStarted()方法。
AppSpector . shared (). isStarted ();您可以將自定義名稱分配給設備,以輕鬆在會話列表中找到所需的會話。 AppSpector.METADATA_KEY_DEVICE_NAME
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 );對於SQLCipher數據庫中的瀏覽和運行SQL查詢,您需要執行幾個其他步驟。首先,將sqlcipher-extension模塊添加到主SDK模塊下的app/build.gradle文件中。因此,看起來像這樣:
dependencies {
implementation ' com.appspector:android-sdk:1.+ '
implementation ' com.appspector:sqlcipher-extension:1.+ '
}之後,創建DataBaseConnectionFactory並將其作為addSQLMonitor方法的參數傳遞。
讓我們想像您的項目包含帶有“ my_encrypted_db”名稱和其他sqlite的SQLCIPHER數據庫:
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)方法。
假設我們想從請求標題中跳過我們的驗證令牌。這是此過濾器的示例:
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 Monitor允許通過使用SharedPreferencesSourceFactory指定要觀察的文件。
SharedPreferencesSourceFactory.all()方法。默認情況下,監視器使用此值。SharedPreferencesSourceFactory.excludeFiles("preferences_name")方法,其中“ pereences_name”是忽略的文件的名稱。您可以根據需要傳遞盡可能多的文件名。SharedPreferencesSourceFactory.only("preferences_name")方法,其中“ pereences_name”是要觀察的文件名。此方法還可以收到您想要的盡可能多的Argumens。在附錄中,監視器允許提供SharedPreferencesMonitor.Filter在發送客戶端數據之前刪除或修改某些值。
假設您要刪除key_1並在文件preferences_name中修改key_2首選項。因此,您的過濾器看起來像這樣:
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 ;
}
} For applying these customizations, you need to use one of these methods: 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" );有時,您可能需要從代碼指向當前會話。假設您要使用碰撞記者中的鏈接崩潰,將其寫入日誌或在調試UI中顯示。要獲取此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" );如果您不想使用Appspector Gradle插件,則可以使用另一種方法來攔截HTTP請求和響應。您可以將AppSpectorOkHttp3Interceptor手動添加到OKHTTPCLIENT(或okhttpclient的舊版本)的OKHTTPCLIENT(或AppSpectorOkHttp2Interceptor )。另外,如果添加了插件,請不要忘記從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.+ '
}之後,用urlinstrument.opennection 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方法對我們很重要。請求完成是一個標記。
如果將木材集成到您的項目中,則可以輕鬆地將其與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服務中。當您記錄一些內部數據巫婆時,這很有用。 AppSpector Logger與android.util.Log類具有相同的API。
Logger . d ( "MyTAG" , "It won't be printed to the Logcat" );大多數應用程序都是位置感知的。測試它需要自己更改位置。在這種情況下,嘲笑位置是一個實時節省的。只需指向地圖上的位置,您的應用程序將立即更改其地理上。

顯示CPU /內存 /網絡 /磁盤 /電池使用情況的實時圖。

只需從設備捕獲屏幕截圖即可。

提供共享流程的瀏覽器和編輯器。

提供對應用程序內部文件夾的訪問。因此,使用此監視器可以下載,刪除或上傳文件,創建文件夾,然後瀏覽應用程序的文件夾。

監視器允許您發送想要查看的任何數據。 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 ;
}
}監視器提供了一個機會,可以從Appspector儀表板遠程觸發您的代碼。觸發的代碼應包裹在AppSpector的CommandCallback中,並註冊到SDK。該命令允許您將params傳遞到代碼並聲明結果類型。
假設您需要用指定的文本顯示吐司並返回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,討論設置過程和功能