1. 程式人生 > >Android Studio打包以及Gradle配置構建

Android Studio打包以及Gradle配置構建

otto sign rac color conf wmf git var png

本文轉載 郭霖公眾號

https://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650241610&idx=1&sn=b8af73f6c288b6617d9fe0ab3618118d&pass_ticket=QK4j37kpmGNlsYcECWMb64HxKHEVJG5mSJubQEQguKI%3D

生成簽名文件手動打包

首先生成簽名文件,點擊 Build -> Generate Signed APK:

技術分享

如果還沒有簽名文件,點擊構造一個:

技術分享

圖中圈住的三個地方是重要信息,其余隨意填。生成以後,就可以用該簽名文件繼續簽名打包:

技術分享

填入剛才的信息,繼續:

技術分享

選好輸出路徑,選擇打包類型,完成!

通過配置自動打包

如果你覺得上述打包步驟太麻煩,那麽我們就開始在gradle裏添加配置,自動打包。

快捷鍵 Ctrl+Alt+Shift+S 或者 File -> Project Structure:

技術分享

選擇 application,在 Signing 標簽下添加簽名配置,這裏的 Store File 就是我們的簽名文件。我們還可以繼續添加構建類型,選擇 Build Types 標簽,添加 release,選擇剛才的簽名配置:

技術分享

這樣我們就有了 debug 和生產類型的兩種打包方式,以後就可以根據需要自動打包。選中工程,點擊 Build -> Select Build Variant,選擇 release:

技術分享

然後點擊 Build -> Build APK,打包文件在 ..\app\build\outputs\apk,如此便使用我們自己的簽名文件,打好了一個生產包。同樣也可以打出 debug 包,如果在 Build Types 中我們沒有設置 Signing Config,系統默認使用自帶的 debug 簽名文件打包。

隱藏簽名文件敏感信息

我們設置過打包配置以後,Gradle 自動 Sync,會在 application的 build.gradle 文件中生成下面代碼:

signingConfigs { 
        config { 
            keyAlias ‘gaok_release‘ 
            keyPassword ‘199110‘ 
            storeFile file(‘E:/GK/gaok.jks‘) 
            storePassword ‘199110‘ 
        } 
    } 

這些都是簽名文件的敏感信息,如果我們在協同開發的時候,最好把這些信息隱藏掉。

首先在工程根目錄下新建一個 keystore.properties 文件:

storePassword=199110keyPassword=199110keyAlias=gaok_release 
storeFile=E:/GK/gaok.jks

這裏要註意:所有屬性都沒有單引號.然後再在 build.gradle 文件的如下位置添加:

apply plugin: ‘com.android.application‘ 
// Create a variable called keystorePropertiesFile, and initialize it to your
// keystore.properties file, in the rootProject folder.

def keystorePropertiesFile = rootProject.file("keystore.properties") // Initialize a new Properties() object called keystoreProperties.

def keystoreProperties = new Properties() // Load your keystore.properties file into the keystoreProperties object.

keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) android { …… }

讀取到 keystore.properties 文件,然後更改配置:

android { 
    signingConfigs { 
        config { 
            keyAlias keystoreProperties[‘keyAlias‘] 
            keyPassword keystoreProperties[‘keyPassword‘] 
            storeFile file(keystoreProperties[‘storeFile‘]) 
            storePassword keystoreProperties[‘storePassword‘] 
        } 
    } 
}

這樣,所有的敏感信息都放在了文件裏,只需要好好保存 keystore.properties 文件就行了,記得可別把文件也傳到git裏!

設置風味實現不同風味資源替換

什麽是風味?看這個圖:

技術分享

我們在 Flavors 標簽下可以添加多個“風味”,以滿足個性化需要。

設置完風味以後,我們的 build.gradle 文件會生成如下:

productFlavors { 
     huawei {}       // 華為商店 
     baidu {}        // 百度手機助手 
     yinyongbao {}   // 應用寶 
 }

比如這裏我添加了多個應用市場的渠道,每個渠道可能要適配不同的 SDK 版本;也可能我想要實現不同風味包(例如:生產和 debug 模式)的 logo 不同、某些代碼不同,那我們就可以設置源集目錄,專門收錄不同不同配置下的代碼和資源文件。首先切換到 Project 視圖,我們的工程默認是只有 main 源集,即 ../src/main

技術分享

下面添加一個debug類型的源集:

技術分享

技術分享

這裏的 Target Source Set 會包含 buildTypes、productFlavors 和二者的組合變體。我這裏設置了debug 和 release 兩種類型,huawei、yingyongbao、baidu三種風味,所以會出現上圖中這麽多選項。我們選擇 debug,系統自動給我們的工程生成了對應目錄。

技術分享

同樣的可以添加 XML 文件目錄:

技術分享

我這裏添加了 values 文件,同理可以添加 colors、strings、styles文件。

技術分享

繼續添加圖片資源:

技術分享

這裏只是示例,我選擇了一個不同的圖標:

技術分享

這裏提示:圖標名字重復,因為 main 源集裏已經有 ic_launcher 圖標了,不過沒關系,我們在下一步選擇 debug 源集:

技術分享

最終目錄如下:

技術分享

現在我們有了 debug 源集,源集裏有一個不同的 app logo,這意味著,如果我們現在打了debug包,它的圖標將會是 debug 源集下的圖標,如下圖,左側是 debug 包,右側是release 包。

技術分享

至於我為什麽可以同時裝上 debug 包和 release 包,因為我添加了 applicationIdSuffix:

buildTypes { 
   release { 
minifyEnabled false proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
signingConfig signingConfigs.config applicationIdSuffix ".release" } debug { signingConfig signingConfigs.config applicationIdSuffix ".debug"
}
}

applicationIdSuffix 字段表示:在不改變你默認的程序ID(包名)的情況下,為其添加後綴。比如你的包名是 com.gk.app,但你想區分測試包和正式包的情況,這個時候將applicationIdSuffix 設置為.debug,那麽你的應用程序對應的包名就變成了com.gk.app.debug

多渠道打包

工作中,軟件包的發布工作一般是由運營小夥伴完成,包名格式一般會是:app + 版本號 + 渠道 ,不同渠道可能要進行不同的配置,因此我們必須針對所有渠道添加對應的風味。

android{ 

    productFlavors { 
        //三個渠道 
        huawei {}       // 華為商店 
        baidu {}        // 百度手機助手 
        yinyongbao {}   // 應用寶 
    } 

    // 批量渠道包值替換(有些第三方庫中需要用到渠道名) 
    productFlavors.all { flavor -> 
        // 友盟、極光推送渠道包, UMENG_CHANNEL 是根據你AndroidManifest.xml來配置的,請看下面。 
        flavor.manifestPlaceholders = [UMENG_CHANNEL: name, JPUSH_CHANNEL: name] 
    } 
}

這裏的 UMENG_CHANNEL 是在 AndroidManifest.xml 文件中配置的:

<!--變量采用${變量名}這樣來替換,不局限於<meta-data/> 標簽,任何你想替換的都行--> 
<meta-data 
   android:name="UMENG_APPKEY" 
   android:value="${UMENG_APPKEY}"/>

然後批量重命名:

android{ 
    …… 
    // 輸出文件配置,格式如下:app-{版本號}-{渠道名稱}.apk 
    applicationVariants.all { variant -> 
        variant.outputs.each { output -> 
            def outputFile = output.outputFile 
            if (outputFile != null && outputFile.name.endsWith(‘.apk‘)) { 
                def dirName = outputFile.parent // 輸出文件夾所在的位置 

                // 文件名修改 
                def fileName = "app-${defaultConfig.versionName}-${variant.flavorName}.apk" 

                output.outputFile = new File(dirName, fileName) 
            } 
        } 
    } 
    …… 
}

如此再看 Select Build Variant:

技術分享

我們打一個 baidu release 包:

技術分享

同理,多渠道打包完成。

Android Studio打包以及Gradle配置構建