Java 如何避免使用应用程序';源代码中的包名是什么?

Java 如何避免使用应用程序';源代码中的包名是什么?,java,android,Java,Android,我的Android应用程序源代码包括以下代码行: import lfreytag.TideNowOR.R; 为了在不同的项目中使用此源代码,我希望 从导入中删除包名,因为我必须每次更改它 项目我正在使用Android Studio。在基于此源代码的其他应用程序中,包名的最后部分会有所不同,例如TideNowOR、TideNowWA、TideNowCA等 作为背景,我试图将所有特定于版本的信息作为简单的文本文件放在原始目录中。因此,我可以生成一个新版本,只需更改清单并将其转储到新的文本文件集合中

我的Android应用程序源代码包括以下代码行:

import lfreytag.TideNowOR.R;
为了在不同的项目中使用此源代码,我希望 从导入中删除包名,因为我必须每次更改它 项目我正在使用Android Studio。在基于此源代码的其他应用程序中,包名的最后部分会有所不同,例如TideNowOR、TideNowWA、TideNowCA等


作为背景,我试图将所有特定于版本的信息作为简单的文本文件放在原始目录中。因此,我可以生成一个新版本,只需更改清单并将其转储到新的文本文件集合中。谢谢。

在使用java时,请记住,包是一个名称空间,它实际上允许程序员组织代码。请检查以了解它是什么以及为什么需要它

现在,是否可以不在源代码中使用该包? 可能是,但肯定不是很方便,因为您必须告诉编译器在哪里找到您需要的所有类,这意味着要设置一个非常繁重的类路径(了解类路径)

您可能会为非常简单的java应用程序执行此操作,但谁知道对于更复杂的应用程序(如android应用程序),您需要做多少工作呢


总之如果它没有损坏,不要试图修复它

您可以将它打包成一个(AAR)。这将允许您在不同的程序之间共享代码和资源。

首先,创建一个脚本来遍历您的文件并更改包名并不太困难。因此,如果你真的只想更改包名,我会运行一个脚本来更改包名,viola,你有一个新的应用程序

但是,我建议针对您的情况采用这种方法:

  • 创建一个Android Studio项目
  • 使您当前的“应用程序”成为“库”模块
  • 拥有您想要继承该库的尽可能多的“应用程序”模块
  • “应用程序”中的strings.xml将覆盖库中的strings.xml
  • 因此,不要试图将字符串放入原始目录,而是使用Android设计的strings.xml。Android Gradle编译器相当智能。如果在库模块和应用模块的strings.xml中定义了相同的字符串,它将拾取应用模块的字符串。这样,您就可以用不同的字符串实现多个应用程序

    编辑:

    另一种可能的解决方案是将项目中的所有文件包括在内,然后根据标准(如应用程序名称或包名称)切换每个应用程序显示的文件。有一个
    Context.getPackageName()
    ,但不能在导入语句中使用

    另一编辑:


    基本上,通过选择将文件放入“raw”目录,可以将文件绑定到包.R导入。如果您使用了assets文件夹,您可以绕过它。

    向Android Studio Flavors问好。

    不仅可以使用一个命令创建多个生成,还可以为每个生成指定其自己的包名和文件夹结构

    我想说更多关于这一点,但已经有很多人在网站上这样做了


    这里有一个很好的链接:

    我不是100%确定你在问什么,但我认为这个问题是基于一些我想消除的误解

    import lfreytag.TideNowOR.R;
    
    正在导入对特定模块()中定义的资源的引用。这些资源包括res文件夹中的所有内容(字符串、ID、绘图、布局等)

    此导入必须包括包名称,因为该名称是代码的命名空间。名称空间是所有现代编程语言的基本元素,可以避免共享同一名称的多个标识符之间的名称冲突

    在不同项目中使用通用代码的方法(假设您使用Android Studio和Gradle进行构建)是:

  • 创建一个单独的项目,并将该项目作为依赖项添加到不同的应用程序中,例如,请参见此处:
  • 创建库模块并在应用程序模块中引用该模块:
  • 使用flavors可使用不同的软件包名称和“版本特定信息”
  • 在前两种情况下,构建工具将负责将库lfreytag.TideNowOR包名“转换”为应用程序包名lfreytag.TideNowWA或任何您需要的内容。它将基本上创建一个aar包,以便在其他项目/模块中重用

    从你的描述来看,选项3似乎是最好的选择,我想解释一下你如何构建你的项目,使其能够拥有通用代码和不同的“应用程序”

    截图显示了我的一个项目,其中一个主节点是您希望在不同的“应用程序”中重用的lfreytag.Tidenowr代码。它可以包含典型Android项目的所有元素,如实际的Java代码、资源文件和资产文件夹中的文件

    该应用程序有不同的风格,这些风格映射到您所谓的“应用程序”(在屏幕截图中,风格是免费的、专业的和专业的亚马逊节点)

    风味是应用程序的变体,可以定义自己的包名、拥有自己的清单、设置清单中使用的变量(例如,应用程序名或ContentProvider权限)或代码中使用的变量(用于区分不同风味的标志、特定于风味的字符串等)

    要在清单中为不同的风格(或您的“应用程序”)使用不同的包名,您可以在构建文件中定义applicationId,如下所示:

        defaultConfig {
            applicationId "lfreytag.TideNowOR"
        }
    
        productFlavors {
            wa {
                applicationId "lfreytag.TideNowWA"
            }
            ca {
                applicationId 'lfreytag.TideNowCA'
            }
    // .. more flavors
        }
    
    要为不同的口味使用不同的应用程序名称,请执行以下操作:

    defaultConfig {
        manifestPlaceholders = [appName: "Tide Now Oregon"]
    }
    wa {
        manifestPlaceholders = [appName: "Tide Now Washington"]
    }
    
    在生成文件和清单的以下文件中:

    <application
        android:name="MyApp"
        android:label="${appName}"
    

    长话短说,不要担心更改Java包名称。事实上,我会从中删除任何特定的标识符,以便它是通用的,比如com.lfreytag.tidenow

    当新的Gradle建立时
    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 23
        buildToolsVersion "23.0.1"
    
        defaultConfig {
            applicationId "com.lfreytag.tidenow"
            minSdkVersion 7
            targetSdkVersion 23
            versionCode 1
            versionName "1.0"
        }
    
        productFlavors {
            wa {
                applicationId "com.lfreytag.tidenow.wa"
            }
    
            or {
                applicationId "com.lfreytag.tidenow.or"
            }
    
            ca {
                applicationId "com.lfreytag.tidenow.ca"
            }
    
            ... etc ...
        }
    
        buildTypes {
            ...
        }
    }
    
    dependencies {
        ...
    }