项目开发中,AS(Android Studio)常常会用到经过关键字在项目空间下搜索对应结果。最常常用到的Find in Path
。例如打开Find in Path
后,能够选中Scope
tab,选择All Places
范围去搜索对应的关键字,下方会自动显示对应的搜索结果。 html
Find in Path
搜索时,可选的tab有In Project
、Module
、Directory
和Scope
。同时Scope
下又细分了不少选项,即对应的选择条件,例如All Places
、Project Files
、Project Source Files
等等。可是不管是哪一种tab,以及Scope
tab下的哪一种方式,有一点咱们必须意识到的是,默认状况下是不包含非项目文件
的。也就是说,对当前项目目录而言,经过Find in Path
搜索时,哪怕选的是Scope
下的All Places
,搜索的结果在必定意义上而言,都不是完整的。仅仅只是列出了项目文件中对应的匹配结果。 java
纳尼 ?
....
是的。
复制代码
这里首先牵涉到一个名词,非项目文件
,即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
是的,此时依然是不包含非项目文件
的。
AS中每一个模块,在构建项目以前,都有一个sync
的过程。这其中,包括对每个模块的配置声明,模块的配置声明,是有sync
过程当中的Gradle Task
产生,会造成一个.iml
的文件。每一个模块下的.iml
文件中,都包括了模块名,模块路径,依赖库信息,语言及版本,模块目录等信息。其中,模块目录中就包括了sourceFolder
和excludeFolder
声明。
如:
<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
指定后看成了非项目文件
处理的。所以,一开始是没有显示的。
实际项目开发中,经过Find in Path
方式进行关键字搜索时,本意每每是但愿查得指定条件下的全部搜索结果,而且,通常状况下,咱们甚至并不知道还有个非项目文件
这个概念存在的。尤为在须要针对项目构建过程当中的 中间产物 也进行搜索,以此寻得可能的蛛丝马迹,这在特定的需求场景下是很是有意义的。经过上述分析也知道了,Find in Path
这种搜索方式是不起做用的,即便是自定义的Scope
也是不行的。
固然,这里须要做出两点澄清:
1,在Find in Path
搜索时,选择Directory
tab时,若是在已知的既定的非项目文件
目录下搜索,是能够搜索到对应的结果的,由于此时,至关于已经强行指定了非项目文件
的目录中去搜索了。可是,若是在非项目文件
目录的父目录,且此父目录为项目文件目录,此时,搜索都是失效的。
能够直观感觉下下列对比。
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
复制代码
经过Find in Path
搜索关键字时,都是忽略掉非项目文件
的,而非项目文件
,则是由Gradle生成的.iml
文件中指定的。所以,如若想进行项目目录下的全局搜索,使用Find in Path
搜索结果每每都是不完整的。此时,回归自己,直接寻求grep
能够替代此类需求。
注:.iml
中非项目文件
的声明,与Gradle版本有关,本文对应各环境以下。
Gralde: 4.6
AS:3.5.1
AGP: 3.2.1
复制代码
end~