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下发布的,所以我无法更改它的应用程序。 至于图书馆,由于历史原因,它有相同的名字。 当我构build项目时,出现以下错误:

失败:生成失败,出现exception。

  • 出了什么问题:执行失败的任务':exampleCom:processDebugResources'。

错误:库使用与此项目相同的包:com.example.android您可以使用android.enforceUniquePackageName = false暂时禁用此错误但是,这是临时的,将在1.0

我不想更改库或应用程序的包名称。 我不知道在哪里添加“android.enforceUniquePackageName = false”。 有任何想法吗? 另外,如何解决1.0以上(我已经使用)?

Solutions Collecting From Web of "Android Studio使用包名称相同的库和项目"

您可以在android:下的应用程序模块build.gradle文件中添加enforceUniquePackageName = false。

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

不幸的是,这会导致另一个问题,即构build工具中的一个不确定的错误。

错误:任务':app:packageAllDebugClassesForMultiDex'的执行失败。 java.util.zip.ZipException:重复条目:… BuildConfig.class

请参阅https://stackoverflow.com/a/27310034/668400

一盎司的预防是值得一磅的治疗。 这可能不会有助于这种情况,但是为了避免未来的开发人员陷入这种情况,请注意第6章中的JLSbuild议。解决这个问题的名称 :

包名称

开发人员应采取措施,通过为广泛分发的软件包select唯一的软件包名称,以避免发布两个具有相同名称的软件包。 这使软件包可以轻松自动安装和编目。 本部分为生成这种唯一的包名称指定了一个build议的约定。 鼓励Java SE平台的实现提供自动支持,将一组软件包从本地和临时软件包名称转换为此处描述的唯一名称格式。

如果没有使用唯一的软件包名称,那么软件包名称冲突可能远远超出创build任何冲突软件包的程度。 这可能会造成用户或程序员难以解决的情况。 ClassLoader类可以被用来隔离那些软件包的交互受到限制的情况下的相同名称的程序包,但是对于一个简单的程序来说却不是这样。

您首先拥有(或属于具有)Internet域名的组织(例如oracle.com),形成唯一的软件包名称。 然后,通过组件逐个反转此名称,以获取(在本例中为com.oracle),并使用此名称作为软件包名称的前缀,并使用组织内开发的约定来进一步pipe理软件包名称。 这样的约定可能会指定某些软件包名称组件是分区,部门,项目,机器或login名。

包名称是包的唯一标识符,因此库和应用程序不应具有相同的包名称。 如果应用程序已经发布,请更改库的包名称。

工作于2.2,Gradle 2.14.1

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

细节: 新build系统