1. 程式人生 > >【原創】如何使用build.gradle優雅的開發Android

【原創】如何使用build.gradle優雅的開發Android

前言

Gradle 是 Android 現在主流的編譯工具,他和 Android Studio 的關係非常緊密,可以說對於一些簡單的程式我們幾乎不需要任何程式碼上的配置只使用 Android Studio 就可以完成編譯和執行。 下面我給大家介紹一些實用的gradle程式碼:

1.打包簽名apk

大家在使用gradle時,最基本的就是簽名打包,下面的程式碼配置好之後,就可以根據渠道和release或者debug包了:

(1)替換AndroidManifest中的佔位符

替換AndroidManifest 的app_lable ,也就是應用名

android{
    defaultConfig{
        manifestPlaceholders = [app_label:"@string/app_name"
] } }

如果只想替換debug版本:

android{
    buildTypes {
        debug {
              manifestPlaceholders = [app_label:"@string/app_name_debug"]
        }
        release {
        }
    }
}

更多的需求是替換渠道編號:

android{
    productFlavors {
        // 把dev產品型號的apk的AndroidManifest中的channel替換dev
        "dev"{
            manifestPlaceholders = [channel:"dev"
] } } }

(2)配置簽名信息

在builde.gradle 的android{..} 裡面將簽名設定

signingConfigs {
        release {
            storeFile file("../yourapp.keystore")
            storePassword "your password"
            keyAlias "your alias"
            keyPassword "your password"
        }
    }

    buildTypes {
        debug
{ minifyEnabled false zipAlignEnabled false shrinkResources false } release { minifyEnabled true//混淆編譯 zipAlignEnabled true //移除無用的資原始檔 shrinkResources true signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }

( 3 )  多渠道打包,下面引用友盟的例子:

首先在AndroidManifest 裡面配置PlaceHolder,與build.gradle檔案中替換自己想要改變的值

<meta-data
    android:name="UMENG_CHANNEL"
    android:value="${UMENG_CHANNEL_VALUE}" />
然後在build.gradle裡面設定productFlavors,修改PlaceHolder
productFlavors {
        playStore {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
        }
        miui {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "uc"]
        }
        wandoujia {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
        }
    }
這裡也是可以批量修改的
productFlavors {
        playStore {}
        miui {}
        wandoujia {}
}
 //批量處理
productFlavors.all { 
       flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] 
}        

(4)修改打包的檔名字,根據不同的需求自行配置

def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
android.applicationVariants.all { variant ->
    variant.outputs.all {
        if(variant.buildType.name=="release"){
            outputFileName = "${sdk}_${defaultConfig.versionName}_${releaseTime()}.apk"
        }else {
            outputFileName = "${sdk}_${defaultConfig.versionName}_${releaseTime()}_debug.apk"
        }
    }
}

2.動態應用面板

有時我們運營需求就是把app 換面板,換icon,更換域名等等原因,應用名重新在應用市場裡面釋出,如果手動去搞未免顯的很Low 也比較費時費力,其實Gradle 裡面已經給我們提供了方法

,我們可以根據需求建立多套assets ,res,和AndroidMainfest

 (1)提取工程中,strings,colors,dimens,在開發階段有時為了求快,經常忘記了這麼做,這就是開發習慣的問題了,其實這是給自己在後面的階段埋了坑

  (2) 將assets, res ,AndroidManifest 所有東西抽取到一個特定的資料夾

本人就是在src下面建立了一個同級的src_config資料夾,該資料夾下面的子檔案的名字就是對應每一套的打包需求,我的示例打包需求是“dataEye”和“noDataEye”,如下圖所列

(3)配置build.gradle檔案

首先在工程project的build.gradle 裡面配置 ,

ext{
    sdk='dataEye' // 對應資料夾裡面的打包需求

// sdk='noDataEye'
}

然後在app module裡面的build.gradle 裡面,引用assets ,res ,AndroidManifets就可以了

def  appId="com.anfeng.demo.${sdk}"                          // 對應的applicationId
def  manifestXml="src_config/${sdk}/AndroidManifest.xml"     
def  assetsPath="src_config/${sdk}/assets"
def  resDir="src_config/${sdk}/res"

android.sourceSets{// 設定引用路徑
    main{
        manifest.srcFile manifestXml
        res.srcDirs=[resDir]
        assets.srcDirs  assetsPath
    }
}

完成幾步之後,有幾套打包需求我們就建幾套相應資源就可以了,這就算是初步完成了換膚的需求