1 분 빠 른 포 지 셔 닝 Android 시작 시간 문제
Tencent Matrix 는 기본적으로 애플 리 케 이 션 콜 드 가동 의 시간 소모 방법 을 측정 할 수 없 으 며,본 고 는 Matrix 를 어떻게 개조 하여 콜 드 가동 시간 소모 방법 을 측정 하 는 지 소개 했다.1 분 이면 앱 시동 걸 수 있 게 해 줄 게.
1.Tencent Matrix 접속
1.1 프로젝트 루트 디 렉 터 리 에 있 는 gradle.properties 에서 의존 할 Matrix 버 전 번 호 를 설정 합 니 다.예 를 들 어:
MATRIX_VERSION=1.0.0
1.2 프로젝트 루트 디 렉 터 리 에 있 는 build.gradle 파일 에 Matrix 의존 도 를 추가 합 니 다.예 를 들 어:
dependencies {
classpath ("com.tencent.matrix:matrix-gradle-plugin:${MATRIX_VERSION}") { changing = true }
}
1.3 app/build.gradle 파일 에 Matrix 각 모듈 의 의존 도 를 추가 합 니 다.예 를 들 어:
dependencies {
implementation group: "com.tencent.matrix", name: "matrix-android-lib", version: MATRIX_VERSION, changing: true
implementation group: "com.tencent.matrix", name: "matrix-android-commons", version: MATRIX_VERSION, changing: true
implementation group: "com.tencent.matrix", name: "matrix-trace-canary", version: MATRIX_VERSION, changing: true
implementation group: "com.tencent.matrix", name: "matrix-resource-canary-android", version: MATRIX_VERSION, changing: true
implementation group: "com.tencent.matrix", name: "matrix-resource-canary-common", version: MATRIX_VERSION, changing: true
implementation group: "com.tencent.matrix", name: "matrix-io-canary", version: MATRIX_VERSION, changing: true
implementation group: "com.tencent.matrix", name: "matrix-sqlite-lint-android-sdk", version: MATRIX_VERSION, changing: true
implementation group: "com.tencent.matrix", name: "matrix-battery-canary", version: MATRIX_VERSION, changing: true
implementation group: "com.tencent.matrix", name: "matrix-hooks", version: MATRIX_VERSION, changing: true
}
apply plugin: 'com.tencent.matrix-plugin'
matrix {
trace {
enable = true //if you don't want to use trace canary, set false
baseMethodMapFile = "${project.buildDir}/matrix_output/Debug.methodmap"
blackListFile = "${project.projectDir}/matrixTrace/blackMethodList.txt"
}
}
1.4 PluginListener 를 실현 하고 Matrix 처리 후의 데 이 터 를 받 습 니 다.예 를 들 어:
class MatrixListener(context: Context?) : DefaultPluginListener(context) {
companion object {
const val TAG: String = "Matrix.TestPluginListener"
}
override fun onReportIssue(issue: Issue) {
super.onReportIssue(issue)
MatrixLog.e(TAG, issue.toString())
}
}
1.5 동적 설정 인 터 페 이 스 를 실현 하고 Matrix 내부 파 라 메 터 를 수정 할 수 있 습 니 다.sample-android 에서 저 희 는 간단 한 동적 인터페이스 인 스 턴 스 DynamicConfigImplDemo.java 가 있 습 니 다.그 중에서 매개 변수 에 대응 하 는 key 는 파일 MatrixEnum 에 있 습 니 다.발췌 부분 은 다음 과 같 습 니 다.
class MatrixConfig : IDynamicConfig {
val isFPSEnable: Boolean
get() = true
val isTraceEnable: Boolean
get() = true
val isMatrixEnable: Boolean
get() = true
override fun get(key: String, defStr: String): String {
// for Activity leak detect
if (ExptEnum.clicfg_matrix_resource_detect_interval_millis.name == key || ExptEnum.clicfg_matrix_resource_detect_interval_millis_bg.name == key) {
Log.d(
"DynamicConfig",
"Matrix.ActivityRefWatcher: clicfg_matrix_resource_detect_interval_millis 10s"
)
return TimeUnit.SECONDS.toMillis(5).toString()
}
if (ExptEnum.clicfg_matrix_resource_max_detect_times.name == key) {
Log.d(
"DynamicConfig",
"Matrix.ActivityRefWatcher: clicfg_matrix_resource_max_detect_times 5"
)
return 3.toString()
}
return defStr
}
override fun get(key: String, defInt: Int): Int {
//TODO here return default value which is inside sdk, you can change it as you wish. matrix-sdk-key in class MatrixEnum.
if (MatrixEnum.clicfg_matrix_resource_max_detect_times.name == key) {
MatrixLog.i(TAG, "key:$key, before change:$defInt, after change, value:2")
return 2 //new value
}
if (MatrixEnum.clicfg_matrix_trace_fps_report_threshold.name == key) {
return 10000
}
if (MatrixEnum.clicfg_matrix_trace_fps_time_slice.name == key) {
return 12000
}
if (ExptEnum.clicfg_matrix_trace_app_start_up_threshold.name == key) {
return 3000
}
return if (ExptEnum.clicfg_matrix_trace_evil_method_threshold.name == key) {
200
} else defInt
}
override fun get(key: String, defLong: Long): Long {
//TODO here return default value which is inside sdk, you can change it as you wish. matrix-sdk-key in class MatrixEnum.
if (MatrixEnum.clicfg_matrix_trace_fps_report_threshold.name == key) {
return 10000L
}
if (MatrixEnum.clicfg_matrix_resource_detect_interval_millis.name == key) {
MatrixLog.i(TAG, "$key, before change:$defLong, after change, value:2000")
return 2000
}
return defLong
}
override fun get(key: String, defBool: Boolean): Boolean {
//TODO here return default value which is inside sdk, you can change it as you wish. matrix-sdk-key in class MatrixEnum.
return defBool
}
override fun get(key: String, defFloat: Float): Float {
//TODO here return default value which is inside sdk, you can change it as you wish. matrix-sdk-key in class MatrixEnum.
return defFloat
}
companion object {
private const val TAG = "Matrix.DynamicConfigImplDemo"
}
}
1.6 프로그램 이 시작 하 는 위 치 를 선택 하여 Matrix 를 초기 화 합 니 다.예 를 들 어 Application 의 계승 클래스 에서 Init 핵심 논 리 는 다음 과 같 습 니 다.
Matrix.Builder builder = new Matrix.Builder(application); // build matrix
builder.patchListener(new TestPluginListener(this)); // add general pluginListener
DynamicConfigImplDemo dynamicConfig = new DynamicConfigImplDemo(); // dynamic config
// init plugin
IOCanaryPlugin ioCanaryPlugin = new IOCanaryPlugin(new IOConfig.Builder()
.dynamicConfig(dynamicConfig)
.build());
//add to matrix
builder.plugin(ioCanaryPlugin);
//init matrix
Matrix.init(builder.build());
// start plugin
ioCanaryPlugin.start();
2.응용 프로그램 하위 클래스 개조2.1 아 날로 그 애플 리 케 이 션 카드
private fun A() {
B()
H()
L()
SystemClock.sleep(800)
}
private fun B() {
C()
G()
SystemClock.sleep(200)
}
private fun C() {
D()
E()
F()
SystemClock.sleep(100)
}
private fun D() {
SystemClock.sleep(20)
}
private fun E() {
SystemClock.sleep(20)
}
private fun F() {
SystemClock.sleep(20)
}
private fun G() {
SystemClock.sleep(20)
}
private fun H() {
SystemClock.sleep(20)
I()
J()
K()
}
private fun I() {
SystemClock.sleep(20)
}
private fun J() {
SystemClock.sleep(6)
}
private fun K() {
SystemClock.sleep(10)
}
private fun L() {
SystemClock.sleep(10000)
}
2.2 응용 프로그램.onCreate()호출 카드 방법
override fun onCreate() {
A()
}
2.3 Activity Thread 의 mHandler 반사
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
println("zijiexiaozhan MyApp attachBaseContext")
time1 = SystemClock.uptimeMillis()
time3 = System.currentTimeMillis()
try {
val forName = Class.forName("android.app.ActivityThread")
val field = forName.getDeclaredField("sCurrentActivityThread")
field.isAccessible = true
val activityThreadValue = field[forName]
val mH = forName.getDeclaredField("mH")
mH.isAccessible = true
val handler = mH[activityThreadValue]
mHandler = handler as Handler
} catch (e: Exception) {
}
}
2.4 원래 의 onCreate 방법 을 익명 내부 클래스 로 호출 합 니 다.
inner class ApplicationTask : Runnable {
override fun run() {
A()
}
}
2.5 재 작성 애플 리 케 이 션 onCreate 방법
override fun onCreate() {
super.onCreate()
//
mHandler.postAtFrontOfQueue(ApplicationTask())
}
3.실행,빠 른 위치 추적3.1 키워드"TraceEvilMethod"로그 찾기
tag[Trace_EvilMethod]type[0];key[null];content[{"machine":"MIDDLE","cpu_app":0,"mem":3822452736,"mem_free":1164132,"detail":"NORMAL","cost":1344,"usage":"0.37%","scene":"default","stack":"0,1048574,1,13441,5471,1,13382,17582,1,13383,17558,1,13384,17560,1,3795,17562,1,1606,17563,1,176,17566,1,206,17568,1,205,17569,1,204,17573,1,565,17575,1,215,17576,1,55,17578,1,104,17580,1,102","stackKey":"17558|","tag":"Trace_EvilMethod","process":"com.peter.viewgrouptutorial","time":1624837969986}]
3.2 분석 로그 인쇄 카드 스 택
android.os.Handler dispatchMessage 1344
.com.peter.viewgrouptutorial.MyApp$ApplicationTask run 1338
..com.peter.viewgrouptutorial.MyApp access$A 1338
...com.peter.viewgrouptutorial.MyApp A 1338
....com.peter.viewgrouptutorial.MyApp B 379
.....com.peter.viewgrouptutorial.MyApp C 160
......com.peter.viewgrouptutorial.MyApp D 17
......com.peter.viewgrouptutorial.MyApp E 20
......com.peter.viewgrouptutorial.MyApp F 20
.....com.peter.viewgrouptutorial.MyApp G 20
....com.peter.viewgrouptutorial.MyApp H 56
.....com.peter.viewgrouptutorial.MyApp I 21
.....com.peter.viewgrouptutorial.MyApp J 5
.....com.peter.viewgrouptutorial.MyApp K 10
....com.peter.viewgrouptutorial.MyApp L 102
총결산
빠 른 포 지 셔 닝 안 드 로 이 드 시작 에 걸 리 는 시간 문제 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 포 지 셔 닝 안 드 로 이 드 시작 에 걸 리 는 시간 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.