Слияние манифеста Android: предупреждение, связанное с отсутствием другого объявления

#android #android-manifest

#Android #android-манифест

Вопрос:

Я проверил множество похожих сообщений, связанных с этой темой, но не смог указать на проблему, с которой я столкнулся.

Итак, в основном у меня есть модуль с активностью запуска, который я не хочу быть основным средством запуска, переопределяя активность запуска основного модуля. Итак, я использовал узел: tools:node="remove" чтобы удалить это. Пример:

Манифест основного приложения: …

    <activity
            android:name="path.ThatOneActivity"
            android:screenOrientation="locked"
            android:theme="@style/AppCompatTheme.Translucent.NoTitleBar">
            <intent-filter>
                <action
                    android:name="android.intent.action.MAIN" />
                <category
                    android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data
                android:name="nextActivity"
                android:value="path.ThatOtherActivity" />
        </activity>
  

Манифест моего модуля:

           <activity
            android:name="path.ThatOneActivity"
            android:screenOrientation="locked"
            android:theme="@style/AppCompatTheme.Translucent.NoTitleBar"
            tools:node="merge">
            <intent-filter  tools:node="remove">
                <action
                    android:name="android.intent.action.MAIN"
                    tools:node="remove" />
                <category
                    android:name="android.intent.category.LAUNCHER"
                    tools:node="remove" />
            </intent-filter>
            <meta-data
                android:name="nextActivity"
                android:value="path.ThatOtherActivity" />
        </activity>
  

Итак, как вы можете видеть, на самом деле это смесь нескольких решений в разных потоках, но она не работает. (Да, даже по отдельности).

Затем я проверил журналы во время сборки, я обнаружил предупреждение: category#android.intent.category.LAUNCHER was tagged at AndroidManifest.xml: to remove other declarations but no other declaration present

Теперь это сбивает с толку, поскольку я не уверен, что это значит. Как и в других потоках, я тоже добавил xmlns:tools , но ничего не произошло:

  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="my.borning.app">
  

Обновить:

Внесены изменения в соответствии с комментарием CommonsWare:

 <activity android:name="path.ThatOneActivity">
            <intent-filter>
                <action
                    android:name="android.intent.action.MAIN"
                    tools:node="remove" />

                <category
                    android:name="android.intent.category.LAUNCHER"
                    tools:node="remove" />
            </intent-filter>
        </activity>
  

но все равно получаю предупреждение:
category#android.intent.category.LAUNCHER was tagged at AndroidManifest.xml: to remove other declarations but no other declaration present

Однако я понял одну вещь: я работаю над модулем, который используется основным приложением (которым я также не управляю, мой модуль — это библиотека, в которой я ошибался раньше. Так что это связано с приоритетом! Моя библиотека пытается переопределить панель запуска основного приложения, которое использует мой модуль в качестве библиотеки. Есть ли способ переопределить средство запуска через библиотеку (в основном, если мы можем повысить приоритет манифеста, что кажется невозможным)?

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

Заранее благодарю вас!!

Комментарии:

1. FWIW, здесь я использовал tools:node="remove" элементы <action> and <category> для удаления действия LeakCanary. Обратите внимание, что вам не нужны дополнительные атрибуты <activity> элемента или дочернего <meta-data> элемента — вам нужно только android:name для идентификации действия, а также узлов, которые вы хотите удалить.

2. Я обновил вопрос для получения более подробной информации. По сути, мой модуль действует как библиотека, а не наоборот. Мой плохой! Я думаю, что это не работает, поскольку приоритет ниже, есть ли какой-либо способ переопределить это.

3. «В основном мой модуль действует как библиотека, а не наоборот» — о, да, это не сработает. Как вы сказали, библиотека имеет более низкий приоритет с точки зрения слияния манифестов, поэтому ваша библиотека не может удалить действие из приложения, в котором оно размещено. Могут быть способы заставить вашу библиотеку удалить некоторые действия, добавленные другой библиотекой, хотя я никогда не пробовал этого и не знаю, как это будет работать.