Android Instant App: как создавать URL-адреса?

Недавно Google обновил свою информационную страницу о мгновенных приложениях: https://developer.android.com/topic/instant-apps/prepare.html

Большинство пунктов ясно, за исключением «3. Рефакторинг вашего приложения, если необходимо». Они предлагают для розничных модулей, таких как просмотр, поиск, детализация деталей и проверка.

В: Как разбить приложение на модули, которые полностью функциональны и доступны для URL? Я вижу здесь несколько вопросов: – если мы используем библиотеки, такие как кинжал, масляный нож, … все модули будут зависеть от других модулей – если наши модули содержат (представления) по мере необходимости, как следует переходить к другому представлению (из другого модуля ) Быть реализованы без импорта этого модуля?

Может кто-то пролил свет в темноту? Благодаря!

Пожалуйста, обратитесь к официальным документам, которые теперь доступны для разработчиков.

Подводя итог, все Instant Apps, по крайней мере, имеют так называемый базовый функциональный модуль, который содержит общий код в Instant App. Кроме того, Instant Apps может дополнительно иметь 1 или более дополнительных библиотек функций, которые зависят от базового функционального модуля. Каждый функциональный модуль может иметь свои собственные точки входа, которые адресуются URL-адресами, хотя сами функциональные модули не должны зависеть друг от друга. Если нужно позвонить другому, это можно сделать с помощью намерения на основе URL.

Диаграмма с сайта docs немного помогает:

Введите описание изображения здесь

Все функциональные модули используют новый плагин com.android.feature , который используется аналогично традиционному плагину com.android.library с точки зрения того, как вы можете использовать его в своем проекте Android, и поэтому документы библиотеки могут использоваться как ссылка. С точки зрения того, как он отличается, он будет выводить обычный файл AAR при использовании с вашим установочным модулем приложения и выводит APK функции при использовании с новым модулем Instant App.

Правильное разделение модулей, требуемое Instant Apps, можно легко выполнить, выполнив следующие шаги:

  1. Создайте общий модуль, который будет содержать код и ресурсы, которые должны быть разделены между функциональными модулями.
  2. Создайте несколько функциональных модулей для каждой основной функции (в примере, представленном Google: просмотр, поиск, детализация и проверка). Эти модули могут зависеть от общего модуля, созданного на стр.1, но они ничего не должны знать друг о друге.
  3. Чтобы начать работу с другого модуля, сделайте целевую активность URL-адресом и запустите ее с помощью неявного намерения. Google предлагает использовать для этого ссылки на приложения.
  4. Чтобы создать свое обычное приложение для Android, создайте модуль приложения, который зависит от функциональных модулей.
  5. Как только Google выпустит свой Android InstantApp SDK для общественности, вы можете создавать свои Instant Apps (по одной на каждую функцию).

Рассмотрим эту диаграмму. Введите описание изображения здесь

В: Как разбить приложение на модули, которые полностью функциональны и доступны для URL?

Базовый модуль: содержит все общие ресурсы, необходимые вашему приложению. Таким образом, в нашем случае все действия с feature1 и feature2 будут использоваться совместно с res из базового модуля. У него могут быть такие библиотеки, как кинжал, butterknife.

Теперь пришло время разбить все ваше приложение на меньшую единицу, называемую функцией. Единственная функция может состоять из нескольких действий, которые могут просто дать представление о вашем приложении или достичь цели, которая побуждает пользователей устанавливать это приложение. Теперь он полностью зависит от вас, что вы хотите донести до пользователя, который настаивает на том, чтобы загрузить ваше приложение.

Feature1: Итак, мы разделили приложение на feature1 и feature2. В этой функции1 мы предоставляем пользователям возможность поиска и поиска элементов. Всякий раз, когда пользователь нажимает на элемент, нам нужно загрузить деталь деталя из функции2, поэтому при щелчке элемента из активности просмотра мы будем называть

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

Потому что: Activity1 из функции1 не может напрямую вызвать Activity2 в feature2. Для этого вы должны запросить URL-адрес activity2 из Activity1.

Feature2: теперь Feature2 загружен в мгновенное приложение, чтобы теперь мы могли видеть активность элемента.

ПРИМЕЧАНИЕ. Вы также должны учитывать свой размер функции, разделяя функциональность приложения, поскольку каждая функция не должна превышать размер 4 МБ, в противном случае проверка выполняется при загрузке apk для воспроизведения в магазине.

Я думаю, что модуль функций придумывает все, что нужно модульной концепции. В конце каждой функции можно разделить на функциональный модуль.

Я начинаю понимать новый способ структуры проекта из этого разговора . Мне это ясно.

Например, если мы создаем функциональный модуль и хотим связать его с функциональным базовым модулем, нам, вероятно, необходимо удалить неиспользуемые test ресурсы androidTest и ресурсы res .

Также создайте простой проект с новой структурой здесь

В этом репозитории попытайтесь начать с нуля, следуя документу и выше, чтобы перейти от модуля приложения к функциональному модулю и добавить мгновенный модуль приложения в базу кода.

Я не уверен, что я не понимаю ваш вопрос, но я попытаюсь взломать его. Для моего объяснения ниже я буду ссылаться на этот пример кода Google несколько раз. Я ВЫ НАСТОЯТЕЛЬНО предлагаю клонировать это репо и играть с ним, так как я думаю, что он ответит на ваш вопрос.

Если мы используем библиотеки, такие как кинжал, маслобойник … все модули будут зависеть от других модулей

Как упоминалось другими, любые библиотеки, которые будут использоваться всеми вашими функциями, войдут в вашу базовую функцию.

Если наши модули содержат (представления) по мере необходимости, как должен быть реализован переход к другому представлению (из другого модуля) без импорта этого модуля?

Этот ответ охватывает его обзор, но эта часть, по-видимому, является корнем вашего вопроса, поэтому я попытаюсь углубиться в глубь.

Предположим, Feature1 ( BrowseActivity ) хочет открыть Feature2 ( ItemDetailActivity ). Вместо Feature1, вызывающего startActivity(ItemDetailActivity.class) напрямую, ему придется использовать вызов метода ниже (это потому, что Feature1 не имеет доступа к FeatureDetailActivity.class ItemDetailActivity.class поскольку они НЕ зависят друг от друга). Вот пример кода, предоставленный Google.

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

Теперь недостающая часть заключается в том, что в AndroidManifest Feature2 вам нужно объявить, что ItemDetailActivity прослушивает ссылку https://example.com/itemdetail . Вот пример кода из 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> по <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> 

Для получения дополнительной информации ознакомьтесь с цифровыми связями с активами, а также с общей глубиной ссылки