5

私はAndroidマーケットで、多くの人気のあるアプリケーションが以前のバージョンのAndroidと下位互換性があることを指摘しました。例えば

Evernote - 1.6
Faceobook Messenger - 2.2

これらのアプリケーションは見た目も動作も優れていますが、どうすればこれを実行して、はるかに古いAPIレベルをサポートできるでしょうか。サポートされている最低のOSバージョンに存在するAPI機能のみを使用しているのでしょうか。優れたUIと機能リストを提供するには、後のAPIレベルのいくつかの機能を使用している必要があると思います。

私は2つの可能な解決策を見ることができます:

Use Min/Target API levels in build. Then through code you check the OS version and implement the features using a supported method and degrade gracefully. This seems like a lot of work.

Have multiple app versions targeting various OS versions. E.g. A release for 2.2 and another for 4.0. Is this possible?

質問する理由は、2.2をサポートする新しいアプリを計画しているのですが、それ以降のリリースでのみ利用可能なAPI機能が必要になるのではないかと心配しています。2.2をターゲットにする必要がありますか?

編集:また、互換性ライブラリはどのような役割を果たしますか?これが鍵ですか?

ありがとう。

4

3 に答える 3

15

私たち(Evernote)は、1.6をサポートし、できるだけ多くの新しいAPIを使用するために追加の作業を行います。1.6をサポートする際の主な問題は、Dalvikがクラスを貪欲に検索することです。これにより、次のようなコードを使用できなくなります

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
    prefEditor.apply();
} else {
    prefEditor.commit();
}

クラス検証エラーがスローされるためです。これは、dalvikがメソッドを確認し、実行時にメソッドにアクセスしようとしたときに発生します。

代わりに、ヘルパークラスを使用して、SDKの適切なクラスをインスタンス化する必要があります。はい、これははるかに多くの作業です

public abstract class SharedPreferenceEditor {

  private static SharedPreferenceEditor sInstance;

  public static SharedPreferenceEditor getInstance() {
    if (sInstance == null) {

      /*
      * Check the version of the SDK we are running on. Choose an
      * implementation class designed for that version of the SDK.
      */
      @SuppressWarnings("deprecation")
      int sdkVersion = Build.VERSION.SDK_INT;
      if(Evernote.DEBUG)Log.d("SharedPreferenceEditor", "sdkVersion=" + sdkVersion);
      if (sdkVersion < Build.VERSION_CODES.GINGERBREAD) {
        sInstance = new CommitSharedPreferenceEditor();
      } else  {
        sInstance = new ApplySharedPreferenceEditor();
      }
    }
    return sInstance;
  }

  public abstract void save(SharedPreferences.Editor editor);
}

次に、ジンジャーブレッド+APIレベル用に1つあります

public class ApplySharedPreferenceEditor extends SharedPreferenceEditor {
  public void save(SharedPreferences.Editor editor) {
    editor.apply();
  }
}

1つは<ジンジャーブレッドレベル用です

public class CommitSharedPreferenceEditor extends SharedPreferenceEditor{
  public void save(SharedPreferences.Editor editor) {
    editor.commit();
  }
}

Dalvikの改善点を利用して、最初にリストした例を使用できるように、2.1以降をサポートすることをお勧めします。

于 2012-09-05T23:05:13.940 に答える
6

後方サポートと最新機能を組み合わせるには、いくつかの異なる戦略があります。Androidのドキュメントには多くの参照がありますが、ここから始めてください: Androidアプリケーションの下位互換性

ただし、一般的には、可能であれば複数のバージョンを公開しないことを強くお勧めします。アプリのマニフェストを使用して、適切な範囲のOSバージョンとそれに応じたコードをターゲットにします。

はい、標準のAndroidサポート(互換性)ライブラリもあります。一般に、compatライブラリの目的は、アプリが最新のOS機能の一部を使用できるようにすると同時に、古いプラットフォームに同等の実装を提供することです。あなたは間違いなくこれを調べる必要があります。

サードパーティの互換性ライブラリもいくつかあります。これが私のプロジェクトで使用したいくつかであり、間違いなくお勧めします:

NineOldAndroidsは実際にはActionBarSherlockに含まれていることに注意してください。

于 2012-09-04T22:59:09.300 に答える
1

新しいバージョンの機能を利用しながら、古いバージョンのAndroidプラットフォームをサポートするためにできることがいくつかあります。さまざまなプラットフォームバージョンをサポートするAndroidトレーニングガイドには、いくつかの概要が記載されており、それらの実装方法を示すサンプルコードが含まれています。

順不同:

  • 「minSdkVersion」と「targetSdkVersion」を別々に設定できます。minSdkVersionは、サポートするAndroidの最も古いバージョンです。targetSdkVersionは、テストした最新バージョンであり、アプリに含める予定の最新の機能/動作のセットです。

  • 実行時にシステムバージョンを確認し、必要なAndroidプラットフォームバージョンがデバイスで実行されている場合にのみ機能を実装できます。これは次のようになります。

    private void setUpActionBar() {
        // Make sure we're running on Honeycomb or higher to use ActionBar APIs
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
          ActionBar actionBar = getActionBar();
          actionBar.setDisplayHomeAsUpEnabled(true);
        }
    }
    
  • サポートライブラリ(一般に互換性ライブラリとも呼ばれます)には、新しいバージョンのAndroidの機能が含まれており、アプリケーションに含めることができるように記述されており、古いバージョンのAndroidでも機能します。たとえば、フラグメントはHoneycomb(Api 11)で導入されました。ただし、ドーナツ(Api 4)に戻るデバイスでは、サポートライブラリに含まれているバージョンのフラグメントを使用できます。

于 2012-09-05T00:25:52.700 に答える