안드로이드 최적화의 고품질 개발의 붕괴

나는 그것을 유용하게 찾을 수 있다면 오랜 시간 동안 인터뷰 주제를 수행, 오늘에게 최적화의 붕괴 측면에 대한 기사를 수집 도움이되지 않은 인터뷰를 종료하고 협력의 작은 아이디어가 필요 모르는, 컬렉션 인터뷰, 후속는 계속 업데이트됩니다 포인트 추종자

머리말

APP 개발자는 충돌 (다시 플래시) 무엇을 할 수 발생? 많은 사람들이 예외를 catch 다시 코드 플래시를 발견, 그있어서, 기록 할 말을, "소화"모든 자바 붕괴를 잃었다. 프로그램이 다른 이상이 여부에 관해서는, 그 하나님이 튜브를 원하는 것입니다. 예, 긴급 상황이 방법은 해결책으로 간주하지만, 진실이 무엇인지 다시 플래시? 여부 그것의 근본 원인을 해결?

우선, 붕괴

충돌 속도는 애플리케이션의 품질 수준의 기본 지표, 다음, 어떻게 객관적으로이 인덱스의 붕괴를 측정하고, 우리는 어떻게 안정성과 충돌 관련 봐야한다.

안드로이드이 충돌 :

  • 자바 충돌
  • 기본 충돌

간단히 말해서, 자바의 붕괴는 캐치되지 않는 예외가 예기치 않게 종료 할 수있는 프로그램을 원인이있다, 자바 코드입니다. 이 네이티브 코드에서 잘못된 주소 접속이 일반적이기 때문에 기본 충돌, 그것은 주소 문제가 정렬 될 수있다, 또는 프로그램 이니셔티브는 해당 신호 신호가 예기치 않게 종료하도록 프로그램을 원인이되는, 중단 일어났다.

1.1 수집 충돌

비정상적인 절차를 표시 "축소"우리가 캡처하는 방법과 제품의 붕괴는 과정이 예외가 비교적 큰 관계가있다. 많은 중소기업의 경우, 일부 타사 서비스를 선택할 수 있습니다. 현재 다양한 플랫폼도 등 연합의 알리 친구, 텐센트 Bugly, NetEase는 구름 캐치, 구글의 중포 기지 등을 포함하여 번성. 활용하여 이해하기!

1.2 ANR

충돌 속도는 그것의 응용 프로그램의 안정성 완전히 동등 할 수 없습니다? 대답은 분명하지 않다. 충돌을 처리, 우리는 종종 ANR이 문제에 (응용 프로그램이 응답하지 않거나 응답하지)가 발생합니다.

시스템 대화 상자는 매우 사용하기 참을 사용자의 작업을 방해 나타납니다 때 ANR이 발생합니다.

ANR 방법 :
FileObserver 변경 사항을 /data/anr/traces.txt 모니터 사용. 불행하게도, ROM의 많은 높은 버전은 파일 사용 권한을 읽을 수있다. 당신은 단지 다른 경로에 대해 생각 할 수있는이 시간, 당신은 구글이 해외 Play 서비스 사용할 수 있으며, 국내 마이크로 채널 HC 프레임 워크 앤드류스 구현 시스템에 독립적 인 통신 프레임 워크의 집합입니다 (Hardcoder 프레임 워크를 사용, 그것은 실시간 애플리케이션 ROM 공급 업체와 "대화"를 할 수 있습니다 목표는 완전히 속도와 품질 응용 프로그램을 개선하기 위해 스케줄링 시스템 자원, 효과적으로 모든 사람의 휴대 전화 경험을 향상) 공급 업체에 더 많은 권한을 획득하는 것입니다. 또한 전화 ROOT를 할 수있는 다음 traces.txt 파일을 얻을.

1.3 응용 프로그램 종료

자주 충돌뿐만 아니라, 일부의 경우 응용 프로그램이 예를 들어, 예기치 않게 종료 원인이 있습니다 :

  • 이니셔티브의 자살. Process.killProcess (), 종료 () 등
  • 충돌이 발생합니다. 또는 Java 기본 충돌의 출현
  • 시스템이 다시 시작됩니다. 비정상적인 시스템, 정전, 사용자가 자동으로 다시 시작 등등, 우리는 응용 프로그램 시작 시간 이하의 이전 기록 값보다 실행 비교할 수 있습니다
  • 시스템에 의해 사망. 메모리 부족 킬러 사망 등의 작업 관리자 시스템에서 교차
  • ANR

응용 프로그램이 시작할 때 우리는 주도권 자살 또는 갱신 플래그의 붕괴 이후, 휴가 동작 확인이 때문에 다음 시작하는 동안 발생 통해 여부를 확인 할 수있을 것입니다, 플래그를 설정할 수 있습니다. 이론적으로,이 예외 트래핑 메커니즘이 100 %까지이며, 위의 다섯 명 배출 시나리오에 해당하는, 우리는 자살을 배제하고 남은 3 비정상 종료를 모니터링하는 기대 (단독 사고 통계를) 두 시나리오를 충돌 주도권을 쥐고 범위.

이 비정상 종료를 검출함으로써, ANR, 낮은 메모리 킬러, 죽일 강력한 시스템, 충돌, 정전으로 반영 할 수있는 등의 문제가 정상으로 캡처 할 수 없습니다. 물론 사용자가 작업 관리자 시스템에서 응용 프로그램을 넘어 같은 오탐 (false positive)의 일부 비정상적인 속도가있을 것입니다. 대형 데이터 라인의 경우는 여전히 우리가 코드의 일부 숨겨진 문제를 발견 할 수 있습니다.

이전과 국가의 신청 후 대만에 따르면, 우리가 예기치 않게 정면으로 나누어 종료 예기치 않게 종료하고 다시 비정상적으로 종료 할 수 있습니다. "시스템에 의해 사망"주요 원인 비정상 종료가 무대 물론, 우리는 비정상적인 상황 ANR, 등등 OOM과와 큰 관련이있을 것이다 비정상 종료 프론트 데스크에 대한 더 많은 관심을 것입니다.

거래의 둘째, 붕괴

어려운 다양한 문제가 발생합니다 우리의 일상 업무는, "붕괴"문제의 일반적인 종류의 하나입니다. 문제는 사건을 해결하기 위해 필요 해결에 더 많은 경험을, 우리는 준의 숙련, 빨리 위치를 분석 할 수 있습니다. 물론, "범죄 현장"에 대한 같은, 또한 루틴이 많이있다 우리는 어떤 정보에주의를 지불해야합니까? 어떻게 더 "증인"과 "단서"를 찾는 방법은? 어떤 일반적인 과정을 "사건을 조사"합니까? "의 경우"다른 유형의 설문 조사 방법은 무엇을 사용해야했다?

믿고 "진실은 항상 것은 단지"충돌이 끔찍한하지 않습니다.

2.1 충돌 사이트

충돌 사이트는 우리의 "첫 장면은"이 많은 귀중한 단서를 보유하고있다. 이제 당신은 더 많은 정보로 추가 분석을 위해 더 명확한 방향을 활용할 수보다는 추측에 의존 할 수 있습니다.

크래시 정보

의 충돌에 대한 기본 정보, 우리는 충돌의 예비 판단을 할 수 있습니다. 프로세스 이름, 스레드 이름. 프로세스의 붕괴는 충돌이 UI 스레드의 장소가 아니다, 전경 프로세스 또는 백그라운드 프로세스입니다.

스택 및 유형의 붕괴. 축소 자바 붕괴, 기본 충돌이나 ANR의 일부입니다, 그것은 관심의 충돌 지점의 서로 다른 유형의 동일하지 않습니다. 특히 바람직 스택, 스택을 축소 내부의 특정 시스템 충돌의 코드 또는 APP 코드를 참조하십시오.

키워드 : FATAL
 FATAL EXCEPTION: main
 Process: com.cchip.csmart, PID: 27456
 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(int)' on a null object reference
    at com.cchip.alicsmart.activity.SplashActivity$1.handleMessage(SplashActivity.java:67)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:179)
    at android.app.ActivityThread.main(ActivityThread.java:5672)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674)
시스템 정보

정보 시스템은 때로는 몇 가지 중요한 단서로, 문제를 해결하기 위해 우리에게 매우 큰 도움이있다.

로그 캣. 이것은 실행 로그 응용 프로그램, 시스템이 포함되어 있습니다. 시스템 권한 문제 때문에, 로그 캣은 현재 APP에 관한 정보를 포함 할 수 있습니다 인수했다. 이벤트를 기록합니다 시스템에서 파일 / 시스템 / 등 / 이벤트 로그 태그에 기록 된 몇 가지 기본적인 APP 실행, 로그 캣 것을 특징으로한다.

//system logcat:
10-25 17:13:47.788 21430 21430 D dalvikvm: Trying to load lib ... 

//event logcat:
10-25 17:13:47.788 21430 21430 I am_on_resume_called: 生命周期
10-25 17:13:47.788 21430 21430 I am_low_memory: 系统内存不足
10-25 17:13:47.788 21430 21430 I am_destroy_activity: 销毁 Activty
10-25 17:13:47.888 21430 21430 I am_anr: ANR 以及原因
10-25 17:13:47.888 21430 21430 I am_kill: APP 被杀以及原因

모델, 시스템, 제조 업체, CPU, ABI, 리눅스 버전. 치수 수십만큼을 수집함으로써, 일반적인 문제를 찾아 도움이 될 것이다.

메모리 정보

OOM, ANR은 가상 메모리가 소진되는 등, 메모리와 관련된 충돌의 많은 직접 관련이 있습니다. 사용자의 휴대 전화 메모리는 두 영역 "보다 더 2기가바이트" "2기가바이트 이하"과로 구분되어있는 경우, 당신은 붕괴의 사용자 비율 "2GB 이상"사용자가 여러 번이다 "이하 2기가바이트"를 찾을 수 있습니다.

나머지 시스템 메모리. 시스템 메모리의 상태에 대한, 당신은 / 직접 meminfo 파일 파일 / proc 디렉토리를 읽을 수 있습니다. 시스템의 사용 가능한 메모리 (의 10 % 미만 MemTotal), OOM, GC 많은 수의 매우 작은 경우, 시스템 자살을 끌어와 다른 문제는 자주 매우 경향이 있습니다.

응용 프로그램은 메모리를 사용합니다. 자바 메모리, RSS (상주 세트 크기), PSS (비례 세트 크기)를 포함하여, 우리는 응용 프로그램 자체 메모리의 크기와 분포를 차지하고 그 결론을 내릴 수있다. PSS와에 의해 RSS / proc 디렉토리 / 자기 / SMAP 계산, 예를 들어, 그래서 그래서 더 자세한 분류 통계 APK, 덱스을 할 수 있습니다.

가상 메모리. 가상 메모리는 / proc 디렉토리 / 자기 / 사용 가능 상태, 당신은 / proc 디렉토리 / 자기 / 맵 파일을 통해 특정 분포를 얻을 수 있습니다. 때때로 우리는 일반적으로 tgkill, 가상 메모리,하지만 많은 유사한 OOM에 작은 관심을 지불하고 다른 문제는 가상 메모리로 인해 발생합니다.

Name:     com.xmamiga.name   // 进程名
FDSize:   800               // 当前进程申请的文件句柄个数
VmPeak:   3004628 kB        // 当前进程的虚拟内存峰值大小
VmSize:   2997032 kB        // 当前进程的虚拟内存大小
Threads:  600               // 当前进程包含的线程个数

일반적으로 32 비트 프로세스의 경우, 응용 프로그램 오류의 문제가 발생할 수 있습니다 32 비트 CPU, 메모리 3GB의 가상 메모리 경우입니다. 64 비트 CPU 경우, 가상 메모리는 일반적으로 3 ~ 4기가바이트 사이이다. 우리는 64 비트 프로세스를 지원하는 경우 물론, 가상 메모리는 문제가되지 않습니다. 최대 확산이 오래 걸립니다, 방출을 구별 Google Play에서 지원이 90 % 이상으로되어 있지만, 64 비트,이 나라에서 64 비트 디바이스를 지원해야 년 8 월 2019 필요하지만 가게는 CPU 아키텍처의 유형을 지원하지 않습니다.

자원 정보

때때로 당신은 응용 프로그램 힙 메모리와 디바이스 메모리가 매우 적합 발견 할 것이다, 또는 메모리 할당 실패는 비교적 큰 관계로 자원을 누설 수있는, 발생합니다.

핸들 FD 파일. 파일에 대한 제한이 / proc 디렉토리 / 자기 / 사용할 수 제한에 의해 처리, 파일 핸들의 최대 수는 일반적으로 1024 단일 프로세스를 열 수 있습니다. 그러나 파일 경우하는 처리 800 개 이상의 더 위험하다, 우리는 출력에 기록 또는 스레드 누수가있는 경우 로그, 추가 조사에 해당하는 모든 FD 및 파일 이름이 필요합니다.

opened files count 812:
0 -> /dev/null
1 -> /dev/log/main4 
2 -> /dev/binder
3 -> /data/data/com.xmamiga.sample/files/test.config
...

스레드 수입니다. 스레드 크기의 현재 수는 상기 상태 파일에 의해 얻을 수 있고, 스레드가 2메가바이트 가상 메모리를 차지하고 있고, 가상 메모리는 너무 많은 스레드를 가질 것이며, 파일이 압력을 처리한다. 내 경험에 의하면 400 개 이상의 스레드 수는 더 위험하다합니다. 스레드와 관련된 문제가있는 경우 모든 당신은, 로그에 출력하고 해당 스레드 ID 스레드 이름으로 추가 조사가 필요합니다.

 threads count 412:
 1820 com.xmamiga.crashsdk
 1844 ReferenceQueueD
 1869 FinalizerDaemon
 ...

JNI. JNI를 사용하는 경우는 실패 인용, 인용 약간의 충돌 폭발을 나열하는 경향에, 그렇지 않은 경우주의를 기울이십시오.

응용 프로그램 정보

시스템뿐만 아니라, 사실, 우리의 응용 프로그램은 더 나은 자신을 알고, 당신은 관련 정보를 많이 남길 수 있습니다. 충돌 장면. 사업에서 발생한 활동이나 조각에 발생한 충돌, RBI의 개발 과정에 대한 자세한 로그에서 다른 키 작동 경로, 우리는 충돌이 우리에게 상대적으로 큰 도움이 될 것입니다 재현 중요한 사용자의 조작 경로를 기록 할 수 있습니다. 다른 사용자 정보를 제공합니다. 관심의 다른 응용 프로그램에 초점이 동일하지 않을 수 있습니다.

2.2 크래시 분석

당신이 사이트에 너무 많은 정보가 있으면, 당신은의 진짜 "감지"투어를 시작할 수 있습니다. 한 노력을 지출 기꺼이은 "사건"의 대부분은 진실을 지속 할 수있다. 인내와주의 깊은 분석을 통해 두려워 문제,하지 말라, 항상 예리한 일부 비정상적이거나 중요한 점을 발견, 심지어 의심과 검증 감히합니다.

첫 번째 단계 : 설정의 우선 순위

중요한 정보를 찾기 위해 로그를 통해 최종에 초점 거짓말을 식별 및 분석, 문제는 일반적인 판단을해야합니다. 일반적으로,이 단계에서 설정의 우선 순위는 다음과 같은 점에 초점을 맞출 수 있습니다 좋습니다.

  • 심각도를 확인합니다. 해결 그것은 또한 비용 효율적인, 우리의 우선 순위 톱 충돌에 따라 또는 주요 기능의 붕괴로 사업에 큰 영향을 가지고 충돌. 코너의 붕괴를 해결하기 위해 며칠 낭비하지 마십시오, 삭제 다음 버전의 기능을 넣을 수 있습니다.
  • 기본 정보의 붕괴. 되고 설명 충돌 형의 이상 판정은, 판정이 실질적으로 붕괴있다.
    이 단계는 이미 결론을 내릴 수있다 후에 일반적으로 대부분 단순히 축소합니다.

자바 붕괴. 같은 NullPointerException이 같은 더 확실한 충돌, 자바 유형이 널 포인터, OutOfMemoryError가 자원의 부족, 이번에는 "메모리 정보"및 "정보 자원"로그를 볼 수 더 이동해야합니다.

기본 충돌. 우리는 신호, 코드, 오류 요지 및 기타 콘텐츠뿐만 아니라 충돌 자바 스택의 시간을 준수해야합니다. 각 신호의 의미에 대해, 당신은 충돌 신호 소개를 볼 수 있습니다. 일반적인 SIGSEGV 및 SIGABRT이며, 전자는 주로 일반적 때문에 ANR 후자, 잘못된 포인터 기인하여 널 포인터이고) (중단 결과로서 종료 호출한다.

ANR. 잠금 대기 때문에 원인인지 여부, 메인 쓰레드의 스택을 살펴보십시오. ANR은, CPU, GC, 시스템 서버 및 기타 정보를 iowait가 로그에 다음 추가, 또는 때문에 붙어에 GC 리드의 많은 수의 I / O 문제, 또는 CPU 경쟁 문제를 결정하기 위해보십시오.

단계 : 일반적인 찾기

위의 방법은 여전히 ​​문제를 효과적으로 찾을 수없는 경우, 우리는 아무런 공통점이 없다 붕괴의이 종류를 찾기 위해 시도 할 수 있습니다. 공통점을 찾아 차이는 또한, 더 멀리 문제에서 찾을 수 있습니다.

모델, 시스템, ROM은, 공급 업체, 정보 시스템 등의 일반적인 문제와 같은 중합 차원으로 사용할 수 있습니다 수집 ABI는 86 전화에서,이 모델은 안드로이드 8.0에서뿐만 아니라,뿐만 아니라 삼성뿐만 아니라있다 시스템. 어플리케이션 정보는 또한, 동영상 등, 재생 국가, 지역 및 열려 링크 인 것으로 중합 치수로 사용될 수있다.

공통의 발견 다음 반복되는 문제에 대한보다 명확한 가이드 라인을 가질 수 있습니다.

세 번째 단계 : 복제 시도

우리는 이미 충돌의 이유에 대해 알고 있다면, 더 자세한 정보를 확인하기 위해, 우리는 사고를 재현 해 봅니다해야합니다. 우리는 충돌뿐만 아니라 사용자의 조작 경로를 재현하려고 시도하고 충돌의 원인을 분석하기 위해 갈 단서가 없다합니다.

"언제 까지나 지역 재생으로, 내가 할 수있는 솔루션",이 테스트 단어와 개발의 많은 믿습니다. 우리가 로그를 늘리거나 추가 분석을 위해 악기 나 도구의 디버거 GDB와 다른 종류를 사용하는 데 사용할 수있는 위 주로하기 때문에 안정적인 재생 경로의 이러한 자신감을 가지고.

우리는 훌륭한 문제의 다양한 발생할 수 있습니다. 예를 들어, 제조업체가 기본이되는 구현을 변경, 새로운 안드로이드 시스템 구현이 변경 될 수 있습니다, 우리는 때때로 제조업체의 설명서를 브러시 ROM 또는 ROM을 끌어 갈 필요가, Google에 가서 소스 코드를 설정해야합니다. 우리는 외로움을 감내해야하는 많은 어려운 문제, 반복 투기, 회색 머리 반복적으로 검증을 반복했다. -하지만이 문제는 심각한 절차 적 문제를 살펴 보는 것입니다하지 페니 현명하고 파운드 - 어리석은.

2.3 시스템 충돌

시스템이 자주 충돌 우리가 매우 무력한 느낌, 그것은 버그의 안드로이드 버전이 될 수는 제조업체가 이어질 수정 된 ROM 될 수있다. 스택은 완전히이 경우 우리 자신의 코드를 축소 할 수 있습니다, 직접 문제를 찾을 수 어렵습니다. 할 수 있습니다 :

  • 가능한 원인하십시오. 위의 일반적인 분류를 통해, 우리는 일부 벤더 고유의 ROM에 시스템 문제의 버전, 또는 문제를보십시오. 충돌 로그,하지만 경로와 로그를 운영하여 우리 자신의 코드가되지 않을 수 있지만, 당신은 어떤 의심의 포인트를 찾을 수 있습니다.

  • 피하십시오. 부적절한 API의 사용 여부를 다른 구현하지 않도록 대체 할 수 있다면, 의심스러운 코드 호출을 볼 수 있습니다.

  • 후크가 해결. 여기 자바 후크 및 기본 훅으로 구분된다. 그것은 단지이 예외를 사는 직접 캐치의 관행을 참조하여 시스템에 안드로이드 7.0, 안드로이드 8.0 나타날 수 있습니다.
    이러한 경우 모두를 할 경우, 위의 대부분을 해결하거나 붕괴를 방지 할 수 있어야한다, 시스템의 대부분은뿐만 아니라 충돌합니다. 물론, 항상 사용자의 실제 환경에 의존 할 몇 가지 어려운 문제가있다, 이들은 추적 할 수있는 능력을 가지고 유사한 동적 디버깅 할 필요가있다.

셋째, 요약

공격과 방어의 붕괴는 우리는 가능한 한 빨리, 그것이 봉오리 단계에 물려됩니다 충돌을 방지, 긴 과정이다. 문제의 일부를 은폐하도록 강요하는 경우 기술자, 우리는 맹목적으로 이들의 수의 붕괴를 추구하지 말아야 사용자 경험 첫째, 더 많은 비생산적 경향이 있습니다. 우리는 프로세스가 뒤에 실행되고 있는지 확인하기 위해, 붕괴의 원인의 본질을 이해하고, 실제 문제, 처음부터 소스를 숨기려고 캐치를 자유롭게 사용하지 않아야합니다. 붕괴를 해결뿐만 아니라, 표면에 지점을하는 과정에서,이 충돌은 해결하지만, 충돌 및 예방의이 유형을 해결하는 방법을 고려해야 할뿐만 아니라위한.

추천

출처www.cnblogs.com/Androidmm/p/11357900.html