Android Studio中的非项目文件及项目目录下的全局搜索

1、背景

项目开发中,AS(Android Studio)常常会用到经过关键字在项目空间下搜索对应结果。最常常用到的Find in Path。例如打开Find in Path后,能够选中Scope tab,选择All Places范围去搜索对应的关键字,下方会自动显示对应的搜索结果。 html

Find in Path搜索时,可选的tab有In ProjectModuleDirectoryScope。同时Scope下又细分了不少选项,即对应的选择条件,例如All PlacesProject FilesProject Source Files等等。可是不管是哪一种tab,以及Scope tab下的哪一种方式,有一点咱们必须意识到的是,默认状况下是不包含非项目文件的。也就是说,对当前项目目录而言,经过Find in Path搜索时,哪怕选的是Scope下的All Places,搜索的结果在必定意义上而言,都不是完整的。仅仅只是列出了项目文件中对应的匹配结果。 java


纳尼 ?
....

是的。
复制代码

2、非项目文件

2.1 自定义Scope不包含非项目文件

这里首先牵涉到一个名词,非项目文件,即non-project files。那到底哪些是非项目文件非项目文件又是如何指定的呢?android

咱们先来直接感觉下:git

在上图选中Scope tab的状况下,若是咱们点击其右边的...,会进入到一个Scopes的自定义界面,在这个界面中,咱们能够新增、编辑或删除自定义的Scope,其实说白了,就是能够自定义搜索的范围,这个范围,是依据合乎Scope Pattern的模式去对应匹配范围,而后就能够针对此范围进行关键字搜索。es6

例如,若是我想针对Buil目录范围去搜索,能够以下操做:
点击+ >> Local >> 命名Build,此时能够看到以下界面。 bash

其中,就赫然发现了上述中的 non-project files这一称谓。而且,即便是咱们自定义的 Scope,不管怎样设置 Pattern,也将不会包括 非项目文件

Scope Pattern官方文档说明以下:
www.jetbrains.com/help/idea/2…ide

最简单的,咱们填入一个针对项目全局目录下的Pattern,能够看到图示结果。 gradle

此时,点击OK,代表自定义的Scope范围建立成功。ui

咱们从新看下搜索结果。 url

是的,此时依然是不包含非项目文件的。

2.2 非项目文件的指定

AS中每一个模块,在构建项目以前,都有一个sync的过程。这其中,包括对每个模块的配置声明,模块的配置声明,是有sync过程当中的Gradle Task产生,会造成一个.iml的文件。每一个模块下的.iml文件中,都包括了模块名,模块路径,依赖库信息,语言及版本,模块目录等信息。其中,模块目录中就包括了sourceFolderexcludeFolder声明。

如:

<content url="file://$MODULE_DIR$">
    <sourceFolder url="file://$MODULE_DIR$/build/generated/source/kapt/devDebug" isTestSource="false" generated="true" />
    <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/dev/debug" isTestSource="false" generated="true" />
    <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/dev/debug" isTestSource="false" generated="true" />
    <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/dev/debug" isTestSource="false" generated="true" />
    <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/dev/debug" isTestSource="false" generated="true" />
    <sourceFolder url="file://$MODULE_DIR$/build/generated/source/kaptKotlin/devDebug" isTestSource="false" generated="true" />
    <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/dev/debug" type="java-resource" generated="true" />
    <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/dev/debug" type="java-resource" generated="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/devDebug/res" type="java-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/devDebug/resources" type="java-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/devDebug/assets" type="java-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/devDebug/aidl" isTestSource="false" />
    <sourceFolder url="file://$MODULE_DIR$/src/devDebug/java" isTestSource="false" />
    <sourceFolder url="file://$MODULE_DIR$/src/devDebug/rs" isTestSource="false" />
    <sourceFolder url="file://$MODULE_DIR$/src/devDebug/shaders" isTestSource="false" />
    <sourceFolder url="file://$MODULE_DIR$/build/generated/source/kapt/devDebugAndroidTest" isTestSource="true" generated="true" />
    <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/androidTest/dev/debug" isTestSource="true" generated="true" />
    <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/dev/debug" isTestSource="true" generated="true" />
    <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/dev/debug" isTestSource="true" generated="true" />
    <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/dev/debug" isTestSource="true" generated="true" />
    <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/dev/debug" type="java-test-resource" generated="true" />
    <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/dev/debug" type="java-test-resource" generated="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTestDevDebug/res" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTestDevDebug/resources" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTestDevDebug/assets" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTestDevDebug/aidl" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTestDevDebug/java" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTestDevDebug/rs" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTestDevDebug/shaders" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/build/generated/source/kapt/devDebugUnitTest" isTestSource="true" generated="true" />
    <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/test/dev/debug" isTestSource="true" generated="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/testDevDebug/res" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/testDevDebug/resources" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/testDevDebug/assets" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/testDevDebug/aidl" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/testDevDebug/java" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/testDevDebug/rs" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/testDevDebug/shaders" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/dev/res" type="java-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/dev/resources" type="java-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/dev/assets" type="java-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/dev/aidl" isTestSource="false" />
    <sourceFolder url="file://$MODULE_DIR$/src/dev/java" isTestSource="false" />
    <sourceFolder url="file://$MODULE_DIR$/src/dev/rs" isTestSource="false" />
    <sourceFolder url="file://$MODULE_DIR$/src/dev/shaders" isTestSource="false" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTestDev/res" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTestDev/resources" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTestDev/assets" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTestDev/aidl" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTestDev/java" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTestDev/rs" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTestDev/shaders" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/testDev/res" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/testDev/resources" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/testDev/assets" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/testDev/aidl" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/testDev/java" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/testDev/rs" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/testDev/shaders" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
    <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
    <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
    <sourceFolder url="file://$MODULE_DIR$/src/debug/shaders" isTestSource="false" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/res" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/resources" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/assets" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/aidl" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/java" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/rs" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/shaders" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/testDebug/res" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/testDebug/resources" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/testDebug/assets" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/testDebug/aidl" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/testDebug/java" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/testDebug/rs" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/testDebug/shaders" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
    <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
    <sourceFolder url="file://$MODULE_DIR$/src/main/kotlin" isTestSource="false" />
    <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
    <sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTest/kotlin" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
    <sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/test/kotlin" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
    <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
    <excludeFolder url="file://$MODULE_DIR$/build" />
</content>
复制代码

对啦,最后一行的excludeFolder就是本文的主角了。在<content>...</content>中的,excludeFolder声明中的,且不存在于sourceFolder等声明中目录,就是完整意义上的非项目文件

例如,咱们将最后一行excludeFolder声明直接删除,再次从新在Find in Path搜索对应的关键字,获得的结果以下:

发现了没,咱们的搜索结果变多了,多出的结果然是的位置是在build/intermediates/merged_manifests/...目录下。

对比上述的<content>...</content>中的声明,显然,build/intermediates是被excludeFolder指定后看成了非项目文件处理的。所以,一开始是没有显示的。


3、项目目录全局搜索

实际项目开发中,经过Find in Path方式进行关键字搜索时,本意每每是但愿查得指定条件下的全部搜索结果,而且,通常状况下,咱们甚至并不知道还有个非项目文件这个概念存在的。尤为在须要针对项目构建过程当中的 中间产物 也进行搜索,以此寻得可能的蛛丝马迹,这在特定的需求场景下是很是有意义的。经过上述分析也知道了,Find in Path这种搜索方式是不起做用的,即便是自定义的Scope也是不行的。

固然,这里须要做出两点澄清:
1,在Find in Path搜索时,选择Directorytab时,若是在已知的既定的非项目文件目录下搜索,是能够搜索到对应的结果的,由于此时,至关于已经强行指定了非项目文件的目录中去搜索了。可是,若是在非项目文件目录的父目录,且此父目录为项目文件目录,此时,搜索都是失效的。

能够直观感觉下下列对比。

2,在<content>...</content>中人为去掉excludeFolder或修改对应的配置,只是临时性的短时间有效的行为,由于正如前文所说,.iml文件是sync过程当中,由Gradle Task生成的,例如,当咱们修改了build.gradle文件等致使须要从新sync时,.iml文件就会被从新生成,被从新复原。何况,及时真的有办法强制改了此文件,咱们也要面对项目构建时可能会出现的其余莫名问题,很肯能得不偿失。

那么,在面对须要针对项目目录进行全局关键字搜索时,有无其余更好的方案呢?

目前来看,在AS自己,我是没有发现的。最终直接grep大法。

grep -rnl "android.permission.READ_CALL_LOG" .
复制代码

当前目录下,结果都依依列出了。

➜  MyCorn git:(dev) grep -rnl "android.permission.READ_CALL_LOG" .
./MyCorn/build/intermediates/merged_manifests/devDebug/processDevDebugManifest/merged/AndroidManifest.xml
./MyCorn/build/intermediates/transforms/dex/dev/debug/0/classes6.dex
./MyCorn/build/intermediates/transforms/dex/dev/debug/0/classes7.dex
./MyCorn/build/intermediates/tinker_intermediates/AndroidManifest.xml
./MyCorn/build/outputs/logs/manifest-merger-dev-debug-report.txt
./MyCorn/src/main/AndroidManifest.xml
./base/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/mycorn/vendor/js/BaseJsProvider.class
./base/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/mycorn/vendor/js/JsSdkProviderImpl.class
./base/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/mycorn/vendor/js/helper/ContactCallLogHelper$6.class
./.idea/workspace.xml
复制代码

4、结语

经过Find in Path搜索关键字时,都是忽略掉非项目文件的,而非项目文件,则是由Gradle生成的.iml文件中指定的。所以,如若想进行项目目录下的全局搜索,使用Find in Path搜索结果每每都是不完整的。此时,回归自己,直接寻求grep能够替代此类需求。

注:.iml非项目文件的声明,与Gradle版本有关,本文对应各环境以下。

Gralde: 4.6
AS:3.5.1
AGP: 3.2.1
复制代码

end~

相关文章
相关标签/搜索