Android Min SDKバージョンとターゲットSDKバージョン


442

Android用のアプリケーションの開発に関して、MinとTarget SDKのバージョンの違いは何ですか?Eclipseでは、最小バージョンとターゲットバージョンが同じでない限り、新しいプロジェクトを作成できません。


1
私が読んでいることから、ターゲットSDKのバージョンは、アプリケーションのコンパイル方法に影響を与えないようです。アプリケーションが実行されていることをデバイスに伝えるためだけにあり、アプリケーションを適切に動作させるために特別な互換性機能を有効にする必要はありません。これは正しいですか?コンパイルして多くのテストを実行しないと、ターゲットSDKのバージョンがわからないように思えます。コンパイラがコードを見て、アプリケーションがそれ自体と互換性のあるプラットフォームを見つけられないのはなぜですか?
マイケルノベロ

5
上記のコメンターは、targetSDK機能を使用する理由を誤解しています。詳細については、以下の私の回答を参照してください。
スティーブヘイリー

157
受け入れられた答えは正しくありません。スティーブH.による回答をお読みください
tylerl

3
@tylerlしかし、それは不正確ではなく、Google Androidのドキュメントを参照しています。何も追加していません。
Vikas Patidar 2013

3
カールの答えは私の意見では最も詳細で正確です。
Ilya Kogan

回答:


136

android:minSdkVersion

アプリケーションの実行に必要な最小APIレベルを指定する整数。Androidシステムは、システムのAPIレベルがこの属性で指定された値よりも低い場合、ユーザーがアプリケーションをインストールできないようにします。この属性は常に宣言する必要があります。

android:targetSdkVersion

アプリケーションが対象としているAPIレベルを指定する整数。

この属性を設定すると、アプリケーションは古いバージョン(minSdkVersionまで)で実行できると言いますが、ここで指定したバージョンで動作するように明示的にテストされました。このターゲットバージョンを指定すると、ターゲットバージョンに必要のない互換性設定をプラットフォームで無効にしたり(そうでない場合、上位互換性を維持するためにオンにしたりできます)、古いアプリケーションでは利用できない新しい機能を有効にしたりできます。これは、プラットフォームのバージョンごとに異なる機能をプログラムできることを意味するものではありません。ターゲットバージョンに対してテストしたことをプラットフォームに通知するだけであり、プラットフォームはターゲットバージョンとの上位互換性を維持するために余分な作業を実行してはなりません。

詳細については、次のURLを参照してください。

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


一般的に、両方を同じものに設定します。それらを異なる値に設定するのは、おそらく異常な状況です。
jjb 2010

66
jjbのコメントについて:同意しません。minSDKとtargetSDKが異なる可能性がある理由はたくさんあります。詳細については、私の回答を参照してください。
スティーブヘイリー

871

OPが質問に投稿したコメント(基本的にはtargetSDKがアプリのコンパイルに影響しないことを示す)は完全に間違っています!率直に申し訳ありません。

つまり、minSDKから別のtargetSDKを宣言する目的は次のとおりです。つまり、最小レベルよりも高いレベルのSDKの機能を使用していますが、後方互換性確保しています。言い換えれば、最近導入されたばかりの機能を使用したいが、それがアプリケーションにとって重要ではないことを想像してみてください。次に、targetSDKを、この新機能が導入されたバージョンに設定し、最小値を低く設定して、誰もが引き続きアプリを使用できるようにします。

例として、ジェスチャー検出を多用するアプリを書いているとしましょう。ただし、ジェスチャーで認識できるすべてのコマンドは、ボタンまたはメニューから実行することもできます。この場合、ジェスチャーは「クールな追加機能」ですが、必須ではありません。したがって、ターゲットsdkを7(GestureDetectionライブラリが導入されたときは「Eclair」)に設定し、minimumSDKをレベル3(「Cupcake」)に設定して、本当に古い電話を持っている人でもアプリを使用できるようにします。必要なことは、ジェスチャーライブラリを使用する前に、アプリが実行されていたAndroidのバージョンを確認して、存在しない場合に使用しないようにすることだけです。(確かにこれは古いバージョンの例です。ほとんどの人がまだv1.5電話を持っているためですが、v1との互換性を維持する時期がありました。

別の例として、ジンジャーブレッドまたはハニカムの機能を使用したい場合にこれを使用できます。一部の人はすぐにアップデートを入手しますが、他の多くの人、特に古いハードウェアを使用している人は、新しいデバイスを購入するまでEclairに行き詰まっている可能性があります。これにより、クールな新機能の一部を使用できるようになりますが、可能な市場の一部を除外することはありません。

この機能の使用方法、特に上記の「使用前に機能が存在するかどうかを確認する」コードの設計方法については、Android開発者のブログからの非常に優れた記事があります。

OPに:私は、あなたの質問がずっと前に尋ねられたことに気付いたので、主にこれを将来この質問に偶然遭遇した人のために書いた。


2
targetSDKversionがアプリのコンパイルにどのように影響するかを正確に説明してください。コンパイルバージョンもまた、セットアップする必要がある別の構成だからです。よろしくお願いします
hnviet 2011

9
Steveは、マニフェストxml属性android:targetSdkVersion(本当の意味はありません)と、コードのコンパイル対象を表すproject.propertiesファイルにあるターゲットプロパティとを混同していると思います。もう一度言いますが、xml attr targetSdkVersionには本当の意味はありません!!!
AlikElzin-kilaka

3
@kilakaコメントの半分は有効ですが、残りの半分は単に間違っています。私は誰かがXMLとproject.properties(Eclipseで右クリック->プロパティからもアクセス可能)で同じ値を使用することを想定していたため、それらが異なる場所に格納されていることを指摘するのは正しいことです。ただし、Androidマーケットでは、xml属性のtargetSdkVersionにどの値を設定するかが最も重要です。たとえば、Honeycomb以上のアプリケーションにActionBarと互換性メニューのどちらが必要かを決定するときに、それを使用します。
スティーブヘイリー

2
@ネイトこの「複雑なコード」がランタイムをどれほど遅くするかは言えませんが、複数のAPKを分割して使用することはコードの複雑さの点で悪いと思います。これで、各エクスポートを行う前に、コメントアウト/コメントアウトするか、ソース管理の複数のブランチをマージすることを忘れないでください。彼らは昨年10月のAndroidカンファレンスで、マルチAPKシステムを譲歩として導入したと述べたが、それを使用している人はほとんどいないことを嬉しく思っている。
スティーブヘイリー

2
しかし、複数のバージョンを処理することがバージョン管理システムの目的です。これは、開発者が精通しているものです(ほとんどのソフトウェア(モバイルであってもなくても)は、プラットフォームごとにわずかに異なるバージョンをリリースします)。このAndroidの「機能」は、複雑さを軽減するものではありません。それは単にそれを実行中のアプリケーションにプッシュしているだけであり、このスレッドによって証明されているように、混乱を引き起こしています。確かに、Googleはそれを使用している人がほとんどいないことを嬉しく思います...それは、彼らが「そもそもこの省略をするのは正しかった」と言うのに役立ちます。さらに、まだ存在することを知らないために使用しない人もいます。
ネイト

97

targetSdkVersion = "xx"を設定すると、アプリがAPIレベルxxで適切に機能する(たとえば、十分にテストされ、正常にテストされた)ことを保証します。

xx より上の APIレベルで実行されているAndroidのバージョンでは、互換性コードが自動的に適用され、APIレベルxx以前で利用可能であったが、現在Androidバージョンの上位レベルでは廃止されている機能に対応しています。

逆に、あなたは時代遅れになったすべての機能を使用している場合で、またはになるレベルXX、互換性のコードにはない、それらの用途をサポートするために、(もはやこれらの機能が含まれていないこと)を自動的高いAPIレベルでのOSのバージョンによって適用されることに。そのような状況では、独自のコードにAPIレベルをテストする特別なcase句が必要であり、検出されたOSレベルが特定のAPI機能を持たないより高いものである場合、実行中のOSで利用可能な代替機能をコードで使用する必要ありますAPIレベル。

これに失敗した場合、通常はコード内のイベントをトリガーするいくつかのインターフェイス機能が表示されない可能性があり、ユーザーがそれらのイベントをトリガーして機能にアクセスするために必要な重要なインターフェイス機能がない可能性があります(以下の例)。

他の回答で述べたように、minSdkVersionよりも高いAPIレベルで最初に定義された一部のAPI機能を使用する場合、およびコードがそれらの機能の不在を検出して処理できることを確認するための措置を講じていた場合、minSdkVersionよりも高いtargetSdkVersionを設定できます。 targetSdkVersionよりも低いレベル。

機能を使用するために必要な最小APIレベルを具体的にテストするように開発者に警告するために、minSdkVersionより後のAPIレベルで定義されたメソッドの呼び出しがコードに含まれている場合、コンパイラーはエラー(警告だけでなく)を発行します。 targetSdkVersionが、そのメソッドが最初に使用可能になったときのAPIレベル以上であっても。このエラーを削除するには、コンパイラディレクティブ

@TargetApi(nn)

そのディレクティブのスコープ内のコード(メソッドまたはクラスの前にある)が少なくともnnのAPIレベルをテストするために記述されてから、少なくともその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();
    }
}

あなたは可能性、あなたがより高いレベルでテストされていたし、すべてが働いていた場合、あなたがた場合でも、高いtargetSdkVersionを宣言したいない高いあなたのminSdkVersionがよりAPIレベルから任意の機能を使用します。これは、ターゲットレベルから最小レベルに適応することを目的とした互換性コードにアクセスするオーバーヘッドを回避するためのものです。そのような適応が必要ないことを(テストを通じて)確認したためです。

宣言されたtargetSdkVersionに依存するUI機能の例は、11未満のtargetSdkVersionのアプリがAPI 11以降で実行されている場合にステータスバーに表示される縦に3つ並んだメニューボタンです。アプリのtargetSdkVersionが10以下の場合、アプリのインターフェースは専用メニューボタンの存在に依存していると想定されるため、3つのドットのボタンが以前の専用ハードウェアや画面上のバージョンの代わりに表示されます。 OSのAPIレベルが高く、デバイスの専用メニューボタンが想定されなくなった場合に、そのボタン(たとえば、Gingerbreadに表示される)の。ただし、アプリのtargetSdkVersionを11以上に設定すると、そのレベルで導入された専用のメニューボタンに代わる機能(e。g。、アクションバー)、またはシステムメニューボタンの必要性を回避した場合。その結果、縦に3つ並んだドットのメニュー「互換性ボタン」が消えます。その場合、ユーザーがメニューボタンを見つけることができない場合、ユーザーはそれを押すことができません。つまり、ユーザーのアクティビティのonCreateOptionsMenu(menu)オーバーライドが呼び出されない可能性があります。これもまた、アプリの機能の大部分がユーザーインターフェースを奪われている可能性があります。もちろん、ユーザーがこれらの機能にアクセスするためのアクションバーまたはその他の代替手段を実装していない限り、メニューボタンが見つからない場合、ボタンを押すことができません。つまり、アクティビティのonCreateOptionsMenu(menu)オーバーライドが呼び出されない可能性があります。これも、アプリの機能の重要な部分がそのユーザーインターフェースを奪われた。もちろん、ユーザーがこれらの機能にアクセスするためのアクションバーまたはその他の代替手段を実装していない限り、メニューボタンが見つからない場合、ボタンを押すことができません。つまり、アクティビティのonCreateOptionsMenu(menu)オーバーライドが呼び出されない可能性があります。これも、アプリの機能の重要な部分がそのユーザーインターフェースを奪われた。もちろん、ユーザーがこれらの機能にアクセスするためのアクションバーまたはその他の代替手段を実装していない限り、

対照的に、minSdkVersionは、アプリを実行するために、デバイスのOSバージョンが少なくともそのAPIレベルを持っているという要件を述べています。これは、アプリがGoogle Playアプリストア(および場合によっては他のアプリストア)にあるときに、アプリを表示およびダウンロードできるデバイスに影響します。これは、アプリがそのレベルで確立されたOS(APIまたはその他)の機能に依存しており、それらの機能の欠如に対処するための許容できる方法がないことを示す方法です。

APIに関連しない機能の存在を確認するためにminSdkVersionを使用する例は、アプリがDalvikインタープリターのJIT対応バージョンでのみ実行されるようにするためにminSdkVersionを8に設定することです(JITが導入されたため) APIレベル8のAndroidインタープリターに)。JIT対応のインタープリターのパフォーマンスは、その機能のないインタープリターの5倍にもなる可能性があるため、アプリがプロセッサーを大量に使用する場合は、適切なパフォーマンスを確保するためにAPIレベル8以上が必要になる場合があります。


TargetApiディレクティブを使用するための指示をありがとう。
samir105 2016年

@Carlそれは、コードベースがminSdkVersionで利用可能なAPIのみを使用するように制限している限り、テスト(それ自体)を必要とせずに、常にtargetSdkVersionをminSdkVersionより高い任意のバージョンに設定できることを意味します(特にこれらのUI拡張を取得するため)。 ?
Damilola Olowookere 2017

Olowookere Emmanuel:私があなたを正しく理解していれば、いや、それはそれを意味するものではありません。私の回答では、「レベルxx以前に廃止された機能を使用している場合、互換性コードは、より高いAPIレベルのOSバージョンでは自動的に適用されません。」たとえば、コードがAPIレベル8で利用可能になった機能を使用していて、その機能がレベル10で廃止された場合、targetSdkVersionを10以上に上げると、使用方法を調整するために使用できる互換性コードがなくなります。新しいOSレベルにその機能。
カール

(続き):targetSdkVersionをレベル8のままにすると、上位レベルで導入された機能を使用できなくなりますが、実行時にレベル8機能を使用できるようにする互換性コードが適用されますより高いOSレベル。
カール

(継続):このように考えてください:使用可能な最高のAndroidレベルが8のときにコードを記述し、targetSdkVersionを8に設定したとします(それが当時の最高レベルだったため)。これで、Androidの新しいリリースがいくつかリリースされ、使用していたレベル8の機能の一部が使用できなくなります。古いAPKをまだ持っているユーザーは、エラーを経験するべきではありませんか?したがって、そうしないようにするために、ユーザーが新しいバージョンのOSを実行しているときに呼び出されたときに古いAPI呼び出しを調整して適切な処理を行うように、互換性コードが自動的に適用されます。
カール

50

概念は、常に、例を使用してより適切に提供できます。Android開発者サイトのすべてのドキュメントと関連するStackoverflowスレッドを読んだ後でも、Androidフレームワークのソースコードを掘り下げて実験を行うまで、これらの概念を理解するのに苦労しました。これらの概念を完全に理解するのに役立つ2つの例を紹介します。

A DatePickerDialogは、あなたが(AndroidManifest.xmlファイルのtargetSDKversionに置くことをレベルに応じて異なります<uses-sdk android:targetSdkVersion="INTEGER_VALUE"/>)。値を10以下に設定すると、DatePickerDialogは左のようになります。一方、11以上の値を設定した場合、DatePickerDialogは同じコードで正しく表示されます

DatePickerDialogは、targetSDKバージョン10以下で表示します DatePickerDialogは、targetSDKバージョン11以降で表示します

このサンプルの作成に使用したコードは非常に単純です。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>


それでおしまい。これは、私がこれをテストするために必要なすべてのコードです。

そして、Androidフレームワークのソースコードを見ると、この外観の変化は非常に明確です。それは次のようになります:

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);
}

ご覧のとおり、フレームワークは現在のtargetSDKversionを取得し、別のテーマを設定しています。この種のコードスニペット(getApplicationInfo().targetSdkVersion >= SOME_VERSION)は、Androidフレームワークのあちこちにあります。

別の例は、WebViewクラスに関するものです。メインスレッドでWebviewクラスのパブリックメソッドを呼び出す必要があります。そうでない場合、RuntimeExceptiontargetSDKバージョン18以上を設定すると、ランタイムシステムはをスローします。この動作は、ソースコードとともに明確に提供できます。そのように書かれているだけです。

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

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


Androidのドキュメントには、「Androidが新しいバージョンごとに進化するにつれて、一部の動作や外観さえも変わる可能性があります」と書かれています。そのため、動作と外観の変更、およびその変更がどのように行われるかを調べました。

要約すると、Androidドキュメントは「この属性(targetSdkVersion)は、ターゲットバージョンに対してテストしたことをシステムに通知し、システムは互換性動作有効にして、アプリのターゲットバージョンとの前方互換性を維持することはできません」と述べています。これは、WebViewのケースで非常に明確です。JELLY_BEAN_MR2が解放され、メインスレッドではないWebViewクラスのパブリックメソッドを呼び出すまでは問題ありませんでした。AndroidフレームワークがJELLY_BEAN_MR2デバイスでRuntimeExceptionをスローするのは無意味です。新たに導入された動作を有効にして、致命的な結果をもたらすべきではありません。したがって、特定のtargetSDKバージョンですべてが正常かどうかを確認する必要があります。targetSDKversionを高く設定すると、外観が向上するなどのメリットがあります。

編集:免責事項。現在のtargetSDKversion(上記で示したもの)に基づいて異なるテーマを設定するDatePickerDialogコンストラクターは、実際には後のcommitで変更されています。それにもかかわらず、ロジックは変更されておらず、それらのコードスニペットはtargetSDKversionの概念を明確に示しているため、私はその例を使用しました。


2
「私たちは、targetSDKversionを高く設定することで、外観を改善するようなメリットを得ますが、責任があります。」彼らがドキュメントでこの行を述べていたら、私はそれを探していません。
パルプフィクション2015年

@김준호2つの質問があります:1.)上記のdatepickerの例で、targetSdkVersionを10以下に設定し、最新のAndroid(例えばAPI 22)を実行しているデバイスでアプリを実行した場合、datepickerは古いもののように表示されます左の写真?2.)コードベースを制限している限り、(それ自体)テストを行うことなく、常にtargetSdkVersionをminSdkVersionよりも高い任意のバージョンに設定できる(たとえば、より高いAPIからそのサクサクした日付ピッカーのようなUI拡張を取得できる)ことを意味しますか?minSdkVersionで利用可能なAPIのみを使用するには
Damilola Olowookere 2017

@Olowookere 1)はい。ちょうどそれを実行します。2)targetSDKVersionは、minSDKVersionより高い場合、任意のバージョンに設定できます。ただし、ターゲットバージョンで正常に機能するかどうかをテストする必要があります。minSDKVersion APIを使用するかどうかは関係ありません。DatePickerの例を考えてみてください。
김 준 호

最小バージョン14とターゲットSDKバージョンを16に設定し、14以下のAPIのみを使用した場合を考えてください。APIレベル1で導入されたTextViewを使用したとしましょう。
김 준 호

@김준호ありがとう。しかし、あなたの2番目の答えについて、私は混乱しています。コードでminSdkVersionのAPIのみを使用していて、より高いSDKをターゲットにしている場合、なぜテストする必要があるのですか?DatePickerの例を考えると、高いtargetSdkVersionはDatePickerウィジェットの外観を向上させるだけで、minSdkVersionよりも高いAPIでコードを使用しなかったため、何も壊れません。私はウィジェットの新しいルックアンドフィールをしたいので、私は唯一の私が高いAPIで導入された新機能を使用したくないという、高いtargetSdkVersionをしたい
Damilola Olowookere

21

要約をしたい人のために、

android:minSdkVersion

アプリケーションがサポートするまでの最小バージョンです。お使いのデバイスのAndroidのバージョンが低い場合、アプリはインストールされません。

その間、

android:targetSdkVersion

アプリが実行するように設計されるまでのAPIレベルです。つまり、このAPIまでテストしたので、携帯電話のシステムは上位互換性を維持するために互換性動作を使用する必要はありません。

アプリは指定されtargetSdkVersionたバージョンよりも高いバージョンのAndroidで引き続き実行されますが、Android互換性動作が開始されます。

景品-

android:maxSdkVersion

デバイスのAPIバージョンが高い場合、アプリはインストールされません。つまり。これは、アプリのインストールを許可するまでの最大APIです。

すなわち。MinSDK -4、maxSDK-8、targetSDK-8の場合アプリは最低1.6で動作しますが、2.2デバイスにインストールされている場合に表示される2.2でのみサポートされる機能も使用しました。また、maxSDK-8の場合、このアプリはAPI> 8を使用する電話にはインストールされません。

この回答を書いている時点では、Androidのドキュメントはそれを説明するのに優れていませんでした。今では非常によく説明されています。ここで確認してください


「アプリが機能を継承した最大バージョンです。」: これは間違っています。これは、アプリが機能を継承した最小バージョンです。つまり、アプリで使用される必要な機能を含む最初のバージョンです。
RichieHH 2013年

英語はトリッキーな言語です。答えで与えられた私の例を読んでください。私はそこに意味があると思います。:)
ダーパン2014

私は知識を深めているわけではなく、英語がこのグループのサポート言語です。「アプリが機能をサポートしている最大バージョン」が間違っているかどうかは、間違っているだけでなく、完全に180度間違っています。これは、フォールバック互換モード/ライブラリを使用せずに、アプリケーションのすべての目的の機能をサポートする最初のバージョンまたは最小バージョンです。
RichieHH 14

9

たとえば、コンパイルエラーが発生した場合:

<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.BitmapFactory $ Options#inBitmap

Android開発ツール(ADT)のバージョン17以降、@TargetApiこれを簡単に修正できる非常に便利な新しいアノテーションが1つあります。問題のある宣言を囲んでいるメソッドの前に追加します。

@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はコンパイルすることを許可するだけですが、自己責任で実行してください。


1
私はこれについて混乱しています。SDK 10のシステムで後でアプリを実行するとどうなりますか?
Fran Marzoa

options.inBitmapステートメントを無視し、アプリは正常に動作するはずです。
NinjaCoder 2014

1

android:minSdkVersionそして、 android:targetSdkVersionの両方が、私たちは、Androidマニフェストファイルで宣言する必要がありますが、両者が異なる性質を持つている整数値です。

android:minSdkVersion:これは、Androidアプリを実行するために最低限必要なAPIレベルです。低いAPIバージョンに同じアプリをインストールすると、パーサーエラーが表示され、アプリケーションをサポートしていない問題が表示されます。

android:targetSdkVersion:ターゲットSDKバージョンは、アプリのターゲットAPIレベルを設定することです。この属性がマニフェストで宣言されていない場合、minSdkバージョンはTargetSdkバージョンになります。これは「TargetSdkバージョンとして宣言したすべての上位バージョンのAPIへのアプリサポートインストール」に当てはまります。アプリを限定ターゲットにするために、マニフェストファイルでmaxSdkVersionを宣言する必要があります...


0

危険な権限必要アプリを作成し、targetSDKを23以上に設定する場合は注意が必要です。ランタイムの権限をチェックしないとSecurityExceptionが発生し、tryブロック内でコードを使用している場合(オープンカメラなど)、logcatをチェックしないとエラーを検出するのが難しい場合があります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.