繁体   English   中英

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

[英]Android Studio using a library and project with the same package name

我有一个库用作所有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下发布的,因此我无法对其进行更改。 至于图书馆,出于历史原因,它具有相同的名称。 生成项目时,出现以下错误:

失败:构建失败,发生异常。

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

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

我不想更改库或应用程序的软件包名称。 我不确定在哪里添加“ android.enforceUniquePackageName = false”。 有任何想法吗? 另外,如何解决超过1.0(我已经在使用)的问题?

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

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

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

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

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

一盎司的预防值得一磅的治疗。 这可能对这种情况没有帮助,但是对于将来的开发人员来说,避免陷入这种情况,请注意第6章中的JLS建议。解决这个问题的名称

包装名称

开发人员应采取步骤,为分布广泛的软件包选择唯一的软件包名称,以避免两个已发布的软件包具有相同名称的可能性。 这样可以轻松,自动地安装和分类软件包。 本节指定了用于生成此类唯一程序包名称的建议约定。 鼓励Java SE平台的实现提供自动支持,以将一组软件包从本地和临时软件包名称转换为此处描述的唯一名称格式。

如果不使用唯一的程序包名称,则与创建任何一个冲突程序包的位置相距很远,可能会引起程序包名称冲突。 这可能会导致用户或程序员难以解决或无法解决的情况。 在某些情况下,如果程序包之间的交互受到约束,则可以使用ClassLoader类将具有相同名称的程序包彼此隔离开来,但这种方式对于天真的程序不透明。

通过首先拥有(或属于拥有互联网域名)例如oracle.com的组织来形成唯一的软件包名称。 然后,您逐个组件颠倒此名称,以获取com.oracle(在此示例中),并将其用作包名称的前缀,并使用组织内部开发的约定来进一步管理包名称。 这样的约定可以指定某些程序包名称组件为部门,部门,项目,机器或登录名。

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

工作于2.2,gradle 2.14.1

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

详细信息: 新建系统

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM