25

最近のインスタントアプリの情報ページを更新しました:https://developer.android.com/topic/instant-apps/prepare.htmlAndroidインスタントアプリケーション:URLアドレス指定可能モジュールの作成方法

「3必要に応じてあなたのアプリをリファクタリングする」を除いてほとんどの点が明確です。ブラウズ、検索、商品詳細、チェックアウトなどの小売モジュールを提案しています。

Q:完全に機能するモジュールにアプリを分割するにはどうすればいいですか?& URLはアドレス指定可能ですか? - ダガー、バターナイフなどのライブラリを使用する場合、すべてのモジュールは他のモジュールに依存します - モジュールに必要に応じて(ビュー)が含まれている場合、どのように別のビューに移行する必要がありますか別のモジュール)は、このモジュールをインポートせずに実装できますか?

誰かが暗闇に光を当てることはできますか?ありがとう!インスタントのアプリで必要とされる

+0

- ないですべて。彼らはなぜでしょうか?私は最近、DaggerとButterKnifeの大規模なコードベースでこのようなリファクタリングを行いました。それは私にとっては問題ではないと言えます。詳細については私の答えをチェックしてください。あなたには明らかではありません。 – Idolon

答えて

4

適切なモジュールの分離は簡単に次の手順を使用して行うことができます。

  1. は、機能モジュール間で共有されるべきコードとリソースが含まれます共有モジュールを作成します。
  2. 各主要機能(Googleが提供する例:ブラウズ、検索、項目の詳細、チェックアウト)ごとにいくつかの機能モジュールを作成します。これらのモジュールは、p.1で作成した共有モジュールに依存することができますが、お互いについては何も知りません。
  3. 別のモジュールからアクティビティを開始するには、ターゲットアクティビティをURLアドレス可能にして、暗黙のインテントで開始します。 Google suggestsは、そのためのアプリリンクを使用します。
  4. 通常のAndroidアプリを作成するには、機能モジュールに応じてアプリケーションモジュールを作成します。
  5. GoogleがAndroid InstantApp SDKを一般公開すると、インスタントアプリ(機能ごとに1つ)を構築できます。
4

official docsを参照してください。すぐにインスタントアプリを開発者が利用できるようになりました。

要約すると、すべてのInstant Appsには、少なくとも、インスタントアプリケーション全体で共通のコードを含む基本機能モジュールがあります。さらに、Instant Appsは基本フィーチャモジュールに依存する1つ以上の追加のフィーチャライブラリをオプションで持つことができます。各フィーチャモジュールは、URLアドレス可能な独自のエントリポイントを持つことができますが、フィーチャモジュール自体は互いに依存する必要はありません。相手を呼び出す必要がある場合は、URLベースのインテントを介して行うことができます。ドキュメントサイトから

図は少し助け:

enter image description here

すべての機能モジュールは、どのようにあなたができるという点で、伝統的なcom.android.libraryプラグインと同様に使用される新しいcom.android.featureプラグインを使用しますあなたのAndroidプロジェクトでそれを使用するので、library docsは参照として使用することができます。それがどのように異なるかという点では、インストール可能なアプリケーションモジュールで使用すると通常のAARファイルを出力し、新しいInstant Appモジュールで使用すると機能APKを出力します。

0

私は機能モジュールはすべての概念を持っていると思います。最後に、すべての機能をフィーチャモジュールに分けることができます。

私はこのプロジェクト構造の新しい方法を理解し始めています。talk。 それは私にいくつかの点を明確にします。

我々は機能モジュールを作成し、ベースモジュールを備えていますしリンクする場合と同じように、私たちは、おそらく未使用androidTesttestresリソースを削除する必要があります。

はまた、文書、次のゼロからスタートして、上記のモジュールを備えていますし、コードベースにインスタントアプリモジュールを追加するために、アプリケーション・モジュールから変更しようと、このレポ取引上の新しい構造を持つ単純なプロジェクトhere

を作成します。

+0

ブログ記事、図書館、またはあなたが関与している他の外部リソース(レポなど)にリンクするときは、[これを明示する必要があります](https://stackoverflow.com/help/promotion)。 –

2

この図を検討してください。 enter image description here

Q:私は完全に機能& URLのアドレス指定可能なモジュールにアプリを分割するにはどうすればよいですか?

ベースモジュール:には、アプリで必要なすべての共通リソースが含まれています。したがって、私たちの場合、feature1とfeature2のすべてのアクティビティは、ベースモジュールからの共有resを使用します。これは、短剣、バターナイフのようなライブラリを持つことがあります。

今度は、あなたのアプリ全体を、フィーチャーと呼ばれる小さな単位に分割してください。 1つの機能は複数のアクティビティで構成され、アプリを垣間見るだけでなく、ユーザーにそのアプリのインストールを促す目標を達成することもできます。今は、あなたがあなたのアプリをダウンロードするようにあなたに伝えたいことがあなたには完全に依存しています。

Feature1:私たちは、アプリをfeature1とfeature2に分割しました。この機能1では、ユーザーにアイテムの検索と参照を許可します。 項目のユーザーのクリックが、私たちがいるので、閲覧活動から項目をクリックするだけで、我々は

Intent intent = new Intent(Intent.ACTION_VIEW, 
       Uri.parse("https://yourdomain.com/itemdetail")); 
     intent.setPackage(getPackageName()); 
     intent.addCategory(Intent.CATEGORY_BROWSABLE); 
     startActivity(intent); 

のように呼びますので特長2からのアイテムの詳細をロードする必要があるとき:特長1は直接特長2にActivity2を呼び出すことはできませんからActivity1。そのためには、activity1のactivity2のURLアドレスを要求する必要があります。

フィーチャー2: フィーチャー2はインスタントアプリにロードされました。アイテムの詳細のアクティビティが表示されるようになりました。

注:各機能のサイズが4MBを超えないようにするため、アプリの機能を分割する際には、機能のサイズも考慮する必要があります。

1

私はあなたの質問を誤解しているかどうかはわかりませんが、私はそれを解読しようとします。私の以下の説明のために、私はthis code sample by Googleを数回参照します。 I HIGHLYは、あなたの質問に答えると思うので、そのレポを複製して遊んでください。

ダガー、バターナイフなどのライブラリを使用する場合は...すべてのモジュールは他のモジュールに依存します

他の人に言われているように、あなたのすべての機能で使用されるすべてのライブラリはベースフィーチャーに入ります。

私たちのモジュールには必要に応じて(ビュー)が含まれている場合、このモジュールをインポートせずに別のビュー(別のモジュールから)への移行方法を教えてください。

This answerは、その概要をカバーしていますが、この部分は質問の根源と思われるので、少し深く掘り下げてみます。

たとえば、Feature1(BrowseActivity)がFeature2(ItemDetailActivity)を開きたいとします。 Feature1の代わりにstartActivity(ItemDetailActivity.class)を直接呼び出すと、以下のメソッド呼び出しを使用する必要があります(これは、Feature1が互いに依存しないため、Feature2のItemDetailActivity.classにアクセスできないためです)。 Here is the code sample provided by Google

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://example.com/itemdetail")); 
intent.setPackage(getPackageName()); 
intent.addCategory(Intent.CATEGORY_BROWSABLE); 
startActivity(intent); 

今欠けている部分が特長2のAndroidManifestにあなたはItemDetailActivityhttps://example.com/itemdetailリンクのために待機していることを宣言する必要があるということです。任意の詳細情報についてはHere is the relevant code sample from Google

<activity android:name=".ItemDetailActivity"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
    <intent-filter android:autoVerify="true"> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 
     <data android:scheme="http" /> 
     <data android:scheme="https" /> 
     <data android:host="example.com" /> 
     <!-- IMPORTANT --> 
     <data android:pathPrefix="/itemdetail"/> 
    </intent-filter> 
    <meta-data 
     android:name="default-url" 
     android:value="https://www.example.com/itemdetail" /> 
</activity> 

、我々は短剣、butterknifeのようなライブラリを使用する場合は、 `、...すべてのモジュールが他のmodules`に依存することになりDigital Asset Linksをよく読んでだけでなく、一般的なDeep Linking

関連する問題