在Android Studio中从构建中排除一个类

66
我在过去的几个月中一直在学习Android,并使用Eclipse v4.2(Juno)作为我的IDE。
我正在尝试迁移到Android Studio。我如何排除一些我尚未完成的构建路径中的类?
在Eclipse中,这是一个简单的右键单击。我在Android Studio中找不到任何参考信息。

1
如果你正在学习,为什么要尝试迁移到一个未发布的预览产品呢?这需要经验才能成功使用并解决其中的各种错误。 - Simon
1
好问题,西蒙。我看到墙上的字迹了。此外,在文档和StackOverflow之间,我已经能够应用最佳实践构建一个应用程序。 - Beyond4D
7个回答

89

据我所知,IntelliJ允许排除包。在Linux中打开项目结构Ctrl+Alt+Shift+S),然后进入模块->源码选项卡。

如果只想排除一个类,则可以使用Gradle构建文件。

Android Studio使用Gradle,因此在build.gradle文件中,在android配置内添加一个自定义SourceSet来排除您的类,例如:

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.3"

    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 19
        packageName "org.homelab.lab"
        testPackageName "org.homelab.lab.test"
    }

    sourceSets {
        main {
            java {
                exclude '**/SomeExcludedClass.java'
            }
        }
        androidTest {
            java {
                exclude '**/TestSomeExcludedClass.java'
            }
        }
    }
}

1
我们可以在构建类型中排除文件吗?如果可能的话,我们是否可以像在sourceSets中那样做? - Ahmed
4
答案已过时。第一部分对我没有起作用。第二部分可能也不行。 - Vedant Agarwala
2
目前这个是可行的,使用AndroidStudio 3.1。一个很好的特性是Java类被构建忽略了,但你仍然可以看到检查时列出的错误等。在重构代码时非常有用,即使在更改代码的依赖项后,您仍希望保留旧代码以供参考。 - Brendon Whateley
1
它不起作用。有更新吗?自此答案发布以来发生了什么变化? - SirKnigget
1
有更新吗?我也遇到了这个问题! - lawonga
显示剩余5条评论

13

它在Android Studio v3.0上运行良好:

apply plugin: 'com.android.application'

android {
    defaultConfig {...}
    buildTypes {...}
    sourceSets {
        main {
            java {
                exclude 'com/example/full/package/path/MainActivity.java'
            }
        }
    }
}

6

这是不可能的。

也许在2013年5月提供答案时可以实现,但现在不行了(截至Android Studio 1.2版本)。

问题在于:Sourceset组件应该更像Java组件

根据标签,他们正在针对Android Studio 1.5添加这些功能。


那个链接说:“sourcesets 的 java/resources 组件允许包含/排除模式。我们应该为 aidl/rs/jni/assets 做这个。”听起来他们期望“java”排除目前正在工作。 - Brian White
@BrianWhite 感谢您的纠正。很高兴听到这得到了支持。 - Tom
不,它不被支持。至少对我来说是这样的。问题明确提到了aidl/rs/jni/assets,但没有提到Java。 - Brian White
3
当我看到 https://www.jetbrains.com/idea/help/excluding-files-from-project.html 时感到非常兴奋,但是当我注意到一个小小的提示“此操作不适用于 Java 文件和二进制文件。”后,我感到很失望。 - Someone Somewhere
被接受的答案中的Gradle选项仍然有效。 - Mick O'Hea

0

对于我的情况,我需要防止一个整个文件夹,我是通过以下方式实现的 -

    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
            java {
                exclude 'com/example/myfolder'
 /* The holder name I want to excludes its all classes */
            }
        }
    }

0

https://dev59.com/M7Hma4cB1Zd3GeqPK2VE#69261642转载,但在这里重复似乎很有用。

我发现了一种方法,可以使这个方法特别适用于Android单元测试(但我假设它是可适应的),使用了上面链接中其他解决方案的组合:

def filesToExclude = [
    '**/*TestOne*.kt',
    '**/*TestTwo*.kt',
    ...
]
tasks.withType(org.gradle.api.tasks.SourceTask.class).configureEach {
  it.exclude(filesToExclude)
}
android.sourceSets.test.kotlin.exclude(filesToExclude)

在我的特定情况下,由于其他生成(具体来说是使用kapt的Dagger),测试名称周围的额外通配符是必需的。
这似乎是一种有点hacky的方法,但它通过确保测试目标从所有它实际上可以被排除的任务中排除(包括构建和kapt任务)来实现。源集排除仍然是必要的,以便文件不会被编译(我认为这是Kotlin Gradle插件在做,但它也可能是Android Gradle插件 - 我对调试Gradle构建不太熟悉,无法确定)。

0
我以前做同样的事情的方法是,
对于Windows:右键单击Java文件→在资源管理器中显示→将文件扩展名从“.java”更改为“.c”。
对于Mac:右键单击Java文件→在Finder中显示→将文件扩展名从“.java”更改为“.c”。
就这么简单。

-1

将它移动到一个新文件夹中。

右键单击 → 在资源管理器中显示 → 剪切,然后粘贴到一个新文件夹中(不在任何项目之内)。

我刚刚在AndroidStudioProjects文件夹中创建了一个新文件夹,并把它们放在那里。


7
这是我能想到的针对这个问题最丑陋的解决方案,但却是我最终采取的。 :-( - Bowi
如果您移动文件,那么所有连接的类和资源将会断开,这将导致另一个问题。 不好。 - Tuhin Subhra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接