web-dev-qa-db-fra.com

Android Studio utilisant une bibliothèque et un projet portant le même nom de package

J'ai une bibliothèque que j'utilise comme base pour toutes mes applications Android et possède le fichier manifeste suivant:

<?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"/>

J'essaie ensuite de l'utiliser dans l'un de mes projets qui a le manifeste suivant:

<?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"/>

Notez que le nom du package utilisé est le même: com.example.Android. Étant donné que l'application est publiée sous com.example.Android, je ne peux pas la changer pour l'application. Quant à la bibliothèque, pour des raisons historiques, elle porte le même nom de pacakge. Lorsque je construis le projet, j'obtiens l'erreur suivante:

11
checklist

Vous pouvez ajouter enforceUniquePackageName = false dans le fichier build.gradle des modules d'application sous Android:

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

Malheureusement, il en résulte un autre problème lié à un bogue non résolu des outils de génération.

Erreur: échec de l'exécution pour la tâche ': App: packageAllDebugClassesForMultiDex'. Java.util.Zip.ZipException: entrée en double: ... BuildConfig.class

Voir https://stackoverflow.com/a/27310034/668400

12
spatialist

Mieux vaut prévenir que guérir. Cela n’aidera peut-être pas cette situation particulière, mais pour que les futurs développeurs évitent de se retrouver dans cette situation, veuillez noter la recommandation JLS dans Chapitre 6. Noms qui traite de ce problème: 

Noms de paquets

Les développeurs doivent prendre des mesures pour éviter la possibilité que deux packages Publiés portent le même nom en choisissant des noms de package uniques pour les packages Largement distribués. Ceci permet aux paquets d'être facilement installés et catalogués automatiquement. Cette section Spécifie une convention suggérée pour la génération de tels noms de paquetages Uniques. Les implémentations de la plate-forme Java SE sont invitées à Fournir une prise en charge automatique pour la conversion d'un ensemble de packages à partir de noms de packages locaux Et occasionnels au format de nom unique décrit ici.

Si des noms de package uniques ne sont pas utilisés, des conflits de noms de package peuvent Survenir loin du point de création de l'un des packages en conflit . Cela peut créer une situation difficile ou impossible À résoudre par l'utilisateur ou le programmeur. La classe ClassLoader peut être Utilisée pour isoler des packages portant le même nom les uns des autres dans les cas Dans lesquels les packages auront des interactions contraintes, mais pas De manière transparente. à un programme naïf.

Vous formez un nom de package unique en ayant d’abord (ou appartenant à une organisation Qui possède) un nom de domaine Internet, tel que Oracle.com. Vous inversez ensuite ce nom, composant par composant, en Dans cet exemple , com.Oracle, et utilisez-le comme préfixe pour vos noms de package, en utilisant une convention développée au sein de votre organisation pour mieux administrer les noms de package. Une telle convention peut spécifier que certains composants de nom de package Soient des noms de division, département, projet, machine ou .

1
Jonathan Rosenne

Le nom de package est un identifiant unique pour un package. Par conséquent, vous ne devez pas avoir le même nom de package pour la bibliothèque et l'application. Modifiez le nom du package pour la bibliothèque si l'application est déjà publiée.

0
StenSoft

travaillé en tant que 2.2, grade 2.14.1

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

détails: new-build-system

0
w7849516230