* 성능이 저하되면
    > 전자상거래 매출 감소
    > 페이지뷰 감소
    > 사용자 만족도 감소


* 앱 성능이 저하되면
    > 앱을 제거하거나
    > 다른 앱을 찾거나
    > 사용빈도가 감소


* 배터리, 전류 소모 줄이기
    > wakelock(), alarm 사용 주의
    > 불필요한 background 데이터 전송 줄이기
    > 꼭 필요한 경우에는 Job Scheduler API 사용


* Battery Historian
      > https://developer.android.com/studio/profile/battery-historian


* Job Scheduler API
    > 주기적으로 서비스를 실행하고 네트워크 연결 보장
    > Wifi 와 같은 무료 데이터망에서 작업을 수행하도록 지정
    > 기기가 대기모드 일때만 동작하도록 지정
    > 기기가 충전중일 때만 작업을 수행
    > 작업이 처리가 안되는 경우에 접속을 시도하는 시간 간격을 점차 증가


* Display 종류에 따른 전류소모
    > LCD 는 색상별로 동일
    > LED 는 흰색은 전류소모가 많으며, 흑색은 전류소모가 적다


* UI 소요 시간에 따른 사용자가 느끼는 반응
    > 0 ~ 100ms : 빠르다
    > 100 ~ 300ms : 약간 느리다
    > 300 ~ 1000ms : 매우 느리다


* Jank (쟁크)
    > Frame 누락으로 인한 화면의 부드럽지 않은 움직임


* Jitter (지터)
    > 원하는 신호와 실제로 발생하는 신호간에 발생하는 불안정한 신호의 차이


* OS 버전별 Rendering
    > ~ Gingerbread : CPU 로 그림
    > Honeycomb~ : GPU 렌더링 기능 추가 (HW 가속)
    > Ice Cream Sandwich ~ : GPU HW 가속 기능이 default
    > Jellybean ~ : Jank 와 Jitter 문제 개선을 위해 VSYNC 를 사용해 프레임 생성 스케줄링 타이밍을 개선


* VSYNC
    > 각 프레임의 생성 속도와 실제 화면의 갱신 속도를 동기화하기 위해 필요한 신호체계


* View 가 그려지는 과정


* Profile GPU Rendering
    
adb shell dumpsys gfxinfo [pkg name]
        > 프레임이 화면에 표시되는데 걸리는 시간 측정 로그 파일


* 인지 성능 증가를 위해
    
> 로딩 시간을 숨기는 애니메이션 적용
    > A/B 테스트 이용


* 공유 메모리
    
> 모든 프로세스에 균등하게 1/n 으로 나눠서 적용


* 전용 메모리
    
> 특정 앱 내부에서 사용되고 다른 앱에서는 사용할 수 없는 영역


* Zygote Process
    
> 안드로이드 내부의 Framework 클래스, 리소스, Native Library 를 미리 로딩해서 가지고 있는 프로세스
    > 앱이 시작되면 앱의 개별코드 로딩 전에 Zygote Process 를 복제


* Dirty Memory
    
> 데이터가 RAM 영역에만 저장되어 있음. RAM 에서 제거되면 데이터를 다시 얻기 위해서 앱이 재실행 되어야 함


* Clean Memory
    
> RAM 에 올라와 있는 데이터가 이미 디스크에도 동일하게 저장되어 있는 상태
    > clean memory 가 제거된 후에 다시 기기로부터 그대로 읽기만 하면 되는 영역


* ART Runtime
    
> 가장 큰 특징은 설치할 때 앱이 컴파일 된다는 것이다 (AOT : Ahead Of Time)
    > 앱 코드가 모두 설치 시점에 컴파일 되어 디스크에 저장 (Clean 영역)
        - 디스크로부터 복구가 쉽기 때문에 메모리가 부족할 때 쉽게 제거됨
        - ART 이후로 메모리 내에 로딩된 앱의 코드를 클린 메모리로 판단하기 때문에 ART 에서 메모리 관리가 더욱 향상됨


* Dalvik Runtime
    > 앱이 구동되는 사이마다 자주 실행되는 부분만을 컴파일하는 (JIT : Just In Time) 방식을 사용


* Garbage Collector
    > ~ Gingerbread
        : "Stop the wrold" 방식
        : GC 가 이루어지는 동안 모든 프로세스와 스레드가 동작을 멈춤 (최소 25ms 이상 걸림)
    > Gingerbread ~
        : 부분적인 정리를 수행하는 Concurrent GC 가 도입
        : 앱을 멈추는 대신에 앱과 동시에 구동
        : GC 가 시작하고 끝날 때 짧게 5ms 정도만 멈춤
    > ~ Kitkat
        : "Mark and sweep" 방식
    > Lollipop ~
        : ART 가 이용되면서 GC 시간이 10 -> 3ms 로 빨라짐
        : 앱이 FG 에 표시되지 않을 때, "Semi-Space GC" 알고리즘 수행
            - 메모리 내 Object 재배열
            - 미사용 메모리에 연속된 큰 영역을 만들어주기 매우 유용한 방법
    > '2016~
        : 압축 GC 사용됨
        : 새로운 메모리 영역으로 복사하는 것 대신 현재있던 메모리 위치를 유지시키면서도 파편화 없앰

* GC 수행 조건
    > 앱에서 메모리 용량이 더 필요할 때
    > 새로운 뷰가 생기거나 기존 객체들이 무효화 될 때
                                

* ActivityManager.getMemoryClass()
    > 앱이 가질 수 있는 최대 Heap 크기

* android:largeHeap="true"
    > 좀 더 큰 힙 사용 가능, But, GC 도 오래 걸림

* App 이 Foreground 에 있을 때
    > adb shell dumpsys meminfo [PID]
        : PSS (Proportional Set Size)
            - 앱에서 사용하는 총 메모리 양
        : Persistent
            - UI, NFC, 전화 기능과 같이 기기가 구동되는 동안 항상 실행되어야 하는 프로세스 목록
        : Visible/Perceptible
            - 화면에 표시되거나 오버레이로 표시되는 앱들
        : A, B services, Cached
            - Background 로 내려가 있지만 Mem을 할당받은 앱들


* 프로세스 통계

adb dumpsys procstats [pkg path]


* Leak Canary 툴 이용
    > 메모리 누수

* CPU 사용량 측정
    > adb shell top -n 1 -m 10 -d 1
        - 명령 1번 실행 / 사용률 기준 상위 10개 앱 / 1초 동안 측정
    > adb shell dumpsys cpuinfo
    > systrace

* Wifi
    > 높은 대역폭 + 낮은 지연시간 + 데이터량에 따른 비용 없음

* 무선통신망
    > 신호세기 낮음
        - 전력 많이 사용
    > 신호세기 높음
        - 전력 조금 사용

* 무선통신망은 일반적으로 연결 시, 통신망 연결을 유지하는 방식 때문에 Wifi 에 비해 더 많은 전력 사용

* 무선연결 vs 데이터 연결
    > 데이터 연결은 무선 연결을 통해서 이루어지고, 무선 연결이 먼저이루어져야 연결 가능

* 네트워크 분석도구
    > Wireshark
    > Fiddler
    > MITMProxy
    > ARO

* 최종 사용자 모니터링 툴 사용
    . RUM (Real User Monitoring)


* 안드로이드를 위한 네트워크 최적화
    1. 파일 최적화
        > 요청횟수 줄이기
        > 요청의 크기 줄이기
            - Gzip 사용해 압축하기
    2. 텍스트파일 축소
        > Gzip 수행 전에 공백, 탭, 주석 등 제거
    3. 이미지
        > 화면 크기에 맞는 이미지 사용
        > 메타 데이터 삭제
        > 이미지 압축
    4. 파일 캐싱
        > HttpResponseCache
    5. 접속 줄이기
    6. GCM Network Manager 이요
        > 배터리를 효율적으로 사용하여 네트워크 접속 스케줄링 가능한 라이브러리
    7. Https 사용
    8. 네트워크 속도에 따라 네트웤킹 알고리즘 적용
        > e.g.) Wifi vs LTE
    9. 지연시간이 긴 경우, 데이터 미리 다운로드 등의 방법 적용

+ Recent posts