source

Android Min SDK 버전 대대상 SDK 버전

lovecheck 2023. 5. 2. 22:47
반응형

Android Min SDK 버전 대대상 SDK 버전

안드로이드용 애플리케이션 개발과 관련하여 Min과 Target SDK 버전의 차이점은 무엇입니까?최소 버전과 대상 버전이 동일하지 않으면 이클립스에서 새 프로젝트를 만들 수 없습니다!

OP가 질문에 올린 댓글(기본적으로 대상이라고 명시)SDK는 앱의 컴파일에 영향을 주지 않습니다)는 완전히 잘못된 것입니다!직설적으로 말해서 죄송합니다.

간단히 말해서, 여기 다른 목표를 선언하는 목적이 있습니다.minSDK의 SDK: 최소 수준보다 높은 수준의 SDK의 기능을 사용하고 있지만 이전 버전과의 호환성을 보장합니다.즉, 최근에 도입되었지만 응용프로그램에 중요하지 않은 기능을 사용하고 싶다고 가정해 보십시오.그런 다음 목표를 설정합니다.이 새로운 기능이 도입된 버전과 모든 사용자가 앱을 계속 사용할 수 있도록 최소 버전으로 SDK를 만듭니다.

예를 들어, 제스처 감지를 광범위하게 사용하는 앱을 작성하고 있다고 가정해 보겠습니다.그러나 제스처로 인식할 수 있는 모든 명령은 버튼이나 메뉴에서 수행할 수도 있습니다.이 경우 제스처는 '멋진 엑스트라'이지만 필수는 아닙니다.따라서 대상 sdk를 7("GestureDetection 라이브러리가 도입되었을 때 Eclair")로 설정하고 최소SDK에서 레벨 3("컵케이크")로 이동하여 정말 오래된 전화기를 가진 사람들도 당신의 앱을 사용할 수 있습니다.당신이 해야 할 일은 당신의 앱이 제스처 라이브러리를 사용하려고 시도하기 전에 그것이 실행 중인 Android 버전을 확인하는 것입니다. 만약 그것이 존재하지 않는다면 그것을 사용하려고 시도하지 않기 때문입니다. (인정하건대 이것은 아직 v1.5 전화기를 가지고 있는 사람은 거의 없지만 v1.5와 호환성을 유지하는 것이 정말 중요했던 때가 있었기 때문에 오래된 예입니다.)

다른 예를 들어, 진저브레드 또는 허니콤의 기능을 사용하려면 이 기능을 사용할 수 있습니다.일부 사람들은 곧 업데이트를 받을 것이지만, 특히 오래된 하드웨어를 사용하는 많은 사람들은 새 장치를 구입할 때까지 Eclair를 계속 사용할 수 있습니다.이를 통해 시장의 일부를 배제하지 않고 멋진 새로운 기능을 사용할 수 있습니다.

안드로이드 개발자 블로그에서 이 기능을 사용하는 방법, 특히 위에서 언급한 "기능이 존재하는지 확인하기 전에" 코드를 설계하는 방법에 대한 정말 좋은 글이 있습니다.

OP에게: 저는 당신의 질문이 오래 전에 질문되었다는 것을 깨달았기 때문에, 저는 주로 미래에 이 질문을 우연히 발견하는 사람들을 위해 이것을 썼습니다.

안드로이드:minSdkVersion

응용 프로그램을 실행하는 데 필요한 최소 API 수준을 지정하는 정수입니다.Android 시스템은 시스템의 API 수준이 이 속성에 지정된 값보다 낮을 경우 사용자가 응용 프로그램을 설치할 수 없도록 합니다.이 특성은 항상 선언해야 합니다.

안드로이드:targetSdkVersion

응용 프로그램이 대상으로 하는 API 수준을 지정하는 정수입니다.

이 특성이 설정된 경우 응용 프로그램은 이전 버전(minSdkVersion까지)에서 실행할 수 있지만 여기에 지정된 버전에서 작동하도록 명시적으로 테스트되었다고 말합니다.이 대상 버전을 지정하면 플랫폼에서 대상 버전에 필요하지 않은 호환성 설정을 사용하지 않도록 설정하거나 이전 응용 프로그램에서 사용할 수 없는 새로운 기능을 사용하도록 설정할 수 있습니다.이는 플랫폼의 다른 버전에 대해 다양한 기능을 프로그래밍할 수 있다는 의미가 아닙니다. 즉, 대상 버전에 대해 테스트했다는 사실을 플랫폼에 알리기만 하면 되며, 플랫폼은 대상 버전과의 상위 호환성을 유지하기 위해 추가 작업을 수행해서는 안 됩니다.

자세한 내용은 다음 URL을 참조하십시오.

http://developer.android.com/guide/topics/manifest/uses-sdk-element.html

TargetSdkVersion="xx"를 설정하면 API 수준 xx에서 앱이 제대로 작동하는지(예: 철저하고 성공적으로 테스트됨) 확인하는 것입니다.

xx 이상의 API 수준에서 실행되는 Android 버전은 호환성 코드를 자동으로 적용하여 xx 이전의 API 수준에서 사용할 수 있었지만 현재는 해당 Android 버전의 상위 수준에서 사용되지 않는 기능을 지원합니다.

반대로 xx 레벨 이전에 더 이상 사용되지 않게 된 기능을 사용하는 경우 호환성 코드는 더 높은 API 레벨(더 이상 이러한 기능을 포함하지 않음)의 OS 버전에서 이러한 사용을 지원하기 위해 자동으로 적용되지 않습니다.이 경우 사용자 자신의 코드에는 API 수준을 테스트하는 특수 대소문자 절이 있어야 하며, 탐지된 OS 수준이 더 이상 지정된 API 기능이 없는 상위 수준인 경우 코드는 실행 중인 OS의 API 수준에서 사용할 수 있는 대체 기능을 사용해야 합니다.

이렇게 하지 않으면 일반적으로 코드 내에서 이벤트를 트리거하는 일부 인터페이스 기능이 나타나지 않을 수 있으며, 사용자가 해당 이벤트를 트리거하고 해당 기능에 액세스하는 데 필요한 중요한 인터페이스 기능이 누락될 수 있습니다(아래 예 참조).

다른 답변에서 언급한 것처럼 처음에 minSdkVersion보다 높은 API 수준에서 정의된 일부 API 기능을 사용하고 코드가 targetSdkVersion보다 낮은 수준에서 이러한 기능이 없는 것을 감지하고 처리할 수 있도록 조치를 취했다면 targetSdkVersion을 minSdkVersion보다 높게 설정할 수 있습니다.

개발자들에게 기능을 사용하는 데 필요한 최소 API 수준을 특별히 테스트하도록 경고하기 위해 컴파일러는 minSdkVersion보다 최신 API 수준에서 정의된 메서드에 대한 호출이 코드에 포함된 경우 오류(경고뿐 아니라)를 발행합니다.targetSdkVersion이 해당 메서드를 처음 사용할 수 있게 된 API 수준 이상인 경우에도 마찬가지입니다.이 오류를 제거하려면 컴파일러 지시문

@TargetApi(nn)

컴파일러는 적어도 해당 API 수준을 갖는 것에 의존하는 메서드를 호출하기 전에 적어도 nn의 API 수준을 테스트하기 위해 해당 지침의 범위 내에 있는 코드가 작성되었음을 알려줍니다.예를 들어, 다음 코드는 minSdkVersion이 11 미만이고 targetSdkVersion이 11 이상인 앱 내의 코드에서 호출할 수 있는 메서드를 정의합니다.

@TargetApi(11)
    public void refreshActionBarIfApi11OrHigher() {
      //If the API is 11 or higher, set up the actionBar and display it
      if(Build.VERSION.SDK_INT >= 11) {
        //ActionBar only exists at API level 11 or higher
        ActionBar actionBar = getActionBar();

        //This should cause onPrepareOptionsMenu() to be called.
        // In versions of the API prior to 11, this only occurred when the user pressed 
        // the dedicated menu button, but at level 11 and above, the action bar is 
        // typically displayed continuously and so you will need to call this
        // each time the options on your menu change.
        invalidateOptionsMenu();

        //Show the bar
        actionBar.show();
    }
}

minSdkVersion보다 높은 API 수준의 기능을 사용하지 않더라도 해당 상위 수준에서 테스트한 후 모든 작업이 제대로 수행된 경우 더 높은 대상 SdkVersion을 선언할 수도 있습니다.테스트를 통해 이러한 적응이 필요하지 않음을 확인했을 것이므로, 이는 대상 수준에서 최소 수준으로 조정하기 위한 호환성 코드에 액세스하는 데 따른 오버헤드를 방지하기 위한 것입니다.

선언된 targetSdkVersion에 의존하는 UI 기능의 예로는 API 11 이상에서 실행되는 targetSdkVersion이 11 미만인 앱의 상태 표시줄에 나타나는 3개의 수직 점 메뉴 버튼이 있습니다.앱의 대상 SdkVersion이 10 이하인 경우 앱의 인터페이스가 전용 메뉴 버튼의 존재에 따라 달라지는 것으로 간주되므로 3-도트 버튼이 이전 전용 하드웨어 및/또는 해당 버튼의 화면 버전(예:OS가 더 높은 API 수준을 가지고 있어 장치의 전용 메뉴 버튼을 더 이상 가정하지 않는 경우.그러나 앱의 TargetSdkVersion을 11 이상으로 설정한 경우, 전용 메뉴 버튼(예: Action Bar)을 대체하는 해당 수준에서 도입된 기능을 이용했거나, 시스템 메뉴 버튼이 있어야 하는 필요성을 우회한 것으로 가정됩니다.세 개의 점으로 구성된 메뉴 "호환성 버튼"이 사라집니다.이 경우 사용자가 메뉴 단추를 찾을 수 없으면 해당 단추를 누를 수 없으며, 이는 사용자의 작업이 옵션 메뉴 만들기(메뉴) 재정의가 호출되지 않을 수 있음을 의미하며, 이는 앱 기능의 상당 부분이 사용자 인터페이스를 잃게 될 수 있음을 의미합니다.물론 사용자가 이러한 기능에 액세스할 수 있도록 수행 표시줄이나 다른 방법을 구현한 경우는 제외됩니다.

반면 minSdkVersion은 앱을 실행하기 위해 장치의 OS 버전에 최소한 해당 API 수준이 있어야 한다는 요구 사항을 명시합니다.이는 Google Play 앱 스토어(및 다른 앱 스토어)에 있을 때 앱을 보고 다운로드할 수 있는 장치에 영향을 미칩니다.이는 앱이 해당 수준에서 설정된 OS(API 또는 기타) 기능에 의존하며 이러한 기능의 부재를 처리할 수 있는 허용 가능한 방법이 없다는 것을 나타내는 방법입니다.

minSdkVersion을 사용하여 API와 관련되지 않은 기능이 있는지 확인하는 예로는 JIT 지원 버전의 Dalvik 인터프리터에서만 앱이 실행되도록 minSdkVersion을 8로 설정하는 것이 있습니다(JIT가 API 레벨 8에서 Android 인터프리터에 도입되었으므로).JIT 지원 인터프리터의 성능은 해당 기능이 없는 인터프리터의 성능의 최대 5배에 이를 수 있기 때문에 앱에서 프로세서를 많이 사용하는 경우 적절한 성능을 보장하기 위해 API 레벨 8 이상이 필요할 수 있습니다.

개념은 항상 예시와 함께 더 잘 전달될 수 있습니다.안드로이드 개발자 사이트 및 관련 스택 오버플로 스레드의 모든 문서를 읽고도 안드로이드 프레임워크 소스 코드를 파고들어 몇 가지 실험을 하기 전까지는 이러한 개념을 이해하는 데 어려움을 겪었습니다.이러한 개념을 완전히 이해하는 데 큰 도움이 된 두 가지 예를 공유하겠습니다.

DatePickerDialog는 AndroidManifest.xml 파일의 대상에 입력한 수준에 따라 다르게 나타납니다.SDK 버전(<uses-sdk android:targetSdkVersion="INTEGER_VALUE"/>) 값을 10 이하로 설정하면 DatePickerDialog가 왼쪽처럼 보입니다.반면에 값을 11 이상으로 설정하면 DatePickerDialog는 코드가 동일한 오른쪽처럼 보입니다.

DatePicker대상이 있는 대화상자 보기 DatePicker대상이 있는 대화상자 보기

제가 이 샘플을 만들 때 사용한 코드는 매우 간단합니다. MainActivity.java표시:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onClickButton(View v) {
        DatePickerDialog d = new DatePickerDialog(this, null, 2014, 5, 4);
        d.show();       
    }
}

그리고.activity_main.xml표시:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="onClickButton"
    android:text="Button" />
</RelativeLayout>


바로 그겁니다.이것이 제가 이것을 테스트하기 위해 필요한 모든 코드입니다.

그리고 이러한 외관의 변화는 안드로이드 프레임워크 소스 코드를 볼 때 매우 분명합니다.다음과 같습니다.

public DatePickerDialog(Context context,
    OnDateSetListener callBack,
    int year,
    int monthOfYear,
    int dayOfMonth,
    boolean yearOptional) {
        this(context, context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB
                ? com.android.internal.R.style.Theme_Holo_Light_Dialog_Alert
                : com.android.internal.R.style.Theme_Dialog_Alert,
        callBack, year, monthOfYear, dayOfMonth, yearOptional);
}

처럼 프레임워크는 현재 .SDK 버전과 다른 테마를 설정합니다.의 코드스니펫 (종이스펫니코드류의런(▁this펫(이▁snipp▁kind스et)getApplicationInfo().targetSdkVersion >= SOME_VERSION)는 Android 프레임워크 곳곳에서 확인할 수 있습니다.

또 다른 예는 WebView 클래스에 대한 것입니다.웹view 클래스의 공개 메서드는 메인 스레드에서 호출되어야 하며, 그렇지 않으면 런타임 시스템이 다음을 던집니다.RuntimeException목표를 설정할 때SDK 버전 18 이상. 동작은 소스 코드와 함께 명확하게 전달될 수 있습니다.그냥 그렇게 쓰여 있어요.

sEnforceThreadChecking = context.getApplicationInfo().targetSdkVersion >=
            Build.VERSION_CODES.JELLY_BEAN_MR2;

if (sEnforceThreadChecking) {
    throw new RuntimeException(throwable);
}


안드로이드 문서는 "안드로이드가 각각의 새로운 버전과 함께 진화함에 따라, 일부 행동과 심지어 외모도 바뀔 수 있습니다."라고 말합니다.그래서 우리는 행동과 외모의 변화, 그리고 그 변화가 어떻게 이루어지는지를 살펴보았습니다.

요약하면, Android 문서는 "이 속성(targetSdkVersion)은 대상 버전에 대해 테스트했음을 시스템알리며 시스템대상 버전과 앱의 상위 호환성을 유지하기 위해 호환성 동작활성화해서는 됩니다."라고 말합니다.이것은 WebView 사례에서 매우 명확합니다.비메인 스레드에서 WebView 클래스의 공개 메서드를 호출하기 위해 JELLY_BEAN_MR2가 출시되기 전까지는 괜찮았습니다.Android 프레임워크가 런타임을 던진다면 말도 안 됩니다.JELLY_BEAN_MR2 장치에서는 예외입니다.치명적인 결과를 초래하는 새로 도입된 행동을 자신의 이익을 위해 가능하게 해서는 안 됩니다.그래서 우리가 해야 할 일은 특정 대상에 대해 모든 것이 괜찮은지 확인하는 것입니다.SDK 버전.우리는 더 높은 목표를 설정함으로써 외모 향상과 같은 이점을 얻습니다.SDK 버전이지만 책임이 따릅니다.

편집: 고지 사항.현재 대상을 기준으로 다른 테마를 설정하는 DatePickerDialog 생성자SDK 버전(위에서 보여드린 것)은 나중에 커밋할 때 실제로 변경되었습니다.그럼에도 불구하고 저는 그 예를 사용했습니다. 왜냐하면 논리는 변경되지 않았고, 그 코드 스니펫은 목표를 분명히 보여주기 때문입니다.SDK 버전 개념입니다.

요약을 원하시는 분들은

android:minSdkVersion

응용 프로그램이 지원할 때까지 최소 버전입니다.단말기에 안드로이드 버전이 낮은 경우 앱이 설치되지 않습니다.

하는 동안에,

android:targetSdkVersion

응용 프로그램이 실행되도록 설계된 API 수준입니다.즉, 이 API까지 테스트했기 때문에 전화기의 시스템에서 상위 호환성을 유지하기 위해 호환성 동작을 사용할 필요가 없습니다.

은 주어진 보다 더 입니다.targetSdkVersion하지만 안드로이드 호환성 행동이 시작될 것입니다.

무료 -

android:maxSdkVersion

장치의 API 버전이 더 높으면 앱이 설치되지 않습니다.즉, 앱 설치를 허용할 때까지의 최대 API입니다.

즉, MinSDK - 4, maxSDK - 8, targetSDK - 8 내 앱은 최소 1.6에서 작동하지만 2.2 장치에 설치된 경우 볼 수 있는 2.2에서만 지원되는 기능도 사용했습니다.또한 maxSDK - 8의 경우 이 앱은 API > 8을 사용하는 전화기에 설치되지 않습니다.

이 답변을 작성할 당시 안드로이드 문서는 설명을 제대로 하지 못했습니다.이제 그것은 매우 잘 설명되어 있습니다.여기서 확인

다음과 같은 컴파일 오류가 발생하는 경우:

<uses-sdk
            android:minSdkVersion="10"
            android:targetSdkVersion="15" />

.

private void methodThatRequiresAPI11() {
        BitmapFactory.Options options = new BitmapFactory.Options();
                options.inPreferredConfig = Config.ARGB_8888;  // API Level 1          
                options.inSampleSize = 8;    // API Level 1
                options.inBitmap = bitmap;   // **API Level 11**
        //...
    }

컴파일 오류가 발생합니다.

필드에 필요한 API 레벨 11(현재 최소값은 10): Android.graphics.비트맵 팩토리$옵션#inBitmap

Tools로 매우 주석이 .@TargetApi이것을 매우 쉽게 고칠 수 있습니다.문제가 있는 선언을 포함하는 메소드 앞에 추가합니다.

@TargetApi
private void methodThatRequiresAPI11() {            
  BitmapFactory.Options options = new BitmapFactory.Options();
      options.inPreferredConfig = Config.ARGB_8888;  // API Level 1          
      options.inSampleSize = 8;    // API Level 1

      // This will avoid exception NoSuchFieldError (or NoSuchMethodError) at runtime. 
      if (Integer.valueOf(android.os.Build.VERSION.SDK) >= android.os.Build.VERSION_CODES.HONEYCOMB) {
        options.inBitmap = bitmap;   // **API Level 11**
            //...
      }
    }

지금 컴파일 오류 없음 그리고 그것은 달릴 것입니다!

편집: 이로 인해 API 레벨이 11보다 낮은 경우 런타임 오류가 발생합니다.11 이상에서는 문제 없이 실행됩니다.따라서 버전 검사로 보호되는 실행 경로에서 이 메서드를 호출해야 합니다.TargetApi는 컴파일만 허용하지만 위험을 감수하고 실행합니다.

android:minSdkVersion그리고.android:targetSdkVersion둘 다 Android 매니페스트 파일에서 선언해야 하는 정수 값이지만 둘 다 다른 속성을 가지고 있습니다.

android:minSdkVersion: 이것은 안드로이드 앱을 실행하는 데 필요한 최소한의 API 수준입니다.하위 API 버전에 동일한 앱을 설치할 경우 파서 오류가 발생하고 애플리케이션이 지원되지 않는 문제가 발생합니다.

android:targetSdkVersion: Target sdk 버전은 앱의 Target API 레벨을 설정하는 것입니다. 이 속성이 매니페스트에 선언되지 않으면 minSdk 버전이 TargetSdk 버전이 됩니다.이것은 항상 "우리가 TargetSdk Version으로 선언한 모든 상위 버전의 API에 대한 설치를 지원한다"는 것이 사실입니다.앱 제한 대상을 만들려면 매니페스트 파일에 maxSdkVersion을 선언해야 합니다.

위험권한필요한 앱을 만들고 대상을 설정하는 경우SDK에서 23 또는 그 이상은 주의해야 합니다.런타임에 사용 권한을 확인하지 않으면 보안이 표시됩니다.예외적으로, 예를 들어 카메라를 여는 등 시도 블록 내에서 코드를 사용하는 경우 logcat을 확인하지 않으면 오류를 감지하기 어려울 수 있습니다.

Target sdk는 대상으로 지정할 버전이고 min sdk는 최소 버전입니다.

언급URL : https://stackoverflow.com/questions/4568267/android-min-sdk-version-vs-target-sdk-version

반응형