독서노트 프로 안드로이드 3 제2장 발췌 StrictMode 가혹 모드
6271 단어 Android
현재 두 가지 정책을 사용할 수 있으며 첫 번째는 스레드와 관련이 있으며 주로 주 스레드(또는 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...");
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.