
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を持ちたくない場合にAPKを使用してくださいAppspector No-Opアーティファクト
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はデータの収集とデータの転送を開始します。その時点から、Appspectorクライアントでセッションを見ることができます。
SDKの初期化をアプリケーションのonCreate()メソッドに保持することをお勧めします。SDKは、 stopSdk()およびstartSdk() staticメソッドを呼び出すことにより、appspector状態を制御するのに役立つ方法を提供します。これらのメソッドは、Appspectorが初期化された後にのみ使用できます。
stop()すべてのデータ収集を無効にし、現在のセッションを閉じるようにappspectorに伝えます。
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 );SQLCipherデータベースでSQLクエリを閲覧および実行するには、いくつかの追加ステップを実行する必要があります。まず、 sqlcipher-extensionモジュールを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モニターはaddHttpMonitor(HTTPFilter)メソッドに渡すことができるインターフェイス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")メソッドを提供します。ここで、「feermence_name」は無視されたファイルの名前です。必要な数のファイル名を渡すことができます。SharedPreferencesSourceFactory.only("preferences_name")メソッドを提供します。ここで、「feermence_name」は観察用ファイルの名前です。また、この方法は、必要なだけ多くのArgumenを受け取ります。 Additinalでは、モニターを使用すると、クライアントにデータを送信する前に、一部の値を削除または変更するための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 ;
}
}これらのカスタマイズを適用するには、これらの方法のいずれかを使用する必要があります: addSharedPreferenceMonitor(SharedPreferencesMonitor.Filter) 、 addSharedPreferenceMonitor(SharedPreferencesSourceFactory) 、 addSharedPreferenceMonitor(SharedPreferencesSourceFactory, SharedPreferencesMonitor.Filter) 。
ログをフィルタリングするには、 LogMonitor.Filterを実装し、 addLogMonitor(LogMonitor.Filter)メソッドに渡す必要があります。
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 ;
}
}作成されたフィルテをモニターに提供しましょう。
AppSpector
. build ( this )
. withDefaultMonitors ()
. addHttpMonitor ( new TokenFilter ())
. addSharedPreferenceMonitor ( new SimpleSharedPreferencesFilter ())
. addLogMonitor ( new LogFilter ())
. run ( "YOUR_API_KEY" );時々、URLがコードから現在のセッションを指している必要がある場合があります。クラッシュレポーターのリンククラッシュが必要になり、ログに書き込み、デバッグ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リクエストと応答を傍受できます。 okhttpclient(またはAppSpectorOkHttp2Interceptor for ofhttpclient)にAppSpectorOkHttp3Interceptor手動で追加できます。また、 app/build.gradleファイルからappspectorプラグインを削除することを忘れないでください。プラグインが追加されている場合。
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方法を呼び出すことは、私たちにとって重要です。リクエストが完了したのはマーカーです。
木材がプロジェクトに統合されている場合は、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のデータを表示します。任意のDBでカスタムSQLクエリを発行し、すぐにブラウザで結果を確認できます。

アプリのすべてのHTTPトラフィックを表示します。リクエストを調べることができます。リクエスト/応答ヘッダーとボディを参照してください。フォーマットと折りたたみオプションを備えたリクエスト/応答のXMLおよびJSONハイライティングを提供するため、膨大な応答でさえ簡単に調べることができます。

アプリによって生成されたすべてのログを表示します。

Appspector Loggerでは、LogメッセージのみをAppspectorサービスに収集できます。内部データをログに記録する場合に役立ちます。 Appspector Loggerには、 android.util.Logクラスと同じAPIがあります。
Logger . d ( "MyTAG" , "It won't be printed to the Logcat" );ほとんどのアプリはロケーション認識です。テストするには、自分で場所を変更する必要があります。この場合、ロケーションモッキングはリアルタイムセーバーです。マップ上の場所を指すだけで、アプリはすぐにジオダタを変更します。

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 ;
}
}モニターは、Appspectorダッシュボードからコードをリモートでトリガーする機会を提供します。トリガーされたコードは、AppspectorのCommandCallbackにラップし、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に参加して、セットアッププロセスと機能について話し合います