小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Gradle打包APK的一些小技巧和productFlavor配置

 點(diǎn)點(diǎn)滴滴 2017-03-17
2016-08-03 17:35 1343人閱讀 評(píng)論(0) 收藏 舉報(bào)
分類(lèi):

目錄(?)[+]


本文轉(zhuǎn)自: http:///Android/2016/02/29/flavors-with-gradle/?utm_source=tuicool&utm_medium=referral

在使用Gradle來(lái)打包Android應(yīng)用之前,Android自動(dòng)化打包通常會(huì)選擇使用ant,ant是一種一步一步來(lái)執(zhí)行任務(wù)的工具,通常打包一個(gè)apk要經(jīng)過(guò)一個(gè)復(fù)雜的過(guò)程,ant工具通過(guò)一步一步完成這些過(guò)程來(lái)生成一個(gè)apk。如果要實(shí)現(xiàn)一個(gè)復(fù)雜一點(diǎn)的打包過(guò)程,它的xml配置文件的長(zhǎng)度也是足以讓你崩潰的。Gradle的出現(xiàn)讓打包過(guò)程變得十分輕松,而且配置起來(lái)也是簡(jiǎn)單易懂。以前需要寫(xiě)好幾天的配置文件現(xiàn)在只要簡(jiǎn)單的幾步就能完成,配合Android Studio更加得心應(yīng)手。

一個(gè)完整的打包流程如下: pic

基本的build.gradle

如果你用Android Studio生成一個(gè)項(xiàng)目的話(huà),在app模塊中你會(huì)看到一個(gè)build.gradle文件,這個(gè)文件就是配置這個(gè)模塊的地方,大致文件結(jié)構(gòu)如下:

    
apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:19.0.1'
}

這里就不一行行地解釋了,關(guān)于Gradle的語(yǔ)法可以自行Google。

這里主要有兩個(gè)小技巧

  1. 簽名:開(kāi)發(fā)App時(shí)經(jīng)常遇到Release版和Debug版共存問(wèn)題,由于默認(rèn)的簽名不同,經(jīng)常要卸載Debug版安裝Release版,非常麻煩。有兩種方法可以避免這種情況:1. 使用同一個(gè)簽名;2. 使用不同包名
// 方法1 (簽名配置方法可以Google)
android {
   buildTypes {
       debug {signingConfig signingConfigs.myConfig}
       release {signingConfig signingConfigs.myConfig}
   }
}
// 方法2 
android {
   buildTypes {
       debug {packageNameSuffix ".debug"}
   }
}
  1. Release版打包的apk文件名:通過(guò)下面的代碼可以自動(dòng)為生成的apk文件附加上版本和build日期,這里可以根據(jù)你的需求添加各種信息上去。
android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            def today = new Date()
            if (variant.buildType.getName().equals("release")) {
                println "Change output apk name"
                variant.outputs.each { output ->
                    output.outputFile = new File(
                            output.outputFile.parent,
                            output.outputFile.name.replace(".apk", "-" + defaultConfig.versionName + "-" + today.format('yyyyMMdd') + ".apk"))
                }
            }
        }
    }
}

BuildVariants

Gradle的Android插件中有個(gè)BuildVariants的概念,其實(shí)簡(jiǎn)單來(lái)說(shuō)其實(shí)就是buildTypes+productFlavors,buildType前面我們看到過(guò)了,主要就是debug和release的分別。而productFlavors就是我們用來(lái)打包不同版本app的主要方式。從字面意思來(lái)翻譯指的就是不同的“產(chǎn)品特點(diǎn)”。

Android Studio會(huì)自動(dòng)根據(jù)build.gradle 生成對(duì)應(yīng)的BuildVariants。比如以下代碼:

android {
    productFlavors {
        free {}
        paid {}
    }
}

會(huì)生成以下的BuildVariants:

pic

productFlavors的維度

productFlavors可以是多維的,聽(tīng)起來(lái)好像很難理解,這里舉個(gè)栗子,有如下代碼:

android {
    flavorDimensions("isfree", "channel")
    productFlavors {
        free {dimension "isfree"}
        paid {dimension "isfree"}

        googleplay {dimension "channel"}
        wandoujia {dimension "channel"}
    }
}

能夠生成如下的BuildVariants:

pic

這里我們就可以看到,我們有兩個(gè)維度,一個(gè)是是否免費(fèi),另一個(gè)是渠道,我們能夠生成2*2=4種Flavor,并且每個(gè)Flavor都有debug和release,總共就有8種不同的APK。所以理論上來(lái)說(shuō)通過(guò)組合Flavor,我們可以做到各種不同的分類(lèi)。

接下來(lái)我們來(lái)看看productFlavors能做什么? ### 定義渠道

在國(guó)外一般來(lái)說(shuō)開(kāi)發(fā)者不太需要去管渠道的問(wèn)題,他們的App只需要發(fā)往GooglePlay就可以了,但是在中國(guó),我們有眾多的APK分發(fā)平臺(tái),我們的APK需要發(fā)往各種地方,在做APP統(tǒng)計(jì)的時(shí)候我們就需要在APK里寫(xiě)入一些特征變量,發(fā)送到統(tǒng)計(jì)平臺(tái),以區(qū)分不同的渠道,在過(guò)去用ant打包的時(shí)代,我們通常的做法就是用不同的渠道名來(lái)重復(fù)ant任務(wù)一遍一遍地打包。

如果用gradle:我們可以通過(guò)增加一個(gè)名為channel的dimension來(lái)給每一個(gè)渠道一個(gè)特殊標(biāo)示,代碼就是我們之前看到的。但是你可能會(huì)問(wèn),我怎么在統(tǒng)計(jì)的時(shí)候獲取這個(gè)渠道名呢?其實(shí)很簡(jiǎn)單,Android Studio會(huì)為我們生成一個(gè)名叫BuildConfig的類(lèi),這個(gè)類(lèi)有一些關(guān)于打包的靜態(tài)變量,下面是一個(gè)示例:

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "me.zheteng.android.example";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "freeGoogleplay";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "1.0";
  public static final String FLAVOR_isfree = "free";
  public static final String FLAVOR_channel = "googleplay";
}

其實(shí)不止是渠道,通過(guò)這個(gè)類(lèi)我們還可以很方便地獲得這個(gè)APK的各種信息。相信大家一眼就能看出來(lái)每個(gè)字段的意思。(我們甚至還可以自定義字段)。

如果渠道非常多,你也可以通過(guò)讀配置文件的方式動(dòng)態(tài)生成不同的flavors。

如果我每個(gè)flavor都有點(diǎn)特別呢?

有的時(shí)候我們每個(gè)flavor可能不只是一個(gè)渠道名這么簡(jiǎn)單,我的ICON可能給每個(gè)渠道的有所不同,我的包名也可能有所不同。所有這些,都可以直接在這個(gè)flavor中重新定義:

android {
    productFlavors {
        googleplay {
            applicationId "me.zheteng.android.example.googleplay"
        }
    }
}

如果需要不同的源代碼或資源文件,可以在app/src下新建一個(gè)名為“flavor名”的目錄(這里就是googleplay)。也就是app/src/googleplay,然后這個(gè)目錄下的結(jié)構(gòu)和app/src/main中是一樣的,打包的時(shí)候會(huì)優(yōu)先使用當(dāng)前flavor下的文件。

其他Gradle小技巧

Provider名稱(chēng)

我們知道Provider的authority是系統(tǒng)中全局唯一的,有時(shí)候我們要為不同的flavor將authority改成不同的,通過(guò)gradle你可以這樣實(shí)現(xiàn):

<provider
    android:exported="true"
    android:name="com.path.to.my.Provider"
    android:authorities="${applicationId}.provider"/>

你問(wèn)我Java代碼中怎么獲取?難道你忘了BuildConfig了嘛?

Manifest 占位符

有些SDK會(huì)把配置在Manifest文件中的meta信息里,而不同的flavor這個(gè)信息不一樣,這是我們可以通過(guò)Manifest 占位符來(lái)實(shí)現(xiàn):

<meta-data android:value="${UMENG_APPKEY}" android:name="UMENG_APPKEY"/>
android {
    productFlavors {
        googleplay {
            applicationId "me.zheteng.android.example.googleplay"
            manifestPlaceholders = [UMENG_APPKEY: "我的友盟KEY"]
        }
    }
}

總結(jié)

Gradle的靈活程度超乎想象,如果基本功能無(wú)法滿(mǎn)足你,你還可以通過(guò)自己編寫(xiě)Groovy插件或者task來(lái)實(shí)現(xiàn)無(wú)窮的可能性,歡迎將你的思路分享出來(lái)~

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多