
AppSpector를 사용하면 같은 방이나 다른 대륙에서 앱을 실행하는 앱을 원격으로 디버깅 할 수 있습니다. 앱 성능을 측정하고 데이터베이스 컨텐츠보기, 로그, 네트워크 요청 등을 실시간으로 볼 수 있습니다. 이것은 당신이 찾고 있던 악기입니다. 간단한 통나무로만 자신을 제한하지 마십시오. 디버깅이 고통스럽지 않아도됩니다!
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 사용 AppSpector 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 기능이있는 추가 모듈을 제공합니다. AppSpector가 장치에서 또는 장치로 보내는 모든 데이터를 암호화하고 해독 할 수 있는지 확인할 수 있습니다. 보안상의 이유로 암호화 된 세션은 데스크탑 응용 프로그램에서만 사용할 수 있습니다.
암호화를 사용하려면 데스크탑 응용 프로그램을 사용하여 앱을 등록하는 동안 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는 SDK 초기화를 애플리케이션의 onCreate() 메소드에서 유지하는 것이 좋습니다. SDK는 stopSdk() 및 startSdk() 정적 메소드를 호출하여 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 쿼리를 탐색하고 실행하려면 몇 가지 추가 단계를 수행해야합니다. 우선, 기본 SDK 모듈의 app/build.gradle 파일에 sqlcipher-extension 모듈을 추가하십시오. 그래서 그것은 다음과 같이 보일 것입니다.
dependencies {
implementation ' com.appspector:android-sdk:1.+ '
implementation ' com.appspector:sqlcipher-extension:1.+ '
} 그런 다음 DatabaseConnectionFactory를 작성하여 addSQLMonitor 메소드의 인수로 전달하십시오.
프로젝트에 "my_encrypted_db"이름이 포함 된 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" );때로는 일부 데이터 appspector 수집을 조정하거나 완전히 건너 뛰고 싶을 수도 있습니다.
이 목표를 위해 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 모니터를 사용하면 SharedPreferencesSourceFactory 사용하여 관찰하려는 파일을 지정할 수 있습니다.
SharedPreferencesSourceFactory.all() 메소드를 제공합니다. 기본적으로 모니터는이 값을 사용합니다.SharedPreferencesSourceFactory.excludeFiles("preferences_name") 메소드를 제공합니다. 여기서 "preferences_name"은 무시 된 파일의 이름입니다. 원하는만큼 파일 이름을 전달할 수 있습니다.SharedPreferencesSourceFactory.only("preferences_name") 메소드를 제공합니다. 여기서 "preferences_name"은 관찰을위한 파일 이름입니다. 이 방법은 또한 원하는만큼 아르 멘스를받습니다. 덧셈에서 모니터는 클라이언트에서 데이터를 보내기 전에 일부 값을 제거하거나 수정하기 위해 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) 메소드로 전달해야합니다.
단어 토큰이 있는 모든 메시지에 대해 로그 레벨을 변경하려는 예를 고려해 봅시다.
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" );때로는 Code에서 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 요청 및 응답을 가로 채 릴 수 있습니다. AppSpectorOkHttp3Interceptor okhttpclient에 수동으로 추가 할 수 있습니다 (또는 Okhttpclient의 구식 버전의 AppSpectorOkHttp2Interceptor ). 또한 플러그인이 추가 된 경우 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 방법을 호출하는 것이 우리에게 중요합니다. 요청이 완료된 마커입니다.
Timber가 프로젝트에 통합 된 경우 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를 사용하면 로그 메시지를 AppSpector Service에만 수집 할 수 있습니다. 내부 데이터 마녀를 로그 카트를 통해 유출 될 수있는 경우 유용합니다. AppSpector Logger는 android.util.Log 클래스와 동일한 API를 가지고 있습니다.
Logger . d ( "MyTAG" , "It won't be printed to the Logcat" );대부분의 앱은 위치 인식입니다. 테스트하려면 위치를 직접 변경해야합니다. 이 경우 위치 조롱은 실시간 절약입니다. 지도의 위치를 가리키면 앱이 geodata가 바로 변경됩니다.

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에 등록되어야합니다. 명령을 사용하면 매개 변수를 코드로 전달하고 결과 유형을 선언 할 수 있습니다.
지정된 텍스트로 토스트를 표시하고 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를 실행 한 후에 만 등록 할 수 있습니다.
설정 프로세스 및 기능을 논의하기 위해 슬랙에 가입하십시오