Android2015. 4. 15. 16:50



  • 객체 생성을 피하라. 객체를 생성하는 작업은 다른 작업들에 비해 로드가 많이 걸리는 작업이며 가비지컬렉션대상이 많아지는것도 성능에 장애요소이다.
  • Native method를 활용하라. 자바코드보다 동일작업시 10~100배 빠르다. 따라서 복잡하고 오래걸리는 연산작업은 native method를 사용하라.
  • 인터페이스 타입참조보다 클래스타입참조를 더 선호하라. 임베디드환경에서는 인터페이스타입참조를 통해 virtual method를 호출하는것이 본래 객체에 대한 class type을 참조하는것보다 2배 느리다.

Map m = new HashMap();  // 인터페이스로 참조하여 참조연산이 더 일어남

HashMap m = new HashMap();  // 명시적으로 참조하므로 추가연산발생안함

  • 가상연결보다 정적연결을 선호하라. 객체필드에 접근할 필요가 없다면 메소드를 static으로 하면 더 빠르다. 가상메서드테이블에 접근하지 않기 때문.
  • 내부에서 getter/setter의 사용은 피하라.
  • 필드참조들을 캐시하라. 멤버변수에 접근하는것이 지역변수에 접근하는것보다 훨씬 속도가 느림. 메소드내에서 멤버젼수에 접근을 많이 하는 경우 로컬변수로 가져와서 처리하면 개이득
  • 상수를 final로 선언하라. static 멤버변수가 초기값을 가지고 있고 값이 변경될 필요가 없다면 final키워드를 사용하면 값을 참조할때 field lookup을 사용하지 않으므로 더 빠르다.
  • Enhanced for loop를 사용하라. for(type n : array) {} 형식의 구문을 말하며 iterator를 사용하는것 보다 일반적으로 빠르다.
  • Enum자료형을 피하라. 코드가독성이나 잘못값을 할당하는 경우를 컴파일시 에러가 발생함으로써 매우 편리하나 코드 크기와 속도면에서는 손해다. 코드사이즈의 크기도 성능에 악영향을 미친다.
  • 내부클래스를 갖는 클래스의 경우 멤버변수를 private대신에 package 접근자를 사용하는것이 좋다. private으로 하면 내부적으로 컴파일러가 접근메서드를 생성하여 해당 메서드를 통해서 접근하기 때문에 접근시마다 함수호출이 발생하여 성능에 영향을 미친다. 

  • Float을 피하라. 일부 모바일 단말의 경우 부동소수점 연산의 지원이 미비할 수 있다.
  • 안드로이드에서 제공하는 개선된 성능의 데이터구조

LruCache

SparseArray

SparseBooleanArray

SparseIntArray

Pair

  • 메인스레드에서 많은 작업을 하지 않아야 한다.

키/터치 이벤트 처리

뷰그리기

라이브사이클 관리

  • 레이아웃 단순 화 및 지연초기화 이용
  • LinearLayout보다는 RelativeLayout이 더 단순한 처리를 하게 됨.
  • ViewStub를 사용해서 객체생성을 지연시킨다.
  • onCreate, onResume등 lifecycle관련 메소드에서는 최소한의 작업만 수행해야 ANR을 피할 수 있으며 사용자의 성능에 대한 민감도를 피해갈 수 있다. 100ms~200ms가 사용지연에 대한 임계치라는 조사가 있다.
  • StrictMode 활용

앱플리케이션 개발동안 StrictMode를 사용함으로써 느려지거나 느려질 가능성이 큰 코드를 검출할 수 있다.

Policy와 penaly를 랩에서 코드레벨로 설정하여 사용가능하다. Policy는 정책을 penalty는 위반시 표시방법을 나타낸다.

Policy는 ThreadPolicy와 VmPolicy 두가지를 설정할 수 있다.

ThreadPolicy: 특정 스레드에 file, network 접근 부분을 감지하여 위반되는 위치를 잡아준다.

VmPolicy : Memory leak의 위치를 감지해 Log, Dialog, DropBox, Splash, 강제종료와 같은 다양한 방식으로 알린다.

ThreadPolicy

detectNetwork() : 네트워크 사용

detectDiskRead() : disk read

detectDiskWrite() : disk write

detectAll() : all

detectCustomSlowCell() : api11이수 StrictMode.noteSlowCall()가 선언된 부분을 감지함.

VmPolicy

detectActiveLeaks() : Activity 서브클래스의 릭감지

detectLeakedClosableObjects(): File/Network IO관련 API사용시 close를 명시적으로 호출안하고 종료할 경우 나오는 리소스 leak감지

setClassInstanceLimit() : 특정클래스가 힘에 생성되는 최대 개 수를 설정하여 object leak현상을 모니터링 할 수 있다.

Panalty

penaltyLog() : logcat으로 표시

panaltyDropBox() : DropBoxManagerService에 로그가 저장되며 정보가 detail하여 추천된다. adb shell dumpsys dropbox data_app_strict_mode —print > strict.txt 로 추출 후 꺼내서 별것을 추천한다.

panaltyDialog() : dialog창으로 표시

penaltyFlashScreen() : 화면상으로 빨간색 테두리의 사각형 splash로 보여준다.

penaltyDeathOnNetwork() : Main스레드에서 network access가 진행되면 무조건 어플리케이션이 강제종료된다. detectNetwork()가 활성화되어 있어야 한다.

Posted by 삼스