0

我们确实有 2 个类似的应用程序项目。第一个是针对我国的,第二个是针对欧盟的。它们是 %90 相同的可能更多。我们确实希望将这两个项目合并为一个,并使用构建变体在它们之间切换。那可能吗?如果是,我该怎么做?

主要项目

@OnClick(R.id.image_view)
    public void onClicked(View view) {
        if (isXEnabled) {
            ImageView.setImageResource(R.drawable.inactive);
            ImageView.setContentDescription(getString(R.string.passive));
            presenter.sendCommand();
            isEnabled = false;
        } else {
            ImageView.setImageResource(R.drawable.active);
            ImageView.setContentDescription(getString(R.string.active));
            presenter.disableFeature();
            isEnabled = true;
        }
    }

欧盟项目

@OnClick(R.id.image_view)
    public void onClicked(View view) {
        if (isXEnabled) {
            ImageView.setImageResource(R.drawable.EuInactive);
            ImageView.setContentDescription(getString(R.string.EUpassive));
            presenter.sendCommand();
            isEnabled = false;
        } else {
            ImageView.setImageResource(R.drawable.active);
            ImageView.setContentDescription(getString(R.string.EUactive));
            presenter.disableFeature();
            isEnabled = true;
        }
    }

例如,某些可绘制对象在 EU Project 上是不同的

- 或者 -

主要项目

@OnClick(R.id.image_view)
    public void onClicked(View view) {
        if (isXEnabled) {
            ImageView.setImageResource(R.drawable.inactive);
            ImageView.setContentDescription(getString(R.string.passive));
            presenter.sendCommand();
            isEnabled = false;
            DoSomething();
        } else {
            ImageView.setImageResource(R.drawable.active);
            ImageView.setContentDescription(getString(R.string.active));
            presenter.disableFeature();
            isEnabled = true;
        }
    }

欧盟项目

@OnClick(R.id.image_view)
    public void onClicked(View view) {
        if (isXEnabled) {
            ImageView.setImageResource(R.drawable.inactive);
            ImageView.setContentDescription(getString(R.string.passive));
            presenter.sendCommand();
            isEnabled = false;
            DoSomethingElse();
        } else {
            ImageView.setImageResource(R.drawable.active);
            ImageView.setContentDescription(getString(R.string.active));
            presenter.disableFeature();
            isEnabled = true;
        }
    }

在此示例中,我们确实添加了不同的行,其他一切都相似。

这种差异有近千个,完全相同的类有近五百个,新的类有两百个。

总之,如何在一个项目中使用构建变体来管理这两个项目?

编辑 2:我已经尝试了这些步骤。

  1. 实施维度
  2. 实施风味
  3. 为 eu 项目创建 res、asset、java 文件
  4. 在 gradle 中为 eu 项目创建了 sourceSet

现在构建变体看起来像这个 mainDevDebug,EuDevDebug,......等等 main...... 工作正常,但我有一个错误 Eu..... 那些

重建或运行应用程序时出现错误消息:

Could not determine the dependencies of task ':app:compileEuTestDebugJavaWithJavac'.
> Could not resolve all task dependencies for configuration ':app:EuTestDebugCompileClasspath'.
   > Could not resolve project :com.xx.core.main.core.
     Required by:
         project :app
      > No matching configuration of project :com.xx.core.main.core was found. The consumer was configured to find an API of a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'debug', attribute 'project' with value 'Eu', attribute 'default' with value 'Test', attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm' but:
          - None of the consumable configurations have attributes.
4

1 回答 1

0

从您发布的代码和评论中,我相信您将能够通过产品风味来实现您正在寻找的东西,阅读更多内容

在您的APP级 build.gradle 中,您将执行以下操作:

android {  
    flavorDimensions 'default'
    productFlavors {

        foo{
            dimension 'default'
        }

        bar{
            dimension 'default'
        }

    }
}

这将为您定义两种不同的产品风味,特别是foobar。进行 gradle 同步后,您会看到现在可以将这些作为构建变体使用。

在此处输入图像描述

接下来你要做的是创建一个类似这样的文件夹结构: 在此处输入图像描述

为 main创建一个文件夹bar,为 main 创建一个文件夹,foo然后为 main 创建一个文件夹,每个文件夹内的包签名与您的主要结构使用的内容相匹配。如果您有不同的图像资源,请确保它们位于此处的适当文件夹中。如果您正在努力创建特定类型的文件/文件夹,我建议您将其复制过来。

main 中的所有内容都将用于两种类型的应用程序,因此所有相同的逻辑都将保留在那里。可能不同的所有内容都将驻留在 forbar和 for文件夹中foo。在我的例子中,一个简单的类叫做Example

class Example {

    fun giveValue(context: Context): String {
        return context.getString(R.string.value)
    }
}

这两个类的实现在两个文件夹中完全相同,尽管您的可能(并且将会)完全不同。

您还将看到我已将 strings.xml 添加到我的产品风格中(在您的情况下,这可能也是图像资源),我添加了以下字符串:

<resources>
    <string name="value">from bar</string>
</resources>

进入bar目录下的strings.xml,然后

<resources>
    <string name="value">from foo</string>
</resources>

进入foo目录下的strings.xml

因此,我的类只返回基于构建变体的Example任何值

就是这样。

在我的主要活动中:

  val result = Example().giveValue(this)
        Log.v("testing", result) 

所以,根据我使用的构建变体(或者fooDebug or barDebug),输出会有所不同。

于 2021-01-07T14:01:08.120 回答