項目開發中,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~