深入淺出:androidsourcesets全解析

一、什麼是androidsourcesets

androidsourcesets是Android Studio項目中的一個非常重要的概念。它可以讓我們在同一個項目中構建多個版本和變體,每個版本和變體可以有自己的代碼、資源和配置文件。簡單的說,就是我們可以通過androidsourcesets在一個項目中構建出多個獨立的apk。

在一個Android Studio項目中,通常會包含兩個androidsourcesets:main和androidTest。其中main是主要的源碼集,所有版本和變體共享這個源碼集。而androidTest則是測試代碼的源碼集,只有單元測試和Android Instrumentation測試可以使用它。

二、如何使用androidsourcesets

首先,我們需要在build.gradle文件中定義androidsourcesets:

android {
    ...
    sourceSets {
        free {
            manifest.srcFile 'src/free/AndroidManifest.xml'
            java.srcDirs = ['src/free/java']
            res.srcDirs = ['src/free/res']
        }
        paid {
            manifest.srcFile 'src/paid/AndroidManifest.xml'
            java.srcDirs = ['src/paid/java']
            res.srcDirs = ['src/paid/res']
        }
    }
}

上面的代碼定義了兩個androidsourcesets:free和paid。每個androidsourcesets都指定了對應的AndroidManifest.xml、Java源碼和資源文件所在目錄。

接下來,我們可以在同一個項目中構建出多個版本和變體。例如,在創建buildType的時候指定使用的androidsourcesets:

android {
    ...
    buildTypes {
        debug {
            ...
        }
        release {
            ...
        }
        customType {
            ...
            resConfigs "en", "fr"
            initWith debug
            applicationIdSuffix ".customType"
            sourceSets {
                free {
                    manifest.srcFile 'src/customTypeFree/AndroidManifest.xml'
                    java.srcDirs = ['src/customTypeFree/java']
                    res.srcDirs = ['src/customTypeFree/res']
                }
                paid {
                    manifest.srcFile 'src/customTypePaid/AndroidManifest.xml'
                    java.srcDirs = ['src/customTypePaid/java']
                    res.srcDirs = ['src/customTypePaid/res']
                }
            }
        }
    }
}

上面的代碼創建了一個名為customType的buildType。為了使用自定義的androidsourcesets,我們需要在customType里重新定義它們。注意,在customType里我們可以定義不同的資源配置(使用resConfigs)或者應用ID後綴(使用applicationIdSuffix),以便在構建不同的版本和變體時能夠正確的識別它們。

三、androidsourcesets常用場景

1、分渠道打包

在實際開發中,我們經常需要將同一個應用打包成不同的渠道,以便於在市場上進行多渠道推廣。使用androidsourcesets,我們可以很方便的實現這一功能。例如,在build.gradle文件中定義渠道相關的androidsourcesets:

android {
    ...
    productFlavors {
        xiaomi {
            ...
            sourceSets {
                free {
                    manifest.srcFile 'src/xiaomiFree/AndroidManifest.xml'
                    java.srcDirs = ['src/xiaomiFree/java']
                    res.srcDirs = ['src/xiaomiFree/res']
                }
                paid {
                    manifest.srcFile 'src/xiaomiPaid/AndroidManifest.xml'
                    java.srcDirs = ['src/xiaomiPaid/java']
                    res.srcDirs = ['src/xiaomiPaid/res']
                }
            }
        }
        oppo {
            ...
            sourceSets {
                free {
                    manifest.srcFile 'src/oppoFree/AndroidManifest.xml'
                    java.srcDirs = ['src/oppoFree/java']
                    res.srcDirs = ['src/oppoFree/res']
                }
                paid {
                    manifest.srcFile 'src/oppoPaid/AndroidManifest.xml'
                    java.srcDirs = ['src/oppoPaid/java']
                    res.srcDirs = ['src/oppoPaid/res']
                }
            }
        }
    }
}

上面的代碼定義了兩個productFlavors:xiaomi和oppo。每個flavor都定義了對應的androidsourcesets。當使用不同的flavor構建apk時,系統會根據不同的sourceSets打包出不同的apk。

2、分模塊開發

在較大的應用中,為了方便開發和維護,我們可以將應用分成多個模塊進行開發。使用androidsourcesets,我們可以在一個項目中構建多個獨立的模塊和apk。例如,在build.gradle文件中定義不同的androidsourcesets:

android {
    ...
    sourceSets {
        main {
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java.srcDirs = ['src/main/java']
            res.srcDirs = ['src/main/res']
        }
        module1 {
            manifest.srcFile 'src/module1/AndroidManifest.xml'
            java.srcDirs = ['src/module1/java']
            res.srcDirs = ['src/module1/res']
        }
        module2 {
            manifest.srcFile 'src/module2/AndroidManifest.xml'
            java.srcDirs = ['src/module2/java']
            res.srcDirs = ['src/module2/res']
        }
    }
}

上面的代碼定義了三個androidsourcesets:main、module1和module2。每個androidsourcesets都定義了對應的AndroidManifest.xml、Java源碼和資源文件所在目錄。接下來,我們可以在同一個項目中構建出多個獨立的apk。

3、多語言版本開發

在國際化應用中,為了提供更好的用戶體驗,我們需要提供多語言版本的應用。使用androidsourcesets,我們可以很方便的實現這一功能。例如,在build.gradle文件中定義不同語言版本的androidsourcesets:

android {
    ...
    productFlavors {
        english {
            ...
            sourceSets {
                free {
                    manifest.srcFile 'src/englishFree/AndroidManifest.xml'
                    java.srcDirs = ['src/englishFree/java']
                    res.srcDirs = ['src/englishFree/res']
                }
                paid {
                    manifest.srcFile 'src/englishPaid/AndroidManifest.xml'
                    java.srcDirs = ['src/englishPaid/java']
                    res.srcDirs = ['src/englishPaid/res']
                }
            }
        }
        french {
            ...
            sourceSets {
                free {
                    manifest.srcFile 'src/frenchFree/AndroidManifest.xml'
                    java.srcDirs = ['src/frenchFree/java']
                    res.srcDirs = ['src/frenchFree/res']
                }
                paid {
                    manifest.srcFile 'src/frenchPaid/AndroidManifest.xml'
                    java.srcDirs = ['src/frenchPaid/java']
                    res.srcDirs = ['src/frenchPaid/res']
                }
            }
        }
    }
}

上面的代碼定義了兩個語言版本的productFlavors:english和french。每個flavor都定義了對應的androidsourcesets。使用resConfigs屬性,我們可以指定打包時僅使用特定語言的資源。

四、總結

androidsourcesets是Android Studio項目中非常重要的概念,可以讓我們在同一個項目中構建多個版本和變體。androidsourcesets常用於分渠道打包、分模塊開發和多語言版本開發等場景,對於大型項目非常實用。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/207267.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-08 14:21
下一篇 2024-12-08 14:21

相關推薦

  • 深入淺出統計學

    統計學是一門關於收集、分析、解釋和呈現數據的學科。它在各行各業都有廣泛應用,包括社會科學、醫學、自然科學、商業、經濟學、政治學等等。深入淺出統計學是指想要學習統計學的人能夠理解統計…

    編程 2025-04-25
  • 深入淺出torch.autograd

    一、介紹autograd torch.autograd 模塊是 PyTorch 中的自動微分引擎。它支持任意數量的計算圖,可以自動執行前向傳遞、後向傳遞和計算梯度,同時提供很多有用…

    編程 2025-04-24
  • 深入淺出SQL佔位符

    一、什麼是SQL佔位符 SQL佔位符是一種佔用SQL語句中某些值的標記或佔位符。當執行SQL時,將使用該標記替換為實際的值,並將這些值傳遞給查詢。SQL佔位符使查詢更加安全,防止S…

    編程 2025-04-24
  • 深入淺出:理解nginx unknown directive

    一、概述 nginx是目前使用非常廣泛的Web伺服器之一,它可以運行在Linux、Windows等不同的操作系統平台上,支持高並發、高擴展性等特性。然而,在使用nginx時,有時候…

    編程 2025-04-24
  • 深入淺出ThinkPHP框架

    一、簡介 ThinkPHP是一款開源的PHP框架,它遵循Apache2開源協議發布。ThinkPHP具有快速的開發速度、簡便的使用方式、良好的擴展性和豐富的功能特性。它的核心思想是…

    編程 2025-04-24
  • 深入淺出arthas火焰圖

    arthas是一個非常方便的Java診斷工具,包括很多功能,例如JVM診斷、應用診斷、Spring應用診斷等。arthas使診斷問題變得更加容易和準確,因此被廣泛地使用。artha…

    編程 2025-04-24
  • 深入淺出AWK -v參數

    一、功能介紹 AWK是一種強大的文本處理工具,它可以用於數據分析、報告生成、日誌分析等多個領域。其中,-v參數是AWK中一個非常有用的參數,它用於定義一個變數並賦值。下面讓我們詳細…

    編程 2025-04-24
  • 深入淺出Markdown文字顏色

    一、Markdown文字顏色的背景 Markdown是一種輕量級標記語言,由於其簡單易學、易讀易寫,被廣泛應用於博客、文檔、代碼注釋等場景。Markdown支持使用HTML標籤,因…

    編程 2025-04-23
  • 深入淺出runafter——非同步任務調度器的實現

    一、runafter是什麼? runafter是一個基於JavaScript實現的非同步任務調度器,可以幫助開發人員高效地管理非同步任務。利用runafter,開發人員可以輕鬆地定義和…

    編程 2025-04-23
  • 深入淺出TermQuery

    一、TermQuery概述 TermQuery是Lucene中最基本、最簡單、最常見的查詢方法之一。它完全符合其名字,意味著只能對一個單詞進行查詢。 TermQuery可以用於搜索…

    編程 2025-04-23

發表回復

登錄後才能評論