본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] Strict Mode 에 대해 알아보자.

by 돼지왕 왕돼지 2013. 7. 17.
반응형


 안드로이드, Strict Mode 에 대해 알아보자.

 


[android] Strict Mode 에 대해 알아보자.


참조 : http://dev.kthcorp.com/2012/01/31/android-strict-mode-howto/


Strict Mode 가 뭐야?


* Main Thread 에서 사용성을 떨어뜨리는 작업들( 대표적으로 IO )을 하지 않도록 개발자에게 Log, 강제 종료, dropbox, dialog, splash 등의 방법으로 알려주는 API 이다.


* GingerBread 부터 소개되었다.


* IO 작업 중에서도 file, network access 는 특히 위험하다. 그 이유는 android file system ( YAFFS, Yet Another Flash File System ) 의 경우 한 process 가 해당 파일에 접속하면, 다른 process 가 접근하지 못하도록 lock 이 걸려버린다. 따라서 여러 process 가 동시에 한 파일에 접근한다면 대기시간은 엄청나게 길어질 수 있다. Network 의 경우 예측 불가능한 환경이 너무 빈번하게 일어나기 때문에 매우 위험하며, ICS 부터는 Network와 File 작업을 Main thread 에서 하게 되면 무조건 Exception 을 던지도록(강제종료) 기본 설정되어있다.




어떻게 사용하는지 Code 로 보여달라.


<Strict Mode Activate 시키기>

public static final boolean SUPPORT_STRICT_MODE = Build.VERSION_CODES.FROYO < Build.VERSION.SDK_INT;


@Override

public void onCreate(Bundle savedInstanceState) {

    boolean debaggable = (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;

    if (SUPPORT_STRICT_MODE && debaggable) {

        StrictMode.ThreadPolicy.Builder builder = new StrictMode.ThreadPolicy.Builder();

        builder.detectCustomSlowCalls(); // api level 11

        builder.detectNetwork();

        builder.detectDiskReads();

        builder.detectDiskWrites();

        builder.detectNetwork();


        builder.penaltyLog();

        builder.penaltyDropBox();

        builder.penaltyDialog();

        builder.penaltyDeath();

        builder.penaltyDeathOnNetwork(); // api level 11, detectNetwork() has to be called in advance.

        builder.penaltyFlashScreen(); // api level 11, red rectangle will be shown around the window.


        StrictMode.setThreadPolicy(builder.build());

       

 StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()

                .detectLeakedSqlLiteObjects()

                .detectActivityLeaks() // api level 11

                .detectLeakedClosableObjects() // api level 11

                .setClassInstanceLimit( SingleTon.class, 1 ) // api level 11

                .penaltyLog()

                .penaltyDeath()

                .penaltyDropBox()

                .build());

    }

    super.onCreate(savedInstanceState);

}







<간단한 코드>

if (SUPPORT_STRICT_MODE && debaggable) {

    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()

            .detectAll()

            .penaltyLog()

            .build());

    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()

            .detectAll()

            .penaltyLog()

            .build());


// 또는!!


if (SUPPORT_STRICT_MODE && debaggable) {

     StrictMode.enableDefaults();

}




가장 좋은 시험 방법을 알려줘!


panaltyDropBox() 의 경우 다음 명령어를 통해 txt 파일로 뽑아낼 수 있고, 정보가 가장 detail 하게 나오는 로그의 종류이다.


adb shell dumpsys dropbox data_app_strictmode –print > strict.txt


Strict Mode 를 Thread 와 VM 의 detectAll() 선언하고, penaltyDropBox() 를 output 으로 세팅한 후, Monkey Test 를 돌리면 어느 정도 확실한 테스트가 될 것으로 보인다.



반응형

댓글