6.6 配置構建 - 配置構建變體

文章來源:Google

此頁面以配置構建概覽為基礎,向您介紹如何配置構建變體,以便從同一個項目中創建應用的不同版本,以及如何正確地管理依賴項并簽署配置。

每個構建變體都代表您可以為應用構建的一個不同版本。例如,您可能希望構建應用的免費版本(只提供有限的內容)和付費版本(提供更多內容)。您還可以針對不同的設備、根據 API 級別或其他設備變體構建應用的不同版本。然而,如果您希望根據設備 ABI 或屏幕密度構建不同的版本,則請改用 APK 拆分

構建變體是 Gradle 按照特定規則集(源集)合并在構建類型和產品風味中配置的設置、代碼和資源所生成的結果。您并不直接配置構建變體,而是配置組成變體的構建類型和產品風味。

例如,一個“演示”產品風味可以指定不同的功能和設備要求,例如自定義源代碼、資源和最低 API 級別,而“調試”構建類型則應用不同的構建和打包設置,例如調試選項和簽署密鑰。最終生成的構建變體是應用的“演示調試”版本,其既包含“演示”產品風味中包含的各種配置和資源,又包含“調試”構建類型和 main/ 源集。

配置構建類型


您可以在模塊級 build.gradle 文件的 android {} 代碼塊內部創建和配置構建類型。當您創建新模塊時,Android Studio 會自動為您創建調試和發布這兩種構建類型。盡管調試構建類型不會出現在構建配置文件中,Android Studio 會為其配置 debuggable true。這樣,您可以在安全的 Android 設備上調試應用并使用通用調試密鑰庫配置 APK 簽署。

如果您希望添加或更改特定設置,您可以將調試構建類型添加到您的配置中。以下示例為調試構建類型指定了 applicationIdSuffix,并配置了一個使用調試構建類型中的設置進行初始化的“jnidebug”構建類型。

android {
    ...
    defaultConfig {...}
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

        debug {
            applicationIdSuffix ".debug"
        }

        /**
         * The 'initWith' property allows you to copy configurations from other build types,
         * so you don't have to configure one from the beginning. You can then configure
         * just the settings you want to change. The following line initializes
         * 'jnidebug' using the debug build type, and changes only the
         * applicationIdSuffix and versionNameSuffix settings.
         */

        jnidebug {

            // This copies the debuggable attribute and debug signing configurations.
            initWith debug

            applicationIdSuffix ".jnidebug"
            jniDebuggable true
        }
    }
}

當您對構建配置文件進行更改時,Android Studio 會要求您為項目同步新配置。要同步項目,您可以點擊在做出更改后立即出現在通知欄中的 Sync Now,也可以點擊工具欄中的 Sync Project 。如果 Android Studio 通知配置出現錯誤,會顯示 Messages 窗口,具體描述該問題。

如需詳細了解對于構建類型可以配置的所有屬性,請閱讀構建類型 DSL 參考

配置產品風味


創建產品風味與創建構建類型類似:只需將它們添加到 productFlavors {} 代碼塊并配置您想要的設置。產品風味支持與 defaultConfig 相同的屬性,這是因為 defaultConfig 實際上屬于 ProductFlavor 類。這意味著,您可以在 defaultConfig {} 代碼塊中提供所有風味的基本配置,每種風味均可更改任何這些默認值,例如 applicationId。要詳細了解應用 ID,請閱讀設置應用 ID

:您仍需在 main/ 清單文件中使用 package 屬性指定程序包名稱。您還必須在源代碼中使用此程序包名稱引用 R 類或者解析任何相關的 Activity 或服務注冊。這樣,您可以使用 applicationId 為每個產品風味分配一個唯一的 ID,以用于打包和分發,而不必更改您的源代碼。

android {
    ...
    defaultConfig {...}
    buildTypes {...}
    productFlavors {
        demo {
            applicationIdSuffix ".demo"
            versionNameSuffix "-demo"
        }
        full {
            applicationIdSuffix ".full"
            versionNameSuffix "-full"
        }
    }
}

:要利用 Google Play 中的多 APK 支持分發您的應用,請為所有變體分配相同的 applicationId 值并為每個變體分配一個不同的 versionCode。要在 Google Play 中以獨立應用的形式分發應用的不同變體,您需要為每個變體分配一個不同的 applicationId

在創建和配置您的產品風味之后,在通知欄中點擊 Sync Now。在同步完成后,Gradle 會根據您的構建類型和產品風味自動創建構建變體,并按照 <product-flavor><Build-Type> 的格式命名這些變體。例如,如果您創建了“演示”和“完整”這兩種產品風味并保留默認的“調試”和“發布”構建類型,Gradle 將創建以下構建變體:

  • 演示調試
  • 演示發布
  • 完整調試
  • 完整發布

您可以將構建變體更改為您要構建并運行的任何變體,只需轉到 Build > Select Build Variant,然后從下拉菜單中選擇一個變體。然而,要開始自定義每個構建變體及其功能和資源,您需要了解如何創建和管理源集。

組合多個產品風味

某些情況下,您可能希望組合多個產品風味中的配置。例如,您可能希望基于 API 級別為“完整”和“演示”產品風味創建不同的配置。為此,您可以通過適用于 Gradle 的 Android 插件創建產品風味組,稱為風味維度。構建您的應用時,Gradle 會將您定義的每個風味維度中的產品風味配置與構建類型配置組合來創建最終構建變體。Gradle 不會組合屬于相同風味維度的產品風味。

提示:要根據 ABI 和屏幕密度創建不同版本的應用,您應配置 APK 拆分,而不是使用產品風味。

下面的代碼示例使用 flavorDimensions 屬性創建一個“模式”風味維度以組織“完整”和“演示”產品風味,以及一個“api”風味維度以基于 API 級別組織產品風味配置:

android {
  ...
  buildTypes {
    debug {...}
    release {...}
  }
  // Specifies the flavor dimensions you want to use. The order in which you
  // list each dimension determines its priority, from highest to lowest,
  // when Gradle merges variant sources and configurations. You must assign
  // each product flavor you configure to one of the flavor dimensions.
  flavorDimensions "api", "mode"

  productFlavors {
    demo {
      // Assigns this product flavor to the "mode" flavor dimension.
      dimension "mode"
      ...
    }

    full {
      dimension "mode"
      ...
    }
  
    // Configurations in the "api" product flavors override those in "mode"
    // flavors and the defaultConfig {} block. Gradle determines the priority
    // between flavor dimensions based on the order in which they appear next
    // to the flavorDimensions property above--the first dimension has a higher
    // priority than the second, and so on.
    minApi24 {
      dimension "api"
      minSdkVersion '24'
      // To ensure the target device receives the version of the app with
      // the highest compatible API level, assign version codes in increasing
      // value with API level. 
      versionCode 30000 + android.defaultConfig.versionCode
      versionNameSuffix "-minApi24"
      ...
    }

    minApi23 {
      dimension "api"
      minSdkVersion '23'
      versionCode 20000  + android.defaultConfig.versionCode
      versionNameSuffix "-minApi23"
      ...
    }

    minApi21 {
      dimension "api"
      minSdkVersion '21'
      versionCode 10000  + android.defaultConfig.versionCode
      versionNameSuffix "-minApi21"
      ...
    }
  }
}

Gradle 創建的構建變體數量等于每個風味維度中的風味數量與您配置的構建類型數量的乘積。在 Gradle 為每個構建變體或對應 APK 命名時,屬于較高優先級風味維度的產品風味首先顯示,之后是較低優先級維度的產品風味,再之后是構建類型。以上面的構建配置為例,Gradle 可以使用以下命名方案創建總共 12 個構建變體:

構建變體:[minApi24, minApi23, minApi21][Demo, Full][Debug, Release]

對應 APK:app-[minApi24, minApi23, minApi21]-[demo, full]-[debug, release].apk

例如,

構建變體:minApi24DemoDebug

對應 APK:app-minApi24-demo-debug.apk

除了可以為各個產品風味和構建變體創建源集目錄外,您也可以為每個產品風味組合創建源集目錄。例如,您可以創建 Java 源并將其添加到 src/demoMinApi24/java/ 目錄中,Gradle 僅會在構建組合了這兩種產品風味的變體時使用這些源。與屬于各個產品風味的源集相比,您為產品風味組合創建的源集擁有更高的優先級。要詳細了解源集和 Gradle 如何合并源,請閱讀下面如何創建源集的部分。

過濾變體

Gradle 會為您配置的產品風味與構建類型的每個可能的組合創建構建變體。不過,某些特定的構建變體在您的項目環境中并不必要,也可能沒有意義。您可以在模塊級 build.gradle 文件中創建一個變體過濾器,以移除某些構建變體配置。

以上一部分中的構建配置為例,假設您計劃為演示版本的應用僅支持 API 級別 23 和更高級別。您可以使用 variantFilter {} 代碼塊過濾出組合了“minApi21”和“演示”產品風味的所有構建變體配置:

android {
  ...
  buildTypes {...}

  flavorDimensions "api", "mode"
  productFlavors {
    demo {...}
    full {...}
    minApi24 {...}
    minApi23 {...}
    minApi21 {...}
  }

  variantFilter { variant ->
      def names = variant.flavors*.name
      // To check for a certain build type, use variant.buildType.name == "<buildType>"
      if (names.contains("minApi21") && names.contains("demo")) {
          // Gradle ignores any variants that satisfy the conditions above.
          setIgnore(true)
      }
  }
}
...

在您向構建配置添加變體過濾器并點擊通知欄中的 Sync Now 后,Gradle 將忽略滿足您指定的條件的任何構建變體,在您點擊菜單欄中的 Build > Select Build Variant(或工具窗口欄中的 Build Variants)時,這些構建變體將不會再顯示在下拉菜單中。

創建源集


默認情況下,Android Studio 會創建 main/源集 和目錄,用于存儲您要在所有構建變體之間共享的一切資源。然而,您可以創建新的源集來控制 Gradle 要為特定的構建類型、產品風味(以及使用風味維度時的產品風味組合)和構建變體編譯和打包的確切文件。例如,您可以在 main/ 源集中定義基本的功能,使用產品風味源集針對不同的客戶更改應用的品牌,或者僅針對使用調試構建類型的構建變體包含特殊的權限和日志記錄功能。

Gradle 要求您按照與 main/ 源集類似的特定方式組織源集文件和目錄。例如,Gradle 要求您的“調試”構建類型所特定的 Java 類文件位于 src/debug/java/ 目錄中。

適用于 Gradle 的 Android 插件提供了一項有用的 Gradle 任務,可向您展示如何針對每種構建類型、產品風味和構建變體組織您的文件。例如,報告的以下部分描述了 Gradle 要求在何處能找到“調試”構建類型的特定文件:

------------------------------------------------------------
Project :app
------------------------------------------------------------

...

debug
----
Compile configuration: compile
build.gradle name: android.sourceSets.debug
Java sources: [app/src/debug/java]
Manifest file: app/src/debug/AndroidManifest.xml
Android resources: [app/src/debug/res]
Assets: [app/src/debug/assets]
AIDL sources: [app/src/debug/aidl]
RenderScript sources: [app/src/debug/rs]
JNI sources: [app/src/debug/jni]
JNI libraries: [app/src/debug/jniLibs]
Java-style resources: [app/src/debug/resources]

要為您的構建配置生成和查看此報告,請繼續如下操作:

  1. 點擊 IDE 窗口右側的 Gradle
  2. 導航至 MyApplication > Tasks > android 并雙擊 sourceSets
  3. 要查看報告,請點擊 IDE 窗口底部的 Gradle Console

:此報告還向您展示了如何為您希望用來運行應用測試的文件組織源集,例如 test/androidTest/ 測試源集

當您創建新的構建變體時,Android Studio 不會為您創建源集目錄,但會為您提供幾個選項,幫助您創建。例如,要為“調試”構建類型只創建 java/ 目錄,請執行以下操作:

  1. 打開 Project 窗格并從窗格頂端的下拉菜單中選擇 Project 視圖。
  2. 導航至 MyProject/app/src/
  3. 右鍵點擊 src 目錄并選擇 New > Folder > Java Folder
  4. Target Source Set 旁邊的下拉菜單中,選擇 debug
  5. 點擊 Finish

Android Studio 將會為您的調試構建類型創建源集目錄,然后在該目錄內部創建 java/ 目錄。或者,在針對特定的構建變體向您的項目中添加新文件時,您也可以讓 Android Studio 為您創建目錄。例如,要為“調試”構建類型創建 XML 值文件:

  1. 在相同的 Project 窗格中,右鍵點擊 src 目錄并選擇 New > XML > Values XML File
  2. 為 XML 文件輸入名稱或保留默認名稱。
  3. Target Source Set 旁邊的下拉菜單中,選擇 debug
  4. 點擊 Finish

由于“調試”構建類型被指定為目標源集,Android Studio 會在創建 XML 文件時自動創建必要的目錄。最終的目錄結構看上去應該類似于圖 2。


圖 2. 調試構建類型的新源集目錄

按照同樣的方法,您還可以為產品風味創建源集目錄(例如 src/demo/),為構建變體創建源集目錄(例如 src/demoDebug/)。此外,您還可以創建針對特定構建變體的測試源集,例如 src/androidTestDemoDebug/。如需了解更多信息,請轉至測試源集

更改默認源集配置

如果您的源未組織到 Gradle 期望的默認源集文件結構中(如上面的創建源集部分中所述),您可以使用 sourceSets {} 代碼塊更改 Gradle 希望為源集的每個組件收集文件的位置。您不需要重新定位文件;只需要為 Gradle 提供相對于模塊級 build.gradle 文件的路徑,Gradle 應當可以在此路徑下為每個源集組件找到文件。要了解您可以配置哪些組件,以及是否可以將其映射到多個文件或目錄,請閱讀適用于 Gradle 的 Android 插件參考

下面的代碼示例可以將 app/other/ 目錄中的源映射到 main 源集的某些組件,并更改 androidTest 源集的根目錄。

android {
  ...
  sourceSets {
    // Encapsulates configurations for the main source set.
    main {
      // Changes the directory for Java sources. The default directory is
      // 'src/main/java'.
      java.srcDirs = ['other/java']

      // If you list multiple directories, Gradle uses all of them to collect
      // sources. Because Gradle gives these directories equal priority, if
      // you define the same resource in more than one directory, you get an
      // error when merging resources. The default directory is 'src/main/res'.
      res.srcDirs = ['other/res1', 'other/res2']

      // Note: You should avoid specifying a directory which is a parent to one
      // or more other directories you specify. For example, avoid the following:
      // res.srcDirs = ['other/res1', 'other/res1/layouts', 'other/res1/strings']
      // You should specify either only the root 'other/res1' directory, or only the
      // nested 'other/res1/layouts' and 'other/res1/strings' directories.

      // For each source set, you can specify only one Android manifest.
      // By default, Android Studio creates a manifest for your main source
      // set in the src/main/ directory.
      manifest.srcFile 'other/AndroidManifest.xml'
      ...
    }

    // Create additional blocks to configure other source sets.
    androidTest {

      // If all the files for a source set are located under a single root
      // directory, you can specify that directory using the setRoot property.
      // When gathering sources for the source set, Gradle looks only in locations
      // relative to the root directory you specify. For example, after applying the
      // configuration below for the androidTest source set, Gradle looks for Java
      // sources only in the src/tests/java/ directory.
      setRoot 'src/tests'
      ...
    }
  }
}
...

使用源集構建

您可以使用源集目錄包含您希望僅針對某些配置打包的代碼和資源。例如,如果您要構建“演示調試”構建變體(它是“演示”產品風味和“調試”構建類型的合體),Gradle 會查看這些目錄并賦予以下優先級順序:

  1. src/demoDebug/(構建變體源集)
  2. src/debug/(構建類型源集)
  3. src/demo/(產品風味源集)
  4. src/main/(主源集)

:如果您組合多個產品風味,產品風味之間的優先級將由它們所屬的風味維度決定。在列示具有 android.flavorDimensions 屬性的風味維度時,所列示的第一個風味維度中的產品風味比第二個維度中的產品風味擁有更高的優先級,以此類推。此外,與屬于各個產品風味的源集相比,您為產品風味組合創建的源集擁有更高的優先級。

上面列出的順序決定了在 Gradle 合并代碼和資源時哪個源集具有較高的優先級。由于 demoDebug/ 源集目錄很可能包含特定于該構建變體的文件,如果 demoDebug/ 包含在 debug/ 中也有定義的文件,Gradle 將使用 demoDebug/ 源集中的文件。同樣,Gradle 會為構建類型和產品風味源集中的文件賦予比 main/ 中相同文件更高的優先級。Gradle 在應用以下構建規則時會考慮此優先級順序:

  • 一起編譯 java/ 目錄中的所有源代碼以生成單一的輸出。

    :對于給定的構建變體,如果找到兩個或兩個以上定義同一 Java 類的源集目錄,Gradle 就會引發一個構建錯誤。例如,在構建調試 APK 時,您不能同時定義 src/debug/Utility.javasrc/main/Utility.java。這是因為 Gradle 會在構建過程中檢查這兩個目錄并引發“duplicate class”錯誤。如果針對不同的構建類型需要不同版本的 Utility.java,您可以讓每個構建類型定義其自己的文件版本,而不將其包含在 main/ 源集中。

  • 所有清單合并為單個清單。將按照上述列表中的相同順序指定優先級。也就是說,某個構建類型的清單設置會替換某個產品風味的清單設置,依此類推。如需了解更多信息,請閱讀合并清單

  • 同樣,values/ 目錄中的文件也會合并在一起。如果兩個文件同名,例如存在兩個 strings.xml 文件,將按照上述列表中的相同順序指定優先級。也就是說,在構建類型源集中的文件中定義的值將會替換產品風味中同一文件中定義的值,依此類推。

  • res/asset/ 目錄中的資源將打包到一起。如果兩個或兩個以上的源集中定義有同名資源,將按照上述列表中的相同順序指定優先級。

  • 最后,在構建 APK 時,Gradle 會為隨庫模塊依賴項包含的資源和清單分配最低的優先級。

聲明依賴項


下面的示例可以在 app/ 模塊的 build.gradle 文件中聲明三種不同類型的直接依賴項:

android {...}
...
dependencies {
    // The 'compile' configuration tells Gradle to add the dependency to the
    // compilation classpath and include it in the final package.

    // Dependency on the "mylibrary" module from this project
    compile project(":mylibrary")

    // Remote binary dependency
    compile 'com.android.support:appcompat-v7:27.0.2'

    // Local binary dependency
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

下面逐一介紹了每種直接依賴項。

模塊依賴項

compile project(':mylibrary') 行聲明了一個名為“mylibrary”的本地 Android 庫模塊作為依賴項,并要求構建系統在構建應用時編譯并包含該本地模塊。

遠程二進制依賴項

compile 'com.android.support:appcompat-v7:27.0.2' 行會通過指定其 JCenter 坐標,針對 Android 支持庫的 27.0.2 版本聲明一個依賴項。默認情況下,Android Studio 會將項目配置為使用頂級構建文件中的 JCenter 存儲區。當您將項目與構建配置文件同步時,Gradle 會自動從 JCenter 中抽取依賴項。或者,您也可以通過使用 SDK 管理器下載和安裝特定的依賴項。

本地二進制依賴項

compile fileTree(dir: 'libs', include: ['*.jar']) 行告訴構建系統在編譯類路徑和最終的應用軟件包中包含 app/libs/ 目錄內的任何 JAR 文件。如果您有模塊需要本地二進制依賴項,請將這些依賴項的 JAR 文件復制到項目內部的 <moduleName>/libs 中。

該模塊的某些直接依賴項可能會有其自己的依賴項,這稱為該模塊的傳遞依賴項。Gradle 將會自動為您收集并添加這些傳遞依賴項,而不必手動逐一加以聲明。適用于 Gradle 的 Android 插件提供了一項有用的 Gradle 任務,可為每個構建變體和測試源集生成依賴項樹,因此,您可以輕松地可視化模塊的直接和傳遞依賴項。要生成此報告,請繼續如下操作:

  1. 點擊 IDE 窗口右側的 Gradle
  2. 導航至 MyApplication > Tasks > android 并雙擊 androidDependencies
  3. 要查看報告,請點擊 IDE 窗口底部的 Gradle Console

以下示例報告顯示了調試構建變體的依賴項樹,并包含前一示例中的本地模塊依賴項和遠程依賴項。

Executing tasks: [androidDependencies]
:app:androidDependencies
debug
/**
 * Both the library module dependency and remote binary dependency are listed
 * with their transitive dependencies.
 */
+--- MyApp:mylibrary:unspecified
|    \--- com.android.support:appcompat-v7:27.0.2
|         +--- com.android.support:animated-vector-drawable:27.0.2
|         |    \--- com.android.support:support-vector-drawable:27.0.2
|         |         \--- com.android.support:support-v4:27.0.2
|         |              \--- LOCAL: internal_impl-27.0.2.jar
|         +--- com.android.support:support-v4:27.0.2
|         |    \--- LOCAL: internal_impl-27.0.2.jar
|         \--- com.android.support:support-vector-drawable:27.0.2
|              \--- com.android.support:support-v4:27.0.2
|                   \--- LOCAL: internal_impl-27.0.2.jar
\--- com.android.support:appcompat-v7:27.0.2
     +--- com.android.support:animated-vector-drawable:27.0.2
     |    \--- com.android.support:support-vector-drawable:27.0.2
     |         \--- com.android.support:support-v4:27.0.2
     |              \--- LOCAL: internal_impl-27.0.2.jar
     +--- com.android.support:support-v4:27.0.2
     |    \--- LOCAL: internal_impl-27.0.2.jar
     \--- com.android.support:support-vector-drawable:27.0.2
          \--- com.android.support:support-v4:27.0.2
               \--- LOCAL: internal_impl-27.0.2.jar
...

如需了解在 Gradle 中管理依賴項的詳細信息,請參閱《Gradle 用戶指南》中的依賴項管理基礎知識

配置依賴項

您可以使用特定的配置關鍵字告訴 Gradle 如何以及何時使用某個依賴項,例如前述示例中的 compile 關鍵字。下面介紹了您可以用來配置依賴項的一些關鍵字:

compile

指定編譯時依賴項。Gradle 將此配置的依賴項添加到類路徑和應用的 APK。這是默認配置。

apk

指定 Gradle 需要將其與應用的 APK 一起打包的僅運行時依賴項。您可以將此配置與 JAR 二進制依賴項一起使用,而不能與其他庫模塊依賴項或 AAR 二進制依賴項一起使用。

provided

指定 Gradle 與應用的 APK 一起打包的編譯時依賴項。如果運行時無需此依賴項,這將有助于縮減 APK 的大小。您可以將此配置與 JAR 二進制依賴項一起使用,而不能與其他庫模塊依賴項或 AAR 二進制依賴項一起使用。

此外,您可以通過將構建變體或測試源集的名稱應用于配置關鍵字,為特定的構建變體或測試源集配置依賴項,如下例所示。

dependencies {
    ...
    // Adds specific library module dependencies as compile time dependencies
    // to the fullRelease and fullDebug build variants.
    fullReleaseCompile project(path: ':library', configuration: 'release')
    fullDebugCompile project(path: ':library', configuration: 'debug')

    // Adds a compile time dependency for local tests.
    testCompile 'junit:junit:4.12'

    // Adds a compile time dependency for the test APK.
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
}

配置簽署設置


除非您為發布構建顯式定義簽署配置,否則,Gradle 不會簽署發布構建的 APK。您可以輕松創建發布密鑰并使用 Android Studio 簽署發布構建類型

要使用 Gradle 構建配置為您的發布構建類型手動配置簽署配置:

  1. 創建密鑰庫。密鑰庫是一個二進制文件,它包含一組私鑰。您必須將密鑰庫存放在安全可靠的地方。
  2. 創建私鑰。私鑰代表將通過應用識別的實體,如某個人或某家公司。
  3. 將簽署配置添加到模塊級 build.gradle 文件中:
android {
    ...
    defaultConfig {...}
    signingConfigs {
        release {
            storeFile file("myreleasekey.keystore")
            storePassword "password"
            keyAlias "MyReleaseKey"
            keyPassword "password"
        }
    }
    buildTypes {
        release {
            ...
            signingConfig signingConfigs.release
        }
    }
}

要生成簽署的 APK,請從菜單欄中選擇 Build > Generate Signed APK。現在,app/build/apk/app-release.apk 中的軟件包已使用您的發布密鑰進行簽署。

注:將發布密鑰和密鑰庫的密碼放在構建文件中并不安全。作為替代方案,您可以將此構建文件配置為通過環境變量獲取這些密碼,或讓構建流程提示您輸入這些密碼。

要通過環境變量獲取這些密碼:

storePassword System.getenv("KSTOREPWD")
keyPassword System.getenv("KEYPWD")

要讓構建流程在您要從命令行調用此構建時提示您輸入這些密碼:

storePassword System.console().readLine("\nKeystore password: ")
keyPassword System.console().readLine("\nKey password: ")

在完成此流程后,您可以分發您的應用并在 Google Play 上發布它。

警告:將密鑰庫和私鑰存放在安全可靠的地方,并確保您為其創建了安全的備份。如果您將應用發布到 Google Play,隨后丟失了您用于簽署應用的密鑰,那么,您將無法向您的應用發布任何更新,因為您必須始終使用相同的密鑰簽署應用的所有版本。

簽署 Android Wear 應用

發布 Android Wear 應用時,請將穿戴式設備應用打包到手持類應用中,因為用戶無法直接在穿戴式設備上瀏覽和安裝應用。這兩個應用均必須進行簽署。如需有關打包和簽署 Android Wear 應用的更多信息,請參閱打包穿戴式設備應用

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容