【问题标题】:Android Studio using a library and project with the same package nameAndroid Studio 使用具有相同包名的库和项目
【发布时间】:2015-02-09 19:01:37
【问题描述】:

我有一个库用作我所有 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 之后的问题(我已经在使用)?

【问题讨论】:

  • 我也面临同样的问题。你有一些解决方案来处理这种情况吗?

标签: android android-studio gradle


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 添加enforceUniquePackageName = false
  • 我使用的是 Android Studio 2.1.2。我有一个库模块,它使用与主应用程序模块相同的包名。将enforceUniquePackageName = false 添加到应用程序模块的build.gradle 文件中(如spatialist 所建议)解决了该问题。我没有得到他提到的“重复输入”问题。
  • 这里也一样,但是这是由我在libs目录中的本地jar依赖引起的
【解决方案2】:

一盎司的预防胜过一磅的治疗。这可能无助于这种特殊情况,但为了让未来的开发人员避免陷入这种情况,请注意 Chapter 6. Names 中的 JLS 建议,它解决了这个问题:

包名

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

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

您首先拥有(或属于 具有) Internet 域名的组织,例如 oracle.com。 然后,您可以逐个组件反转此名称,以获得,在此 例如,com.oracle,并将其用作包名称的前缀, 使用您的组织内制定的约定来进一步 管理包名称。这样的约定可能会规定某些 包名称组件是部门、部门、项目、机器或 登录名。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 请阅读我的问题。我无法更改任何一个包的名称。主要原因是该库有许多资源正在应用程序(R.class)中使用,这需要对应用程序中的 java 代码进行重大更改。
    • 您可以尝试在build.gradle 中设置值,但它可能无法正常工作,因为Gradle 使用包名称来唯一标识要编译的内容。
    【解决方案4】:

    作为 2.2 工作,gradle 2.14.1

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

    详情:new-build-system

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      相关资源
      最近更新 更多