Android Studio使用具有相同包名的库和项目

时间:2015-02-09 19:01:37

标签: android android-studio gradle

我有一个库,我用作所有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名称。当我构建项目时,我收到以下错误:

  

失败:构建因异常而失败。

     

      
  • 出了什么问题:任务执行失败&#39 ;: exampleCom:processDebugResources&#39;。

         
        

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

  • 中强制执行     

  

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

4 个答案:

答案 0 :(得分:13)

您可以在android下的app modules build.gradle文件中添加enforceUniquePackageName = false:

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

不幸的是,这会导致构建工具中出现未修复错误的另一个问题。

  

错误:任务执行失败   &#39;:应用程序:packageAllDebugClassesForMultiDex&#39 ;.   java.util.zip.ZipException:重复条目:... BuildConfig.class

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

答案 1 :(得分:3)

一盎司的预防值得一磅治疗。它可能对这种特殊情况没有帮助,但是对于未来的开发人员避免陷入这种情况,请注意Chapter 6. Names中的JLS建议,该建议解决了这个问题:

  

包名称

     

开发人员应采取措施避免两次发布的可能性   通过选择唯一的包名称来具有相同名称的包   广泛分发的包。这允许包   轻松自动安装和编目。这个部分   指定用于生成此类唯一包的建议约定   名。鼓励Java SE平台的实现   为从本地转换一组包提供自动支持   和休闲包名称为此处描述的唯一名称格式。

     

如果未使用唯一的包名称,则包名称冲突可能会发生   远远不是任何一个冲突的创造点   包。这可能会造成困难或不可能的情况   供用户或程序员解决。 ClassLoader类可以   用于隔离那些具有相同名称的包   包会有约束交互的情况,但不是   以一种对幼稚程序透明的方式。

     

您首先拥有(或属于   具有互联网域名的组织,例如oracle.com。   然后,您可以逐个组件地反转此名称,以获取此名称   例如,com.oracle,并将其用作包名称的前缀,   使用贵组织内部制定的惯例进一步推进   管理包名称。这样的约定可能会指明某些   包名称组件是部门,部门,项目,机器或   登录名。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

工作为2.2,gradle 2.14.1

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

细节:new-build-system