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~

相關文章
相關標籤/搜索