簡體   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