0

したがって、ART ランタイムを適切に無効にするには、アプリケーションのマニフェスト タグにandroid:vmSafeMode="true"を追加します。

私が個人的に抱えている問題は、Android ライブラリを開発しているため、アプリケーション タグがないことです。

つまり、インスタント ランを使用している場合 (dex2oat はすべてを実行する必要があります)、またはライブラリを使用している誰かがインスタント ランを使用している場合、デバッグが非常に遅くなります。

manifestPlaceholders = [vmSafeModeEnabled: "true"]build.gradle で使用しようとしましたが、これは効果がありません。

誰にも洞察がありますか?

同様に、

dexOptions {
    preDexLibraries false
}

結果に違いはありませんでした。アプリの起動ごとに dex2oat がかなりの時間を費やしていることを今でも確認しています。

もちろん、これらのオプションはすべてアプリケーションでは問題なく機能しますが、ライブラリ/SDK 開発ではまったく機能しません。

4

1 に答える 1

4

コメントで述べたように、いくつかの概念を混ぜていると思うので、時間をかけて個別に説明します。

インスタントラン

これは IDE (つまり Android Studio) の機能であり、API 15 を実行しているデバイスにまでさかのぼって (さまざまな量で) 互換性があります。これは、アプリケーションのデバッグ/開発中に使用されるコードにのみ影響します。

これは、アプリのデバッグ バージョンを強制しmultidex、新しい dex ファイルから USB 経由でコード変更を動的にロードすることによって機能します。最終的にコンパイルされたコード (ライブラリまたはアプリケーションに関係なく) は、この機能によって変更されることはありません。

ここを参照してください: https://developer.android.com/studio/run/index.html#instant-run

Instant Run は、デバッグ ビルド バリアントをデプロイし、Android Plugin for Gradle バージョン 2.0.0 以降を使用し、minSdkVersion を 15に設定した場合にのみサポートされます。

美術

これは、Android が実行する現在のランタイムです。これは、APK からバイト コードを読み取り、それをプロセッサの命令に変換するコア システムです。

ここを参照してください: https://source.android.com/devices/tech/dalvik/

ART と Dalvik は、Dex バイトコードを実行する互換性のあるランタイムであるため、Dalvik 用に開発されたアプリは、ART で実行するときに動作するはずです。

したがって、いくつかのエッジ ケースの違いがありますが、このリンク ( https://developer.android.com/guide/practices/verifying-apps-art.html ) を確認すると、ほとんどがネイティブ コードを扱っていることがわかります。 Javaのみのライブラリでは違いはありません。

つまり、コードが正しい API をターゲットにしている限り、互換性のあるランタイムであるため、コードを実行しているランタイムに違いはありません。

vmSafeMode

ART では、これは AOT コンパイラのみを無効にします。通常のユーザーの観点からは、Play ストアからのインストール中に「インストール中」と表示される時間です。これは、プロセッサが実行できるように、ART がアプリでいくつかの前処理を行っている瞬間です。この時間は USB デバッグ中にも発生しますが、無効にすると、オンザフライで実行する必要があります。

preDexライブラリ

これは、ビルド システム (gradle) にライブラリを前処理するように指示するだけです。これは、apk をビルドするときに、ライブラリが既に処理されている場合に役立ちます。しかし、ライブラリを構築している場合、そのコードを変更するたびに再処理する必要があります。

あなたの問題に

これらの概念が整っているので、以下のコメントからの矛盾を指摘したいと思います。

単純にインスタント実行を無効にすることもできますが、依存関係として ART コンパイルを使用してセットアップされたライブラリがある場合、問題が発生します。問題が本質的にその中にない場合、単にインスタントランを使用しないように人々に言うことはできません.

  • ライブラリがランタイムを依存関係としてコンパイルされることはありません。確かにAPIレベル(呼び出すことができるメソッド)または特定のデバイス機能(GPSまたはアクセラレータが必要)に依存する場合があります。ランタイム (ART と Dalvik) は互換性があり、同じコードを実行しても同じ結果が得られます (ART の方が効率的/高速です)。
  • また、説明したように、インスタント実行は、開発/デバッグ中の Android Studio の機能です。ライブラリがaarファイルにパックされ、他の開発者が使用した後は、インスタント実行が使用されたかどうかに違いはありません。

そのすべてとあなたの元の問題を念頭に置いて。インスタント ランの仕組みにより、ライブラリを開発すると逆効果になることがわかります。ライブラリがアプリ全体に広がる可能性があり、変更があると新しいフル ビルドが強制されるため、時間がかかります。

また、ART で事前コンパイルを無効にすると、dev-debug 時間がどのように変化するかがわかりますが、それは大したことではありません。

最終決定する

すべてが明確であり、問​​題の解決策が次のとおりであることを願っています。

  • Instant Run に時間がかかりすぎる場合は、AndroidStudio で無効にしてください。他の開発者に影響を与えることはありません。
  • 大きな違いはないと思いますが、ライブラリの開発中に「サンプルアプリ」に追加することができvmSafeModeます.ライブラリは、他の開発者が開発した他のアプリでも問題なく動作します.
  • ライブラリを開発する場合、preDexLibraries はほとんど影響を与えないと予想されます。
于 2016-06-06T19:19:49.127 に答える