독서노트 프로 안드로이드 3 제2장 발췌 StrictMode 가혹 모드

6271 단어 Android
Android 2.3은 수백 개의 Android에 있는 Google 애플리케이션에 이미 혜택을 주는 엄격한 모드 (StrictMode) 라는 디버깅 기능을 제공합니다.그럼 얘는 뭐 해요?그것은 스레드와 가상 기기와 관련된 정책 위반을 보고할 것이다.정책 위반 (policy violation) 이 발견되면 경고를 받을 것입니다. 이 경고는 창고trace를 포함하여 응용 프로그램이 어디에서 위반되었는지 보여 줍니다.충돌 (crash) 대신 경고를 강제로 사용할 수도 있고, 경고만 로그에 계산해서 응용 프로그램이 계속 실행되도록 할 수도 있다.정책의 세부 사항은 아직 확인되지 않았으며, 안드로이드의 성숙한 Google에 따라 더 많은 정책이 추가될 것으로 기대할 수 있습니다.
현재 두 가지 정책을 사용할 수 있으며 첫 번째는 스레드와 관련이 있으며 주로 주 스레드(또는 UI 스레드)를 대상으로 합니다.주 스레드에서 디스크를 읽고 쓰는 것과 네트워크 접근을 하는 것은 좋지 않기 때문에, Google은 디스크와 네트워크 코드에 엄격한 모드 (Strict Mode) 갈고리 (hook) 를 추가했습니다.만약 어떤 라인에 엄격한 모드 (Strict Mode) 를 열면, 그 라인이 디스크와 네트워크에 접근할 때 경고를 받을 것입니다.경고 방식을 선택할 수 있습니다.일부 범례에는 사용자의 느린 호출(custom slow calls를 이렇게 번역해도 됩니까?)이 포함되어 있습니다.디스크 읽기와 쓰기, 네트워크 접근.경고를 LogCat에 쓰기, 대화상자 보이기, 화면 비키기, DropBox 로그 파일에 쓰기, 응용 프로그램 붕괴를 선택할 수 있습니다.가장 일반적인 방법은 LogCat에 쓰기를 하거나 애플리케이션을 충돌시키는 것입니다.목록 2-9은 스레드 정책을 위한 엄격한 모드 (StrictMode) 를 설정한 예를 보여 줍니다.
목록 2-9 엄격한 모드(StrictMode)의 스레드 정책 설정
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
    .detectDiskReads()
    .detectDiskWrites()
    .detectNetwork()
    .penaltyLog()
    .build());

Builder 클래스는 설정을 간단하게 합니다. Builder 함수 정의는 모든 정책을 Builder 대상으로 되돌려줍니다. 이 함수들은 목록 2-9처럼 연결됩니다.마지막으로build() 함수를 호출하여ThreadPolicy 대상을StrictMode 대상의 setThreadPolicy () 함수로 되돌려줍니다.setThreadPolicy () 는 정적 함수이기 때문에 StrictMode 대상을 실례화할 필요가 없습니다.내부에서 setThreadPolicy () 는 현재 스레드에 이 정책을 적용합니다.체크 함수를 지정하지 않으면 detectAll()로 대체할 수도 있습니다.penalty Log () 는 경고를 LogCat에 출력한다는 것을 표시합니다. 다른 벌칙 (penalty) 함수를 사용하거나 추가할 수도 있습니다. 예를 들어 penalty Death () 를 사용하면 StrictMode 메시지가 LogCat에 쓰이면 프로그램이 붕괴됩니다.
엄격한 모드 (StrictMode) 를 자주 열 필요가 없다. 주 활동의 onCreate () 함수에서 열 수 있고, Application 파생 클래스의 Oncreate () 함수에서 엄격한 모드 (StrictMode) 를 설정할 수도 있다.라인에서 실행되는 모든 코드는 엄격한 모드 (StrictMode) 를 설정할 수 있지만, 한 번만 설정하면 충분하다.
스레드 정책 (ThreadPolicy) 과 유사하며, 엄격한 모드 (StrictMode) 에는 가상 기기 정책 (VmPolicy) 이 있다.가상 머신 정책 (VmPolicy) 은 메모리 유출을 검사할 수 있습니다. 예를 들어 SQLite 대상을 닫기 전의 종료 작업이나 닫을 수 있는 다른 종료 작업과 유사합니다.VM 정책(VmPolicy)은 목록 2-10과 같이 유사한 Builder 클래스로 생성됩니다.스레드 정책 (ThreadPolicy) 과 달리 가상 컴퓨터 정책 (VmPolicy) 은 대화상자를 통해 경고를 제공할 수 없습니다.
목록 2-10 엄격한 모드(StrictMode)에 대한 가상 시스템 정책 설정
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
    .detectLeakedSqlLiteObjects()
    .penaltyLog()
    .penaltyDeath()
    .build());

설정이 라인에서 발생하기 때문에, 엄격한 모드 (Strict Mode) 는 심지어 한 대상에서 다른 대상으로의 제어 흐름에서 위법 사건을 찾을 수 있다.위법이 발생하면, 코드가 주 라인에서 실행되고 있음을 놀라게 될 것이며, 창고trace는 코드가 어떻게 발생하는지 발견하는 데 도움을 줄 것이다.그래서 당신은 한 걸음에 디버깅을 해서 문제를 해결하거나 코드를 자신의 백엔드 라인으로 옮기거나 원래의 처리 방식을 유지할 수 있다.이게 다 너한테 달려 있어.물론, 프로그램이 제품으로 발표될 때 사용자에게 경고 하나만으로 붕괴되는 것을 원치 않을 수도 있습니다.
엄격한 모드 (Strict Mode) 를 닫을 수 있는 두 가지 방법이 있는데, 가장 직접적인 것은 해당 코드를 제거하는 것이지만, 이렇게 하면 지속적으로 개발하는 제품에 불리하다.엄격한 모드 (Strict Mode) 코드를 호출해야 하는지 테스트하기 위해 보통 응용 프로그램 단계의 브리 변수를 정의할 수 있습니다.제품을 출시하기 전에 이 값을 FALSE로 정의합니다.더욱 우아한 방식은 디버그 모드(debug mode)의 특징을 이용하여 안드로이드 매니페스트에서xml에서 이 브리 변수를 정의합니다.필드의 속성 중 하나는android: debuggable입니다. 그 의미는 자명합니다.목록 2-11은 이 특성을 이용한 제어 방법을 제시했다.
목록 2-11 디버그 모드에서만 가혹 모드(StrictMode) 설정
4
// Return if this application is not in debug mode
ApplicationInfo appInfo = context.getApplicationInfo();
int appFlags = appInfo.flags;
if ((appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
    // Do StrictMode setup here
    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
        .detectLeakedSqlLiteObjects()
        .penaltyLog()
        .penaltyDeath()
        .build());
}
Eclipse 디버그 환경을 사용하면 ADT에서 자동으로 debuggable 속성을 설정하여 프로젝트를 관리하기 쉽도록 합니다.아날로그에 응용 프로그램을 설치하거나 장치에 직접 설치하면 debuggable 속성은TRUE이고, 응용 프로그램을 내보내서 제품 버전을 만들면 ADT는 이 속성을 FALSE로 설정합니다.이 속성 값을 따로 설정하면 ADT가 변경하지 않습니다.
엄격한 모드 (StrictMode) 는 괜찮지만, 안드로이드 2.3 이전 버전에서는 작동하지 않습니다.이 문제를 피하기 위해서, StrictMode 대상이 존재하지 않을 때 버전이 안드로이드 2.3 이상.반사 기술 (reflection) 을 이용해서, 엄격한 모드 (StrictMode) 함수가 유효 시간에 그것을 호출할 때, 반대로 호출하지 않을 수 있다.방법은 간단합니다. 목록 2-12의 코드에 따라 처리할 수 있습니다.
목록 2-12 반사 기술(reflection)을 이용하여 엄격한 모드(StrictMode) 호출
4
try {
    Class sMode = Class.forName("android.os.StrictMode");
    Method enableDefaults = sMode.getMethod("enableDefaults");
    enableDefaults.invoke(null);
}
catch(Exception e) {
    // StrictMode not supported on this device, punt
    Log.v("StrictMode", "... not supported. Skipping...");
}
엄격한 모드(StrictMode)가 존재하지 않을 경우 ClassNotFoundException 이상이 포착됩니다.enableDefault () 는 엄격한 모드 (StrictMode) 클래스의 또 다른 함수입니다. 모든 위반을 감지하고 LogCat에 기록합니다.정적 형식의 enable Default () 를 호출하기 때문에,null을 매개 변수로 전송합니다.
때때로 너는 모든 위례를 보고하기를 원하지 않는다.메인 라인 이외의 다른 라인에 엄격한 모드 (StrictMode) 를 설정하는 것이 좋습니다.예를 들어, 감시하고 있는 라인에서 디스크를 읽어야 한다.이 때, detectDiskReads () 를 호출하지 않거나, detectAll () 를 호출한 다음permitDiskReads () 를 호출합니다.유사한 허용 함수도 다른 조작에 적용된다.하지만 네가 Anroid 2.3 이전 버전에서 이런 일을 하는데 방법이 있습니까?있죠.
응용 프로그램의 가혹한 모드 (StrictMode) 가 잘못되었을 때, 접근하려고 하면 Verify Error 이상을 던집니다.클래스에 엄격한 모드 (Strict Mode) 를 봉하고 오류를 포착하면, 엄격한 모드 (Strict Mode) 가 무효일 때 무시할 수 있습니다.목록 2-13은 간단한 엄격한 모드 (Strict Mode) 봉인 클래스인 Strict Mode Wrapper를 보여 줍니다.목록 2-14는 응용 프로그램에서 이 봉인 클래스를 사용하는 방법을 보여 줍니다.
목록 2–13은 Anroid2.3 이전 릴리즈의 StrictMode 패키징 클래스
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.os.StrictMode;
public class StrictModeWrapper {
    public static void init(Context context) {
        // check if android:debuggable is set to true
        int appFlags = context.getApplicationInfo().flags;
        if ((appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectDiskReads()
                .detectDiskWrites()
                .detectNetwork()
                .penaltyLog()
                .build());
            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectLeakedSqlLiteObjects()
                .penaltyLog()
                .penaltyDeath()
                .build());
        }
    }
}

목록 2–14는 Anroid2.3 이전 릴리즈에서는 StrictMode(StrictMode) 패키징 클래스를 호출했습니다.
try {
    StrictModeWrapper.init(this);
}
catch(Throwable throwable) {
    Log.v("StrictMode", "... is not available. Punting...");
}

좋은 웹페이지 즐겨찾기