Android Studio中的非項目文件及項目目錄下的全局搜索


一、背景

項目開發中,AS(Android Studio)經常會用到通過關鍵字在項目空間下搜索對應結果。最經常用到的Find in Path。例如打開Find in Path后,可以選中Scope tab,選擇All Places范圍去搜索對應的關鍵字,下方會自動顯示對應的搜索結果。

 

Find in Path搜索時,可選的tab有In ProjectModuleDirectoryScope。同時Scope下又細分了很多選項,即對應的選擇條件,例如All PlacesProject FilesProject Source Files等等。但是無論是哪種tab,以及Scope tab下的哪種方式,有一點我們必須意識到的是,默認情況下是不包含非項目文件的。也就是說,對當前項目目錄而言,通過Find in Path搜索時,哪怕選的是Scope下的All Places,搜索的結果在一定意義上而言,都不是完整的。僅僅只是列出了項目文件中對應的匹配結果。


 

納尼 ?
....

是的。
復制代碼

二、非項目文件

2.1 自定義Scope不包含非項目文件

這里首先牽涉到一個名詞,非項目文件,即non-project files。那到底哪些是非項目文件非項目文件又是如何指定的呢?

我們先來直接感受下:

在上圖選中Scope tab的情況下,如果我們點擊其右邊的...,會進入到一個Scopes的自定義界面,在這個界面中,我們可以新增、編輯或刪除自定義的Scope,其實說白了,就是可以自定義搜索的范圍,這個范圍,是依據合乎Scope Pattern的模式去對應匹配范圍,然后就可以針對此范圍進行關鍵字搜索。

例如,如果我想針對Buil目錄范圍去搜索,可以如下操作:
點擊+ >> Local >> 命名Build,此時可以看到如下界面。

其中,就赫然發現了上述中的 non-project files這一稱謂。並且,即使是我們自定義的 Scope,無論怎樣設置 Pattern,也將不會包括 非項目文件

 

Scope Pattern官方文檔說明如下:
www.jetbrains.com/help/idea/2…

最簡單的,我們填入一個針對項目全局目錄下的Pattern,可以看到圖示結果。

 

此時,點擊OK,表明自定義的Scope范圍創建成功。

我們重新看下搜索結果。

 

是的,此時依然是不包含非項目文件的。

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指定后當作了非項目文件處理的。因此,一開始是沒有顯示的。


三、項目目錄全局搜索

實際項目開發中,通過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 復制代碼

四、結語

通過Find in Path搜索關鍵字時,都是忽略掉非項目文件的,而非項目文件,則是由Gradle生成的.iml文件中指定的。因此,如若想進行項目目錄下的全局搜索,使用Find in Path搜索結果往往都是不完整的。此時,回歸本身,直接尋求grep可以替代此類需求。

注:.iml非項目文件的聲明,與Gradle版本有關,本文對應各環境如下。

Gralde: 4.6
AS:3.5.1
AGP: 3.2.1
復制代碼

end~


作者:HappyCorn
鏈接:https://juejin.im/post/5dbed1866fb9a0204b15510b
來源:掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM