programing

Android에서 개발 모드 및 릴리스 모드 환경 설정 구별

goodcopy 2021. 1. 14. 23:14
반응형

Android에서 개발 모드 및 릴리스 모드 환경 설정 구별


저는 Android 애플리케이션을 구축 중이며 개발 모드인지 릴리스 모드인지에 따라 조정할 수있는 몇 가지 환경 변수를 유지하고 싶습니다. 예를 들어 웹 서비스를 호출해야하는데 두 모드에서 URL이 약간 다릅니다. 이 설정 및 기타 설정을 외부화하여 대상 배포에 따라 쉽게 변경할 수 있도록하고 싶습니다.

이러한 요구를 지원하기위한 모범 사례 나 SDK에 어떤 것이 있습니까?


이 stackoverflow 게시물 에 따르면 SDK 도구 버전 17 (이 글을 쓰는 시점에서 19에 있음) BuildConfig.DEBUG에서 개발 빌드를 빌드 할 때 참인 상수를 추가합니다 .


다음 솔루션은 매니페스트 파일에서 android:debuggable=true개발 중 및 android:debuggable=false애플리케이션 출시를 위해 항상 설정했다고 가정합니다 .

이제 ApplicationInfo.FLAG_DEBUGGABLE에서 ApplicationInfo얻은 플래그를 확인하여 코드에서이 속성의 값을 확인할 수 있습니다 PackageManager.

다음 코드 스 니펫이 도움이 될 수 있습니다.

PackageInfo packageInfo = ... // get package info for your context
int flags = packageInfo.applicationInfo.flags; 
if ((flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
    // development mode
} else {
    // release mode
}

@ viktor-bresan 유용한 솔루션에 감사드립니다. 현재 애플리케이션의 컨텍스트를 검색하는 일반적인 방법을 포함하여 완전히 작동하는 예제로 만들면 더 유용 할 것입니다. 아래 내용은 다음과 같습니다.

PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);

Android build.gradle에는 디버그 및 릴리스 환경 처리가 잘 있습니다.

build.gradle파일에 다음 코드 스 니펫 추가

buildTypes {
    debug {
        buildConfigField "Boolean", "IS_DEBUG_MODE", 'true'
    }

    release {
        buildConfigField "Boolean", "IS_DEBUG_MODE", 'false'
    }
}

이제 아래와 같이 변수에 액세스 할 수 있습니다.

    if (BuildConfig.IS_DEBUG_MODE) { {
        //Debug mode.
    } else {
        //Release mode
    }

isDebuggerConnected를 확인합니다 .


아래 코드와 같은 것은 어떻습니까?

public void onCreate Bundle b ) {
   super.onCreate(savedInstanceState);
   if ( signedWithDebugKey(this,this.getClass()) ) {
     blah blah blah
   }

  blah 
    blah 
      blah

}

static final String DEBUGKEY = 
      "get the debug key from logcat after calling the function below once from the emulator";    


public static boolean signedWithDebugKey(Context context, Class<?> cls) 
{
    boolean result = false;
    try {
        ComponentName comp = new ComponentName(context, cls);
        PackageInfo pinfo = context.getPackageManager().getPackageInfo(comp.getPackageName(),PackageManager.GET_SIGNATURES);
        Signature sigs[] = pinfo.signatures;
        for ( int i = 0; i < sigs.length;i++)
        Log.d(TAG,sigs[i].toCharsString());
        if (DEBUGKEY.equals(sigs[0].toCharsString())) {
            result = true;
            Log.d(TAG,"package has been signed with the debug key");
        } else {
            Log.d(TAG,"package signed with a key other than the debug key");
        }

    } catch (android.content.pm.PackageManager.NameNotFoundException e) {
        return false;
    }

    return result;

} 

나는 오늘 우연히 정말 간단 해 보이는 또 다른 접근 방식을 발견했습니다 .. Build.TAGS를보세요. 앱이 개발 용으로 생성 될 때 이것은 String "test-keys"로 평가됩니다.

문자열 비교보다 훨씬 쉬워지지 않습니다.

또한 Build.MODEL 및 Build.PRODUCT는 에뮬레이터에서 "google_sdk"문자열로 평가됩니다!


내가 사용하는 방법은 다음과 같습니다.

http://whereblogger.klaki.net/2009/10/choosing-android-maps-api-key-at-run.html

디버그 로깅과지도 API 키를 전환하는 데 사용합니다.

참조 URL : https://stackoverflow.com/questions/1743683/distinguishing-development-mode-and-release-mode-environment-settings-on-android

반응형