Android Studio с использованием библиотеки и проекта с тем же именем пакета

У меня есть библиотека, которую я использую в качестве базы для всех своих приложений для Android и имеет следующий файл манифеста:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android"
    xmlns:tools="http://schemas.android.com/tools"
    android:versionCode="36"
    android:versionName="1.b" >

    <uses-sdk
        android:minSdkVersion="5"
        android:targetSdkVersion="21"

        tools:overrideLibrary="com.facebook.android"/>

Затем я пытаюсь использовать его в одном из моих проектов, который имеет следующий манифест:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android"
    xmlns:tools="http://schemas.android.com/tools"
    android:versionCode="36"
    android:versionName="1.6" >

    <uses-library
        android:name="com.example.android"
        android:required="true"/>

    <uses-sdk
        android:minSdkVersion="5"
        android:targetSdkVersion="21"

        tools:overrideLibrary="com.facebook.android"/>

Обратите внимание, что имя используемого пакета одинаково: com.example.android. Поскольку приложение опубликовано в com.example.android, я не могу изменить его для приложения. Что касается библиотеки, то по историческим причинам она имеет такое же имя pacakge. Когда я создаю проект, я получаю следующую ошибку:

FAILURE: сбой сборки с исключением.

  • Что пошло не так: выполнение выполнено для задачи ': exampleCom: processDebugResources'.

    Ошибка: библиотека использует тот же пакет, что и этот проект: com.example.android. Вы можете временно отключить эту ошибку с помощью   android.enforceUniquePackageName = false Однако это временно и   будет применяться в версии 1.0

      

Я не хочу менять имя пакета для библиотеки или приложения. Я не уверен, где добавить "android.enforceUniquePackageName = false". Есть идеи? Кроме того, как решить проблему выше 1.0 (которую я уже использую)?

Ответ 1

Вы можете добавить forceceUniquePackageName = false в файл модуля build.gradle для файлов приложений под андроид:

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"
    enforceUniquePackageName = false
    ...
}

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

Ошибка: выполнение выполнено для задачи ': Приложение: packageAllDebugClassesForMultiDex. java.util.zip.ZipException: дублирующаяся запись:... BuildConfig.class

См. fooobar.com/questions/40651/...

Ответ 2

Унция профилактики стоит фунта лечения. Это может не помочь этой конкретной ситуации, но для будущих разработчиков, чтобы избежать попадания в эту ситуацию, обратите внимание на рекомендацию JLS в Глава 6. Имена, которые решает эту проблему:

Имена пакетов

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

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

Вы формируете уникальное имя пакета, сначала имея (или принадлежащий организация, которая имеет) доменное имя в Интернете, такое как oracle.com. Затем вы меняете это имя, компонент по компоненту, чтобы получить в этом например, com.oracle и использовать это как префикс для имен ваших пакетов, используя соглашение, разработанное в вашей организации, для администрировать имена пакетов. Такая конвенция может указывать на то, что определенные Компоненты имени пакета - это подразделение, отдел, проект, машина или имена пользователей.

Ответ 3

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

Ответ 4

работал как 2.2, gradle 2.14.1

android {
    enforceUniquePackageName = false
    //it was deprecated, but still work
    android.packageBuildConfig = false 
    ...
}

подробнее: new-build-system