화면 녹화, 네트워크 활동 로깅, 버그 보고서 생성 및 기타 유용한 기능을 지원하는 Android 앱 용 현명하고 신뢰할 수 있으며 사용자 정의 가능한 디버그 메뉴 라이브러리.
이 저장소를 복제하고 빌드 변형을 선택하고 앱 구성을 실행하십시오. 다음과 같이 보일 것입니다.
이 데모 애플리케이션에는 Beagle 설정 방법과 전시중인 다양한 기능을 구현하는 방법에 대한 지침도 포함되어 있습니다. 프로젝트에서 라이브러리를 사용하는 데 관심이 있다면 시도해 보는 것을 고려해야합니다. 직접 만들고 싶지 않다면 Play 스토어에서 다운로드 할 수도 있습니다.
앱의 자습서는이 readme의 모든 것을 다루지 만 자세히 설명합니다. 도서관으로 달성 할 수있는 것에 대한 아이디어를 얻는 또 다른 방법은 Beagle로 해결할 수있는 다양한 문제를 제시하는이 기사입니다.
아래의 텍스트 벽이 취향에 너무 길면, 좋은 구성에 필요한 모든 코드가 포함 된이 요점을 확인하십시오. 그렇지 않으면 단계별로 해보자.
다음이 프로젝트 수준 Build.Gradle 파일의 일부인지 확인하십시오.
allprojects {
repositories {
…
mavenCentral()
}
}
디버그 메뉴의 실제 UI는 여러 가지 방법으로 표시 될 수 있으며, 이는 종속성의 접미사로 지정됩니다. 다음 버전이 있습니다.
DebugMenuView
표시는 귀하의 책임입니다 (권장되지 않음 : Shake to Open, Beagle.show()
, Beagle.hide()
, 관련 VisibilityListener
및 Inset 처리 로직이 상자에서 작동하지 않음).예를 들어 서랍 UI를 선호하는 경우 다음과 같은 것과 같은 것과 같은 것을 앱 레벨 빌드에 추가해야합니다. Gradle 파일 (최신 버전의 코드 스 니펫 아래 위젯을 확인하십시오).
dependencies {
…
def beagleVersion = " 2.9.8 "
debugImplementation " io.github.pandulapeter.beagle:ui-drawer: $b eagleVersion "
releaseImplementation " io.github.pandulapeter.beagle:noop: $b eagleVersion "
}
최신 버전은 다음과 같습니다.
참고 : 서랍 UI의 경우 Activity
의 onBackPressed()
메소드를 덮어 쓴 경우 기본 백비로 내비게이션 처리가 항상 예상대로 작동하지는 않습니다. 이 문제를 해결하려면 모든 Activity
의 onBackPressed()
에서 다른 점검을 수행하거나 슈퍼 구현을 호출하기 전에 Beagle.hide()
false를 반환하는지 확인해야합니다.
Application
의 onCreate()
메소드에서 하나의 코드 줄, 바람직하게는 다음과 같습니다.
Beagle .initialize( this )
선택적 으로이 함수에 다음 매개 변수를 추가 할 수 있습니다.
Application
/ Activity
에서 사용하는 것이 적합하지 않은 경우 themeResourceId
속성을 사용하여 디버그 메뉴의 사용자 정의 테마를 지정할 수 있습니다. 참고 : .NoActionBar
자료 테마를 확장하는 것이 좋습니다.기본적으로 장치를 흔들어 비글을 가져올 수 있습니다.
이 후에 여러 모듈이 제공되어야하지만이 구성은 언제든지 (모든 스레드에서) 변경 될 수 있으며 UI가 자동으로 업데이트됩니다. 이 작업을 수행하는 가장 간단한 방법은 다음과 같습니다.
Beagle .set(module1, module2, …)
이 시점에서 두 가지 옵션을 알고 있어야합니다.
내장 모듈로 가능한 아이디어 또는 모듈 구성을 미리보기에 사용할 수있는 대화식 도구에 대한 일부 아이디어에 대한 Showcase 앱을 확인하십시오. 가능성에 대한보다 시각적 인 가이드는이 기사입니다.
다음은 대부분의 프로젝트에서 작동 해야하는 최소한의 예입니다.
Beagle .set(
HeaderModule (
title = getString( R .string.app_name),
subtitle = BuildConfig . APPLICATION_ID ,
text = " ${ BuildConfig . BUILD_TYPE } v ${ BuildConfig . VERSION_NAME } ( ${ BuildConfig . VERSION_CODE } ) "
),
AppInfoButtonModule (),
DeveloperOptionsButtonModule (),
PaddingModule (),
TextModule ( " General " , TextModule . Type . SECTION_HEADER ),
KeylineOverlaySwitchModule (),
AnimationDurationSwitchModule (),
ScreenCaptureToolboxModule (),
DividerModule (),
TextModule ( " Logs " , TextModule . Type . SECTION_HEADER ),
NetworkLogListModule (), // Might require additional setup, see below
LogListModule (), // Might require additional setup, see below
LifecycleLogListModule (),
DividerModule (),
TextModule ( " Other " , TextModule . Type . SECTION_HEADER ),
DeviceInfoModule (),
BugReportButtonModule ()
)
임시 모듈을 추가 해야하는 경우 Beagle.add()
에는 제공된 수명주기가 끝나면 지정된 모듈을 자동으로 제거하는 선택적 lifecycleOwner
매개 변수가 있습니다. 모듈 ID-S를 사용하여 Beagle.remove()
수동으로 호출하는 것도 옵션입니다.
Beagle.log()
호출하는 것이 LoglistModule에 항목을 추가하는 가장 간단한 방법이지만 Pure Kotlin 모듈 에서이 기능에 액세스하려면 특별한 해결 방법이 필요합니다. 또 다른 빈번한 사용 사례는 목재와의 통합입니다.
Beagle.log()
순수한 Kotlin / Java 모듈에서 제공하는 동일한 기능에 액세스하려면 먼저 문제의 모듈에 다음을 추가해야합니다.
dependencies {
…
api " io.github.pandulapeter.beagle:log: $b eagleVersion "
// Alternative for Android modules:
// debugApi "io.github.pandulapeter.beagle:log:$beagleVersion"
// releaseApi "io.github.pandulapeter.beagle:log-noop:$beagleVersion"
}
이 라이브러리는 Application
클래스에서 초기화 될 때 메인 라이브러리에 연결 해야하는 BeagleLogger
객체를 제공합니다.
Beagle .initialize(
…
behavior = Behavior (
…
logBehavior = Behavior . LogBehavior (
loggers = listOf ( BeagleLogger ),
…
)
)
)
로그 메시지를 추가하려면 이제 다음을 호출 할 수 있습니다.
BeagleLogger .log(…)
메시지 목록은 일반 Beagle.log()
함수 (태그로 필터링되지 않는 한)를 사용하여 로그인 된 것과 병합되며 로그리스트 모드를 사용하여 표시 할 수 있습니다. BeagleLogger.clearLogEntries()
에 액세스 할 수없는 경우 Beagle.clearLogEntries()
를 사용할 수도 있습니다.
디버그 메뉴에 목재로 기록 된 이벤트를 자동으로 추가하려면 특별한 트리를 심는 것이 가장 간단한 솔루션입니다.
Timber .plant(
object : Timber . Tree () {
override fun log ( priority : Int , tag : String? , message : String , t : Throwable ? ) =
Beagle .log( " [ $tag ] $message " , " Timber " , t?.stackTraceToString())
}
)
이 로그 만 표시하는 특수 로그리스트 모드를 만들려면 모듈의 레이블 생성자 매개 변수를 "목재"로 설정하십시오.
메인 라이브러리와 네트워크 인터셉터를 번들링하지 않으면 주로 위에서 설명한 로거 솔루션과 유사하게 Android SDK를 사용하지 않는 순수한 Kotlin 의존성을 제공하기 위해 수행되었습니다. 현재 Beagle은 OKHTTP 네트워킹 라이브러리에만 연결하여 NetworkLoglistModule에 컨텐츠를 제공 할 수 있지만 수동으로 Beagle.logNetworkEvent()
호출하는 것은 항상 옵션입니다.
네트워킹 로직이 구현 된 모듈에 다음을 추가하십시오.
dependencies {
…
api " io.github.pandulapeter.beagle:log-okhttp: $b eagleVersion "
// Alternative for Android modules:
// debugApi "io.github.pandulapeter.beagle:log-okhttp:$beagleVersion"
// releaseApi "io.github.pandulapeter.beagle:log-okhttp-noop:$beagleVersion"
}
이것은 처음으로 메인 라이브러리에 연결 해야하는 BeagleOkHttpLogger
객체를 소개합니다.
Beagle .initialize(
…
behavior = Behavior (
…
networkLogBehavior = Behavior . NetworkLogBehavior (
networkLoggers = listOf ( BeagleOkHttpLogger ),
…
)
)
)
마지막 단계는 Interceptor
설정하는 것입니다.
val client = OkHttpClient . Builder ()
…
. apply { ( BeagleOkHttpLogger .logger as ? Interceptor ? )?. let { addInterceptor(it) } }
.build()
라이브러리는 예외를 차단하고 대화 상자에서 스택 추적을 표시 할 수 있습니다. 사용자는 자동으로 열리는 버그보고 화면을 사용하여 충돌 보고서를 공유 할 수 있습니다. 이 기능은 기본 모듈에 추가되어야하는 별도의 종속성을 통해 달성됩니다 (Beagle이 초기화되는 곳).
dependencies {
…
debugImplementation " io.github.pandulapeter.beagle:log-crash: $b eagleVersion "
releaseImplementation " io.github.pandulapeter.beagle:log-crash-noop: $b eagleVersion "
}
종속성이 추가 된 후 새로 소개 된 BeagleCrashLogger
객체는 메인 라이브러리에 연결되어야합니다.
Beagle .initialize(
…
behavior = Behavior (
…
bugReportingBehavior = Behavior . BugReportingBehavior (
crashLoggers = listOf ( BeagleCrashLogger ),
…
)
)
)
이 기능을 다른 충돌보고 솔루션과 동시에 사용하는 것은 신뢰할 수 없을 수 있습니다.
또한 log-crash
종속성을 도입하면 Beagle의 버그보고 활동이 별도의 프로세스에서 실행됩니다 (예 : Firebase는 다중 프로세스 앱에 대한 특별 초기화 호출이 필요합니다).
모든 공개 유물의 noop
구현은 생산 릴리스에 Beagle 관련 논리를 포함하지 않는 기본 방법입니다. 대부분의 프로젝트에 충분해야하지만 디버그 메뉴를위한 별도의 래퍼 모듈을 만들어 개선 할 수 있습니다. 이는 릴리스 빌드에서 빈 구현이있는 인터페이스 뒤에 Beagle에 대한 모든 호출을 숨기는 것을 의미합니다. 이 접근법은 고유 한 이점과 단점이 있습니다.
noop
Artifact를 사용하지 않는지 확인하십시오.Application
클래스에서 initialize()
함수를 호출하고 해당 클래스가 매니페스트에 올바르게 등록되어 있는지 확인하십시오.FragmentActivity
확장하는지 확인하십시오 (예 : AppCompatActivity
는 좋은 선택입니다). 조심하십시오. Android Studio의 Empty Compose Activity
템플릿을 사용하는 경우 기본 상위 클래스를 변경해야합니다! 기본적으로 Beagle은 현재 Activity
테마를 사용합니다. 그러나 재료 테마가 작동해야하므로 다양한 테마 속성으로 인해 충돌이 발생하지 않으면 디버그 메뉴의 테마를 자료 테마로 초기화하는 동안 제공된 모양 인스턴스의 themeResourceId
속성으로 테마를 대체하십시오.
Beagle은 모든 Activity
의 레이아웃 위에 Fragment
추가하여 작동합니다. 때때로 이것은 필요하지 않거나 불가능합니다. 라이브러리에는 제외 된 Activity
패키지 이름 목록이 제공되지만 필요한 경우 추가 필터링을 제공 할 수 있습니다. 초기화 중에 제공된 동작 인스턴스의 shouldAddDebugMenu
Lambda 속성을 사용하여 추가 필터링을 제공 할 수 있습니다.
초기화 중에 제공된 모양 인스턴스의 themeResourceId
속성에 대한 .NoActionBar
자료 테마를 설정하십시오.
모든 공개 기능은 KDOC로 문서화됩니다. Beaglecontract 파일은 모든 내장 기능에 대해 배우기위한 좋은 시작입니다. 개별 모듈에 대한 정보는 관련 클래스 헤더를 참조하십시오.
후드 아래에 관심이 있으시면이 문서는 소스 코드를 탐색하는 동안 도움이 될 수 있습니다.
모든 버전의 변경 사항은 릴리스 페이지를 확인하십시오.
라이브러리는 Semantic Versionsing을 사용합니다 : major.minor.patch는 패치 변경에 버그 수정 만 포함되어있는 경우, 사소한 변경 사항이 추가 및 주요 변경 사항이 API에 대한 수정을 소개합니다.
알려진 문제 목록과 도서관의 계획된 개선 사항은 문제 페이지를 확인하십시오.
버그를 찾거나 질문 / 기능 요청이 있으면 새 문제를 열어 주시기 바랍니다.
내 작품이 유용하고 작은 기부를 고려하고 있다면, 쇼케이스 앱의 정보 섹션에는 그렇게 할 수있는 옵션이 있습니다. 미리 감사드립니다!
Copyright 2022 Pandula Péter
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.