乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      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)目的話,在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名稱

      我們知道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ú)法滿足你,你還可以通過(guò)自己編寫(xiě)Groovy插件或者task來(lái)實(shí)現(xiàn)無(wú)窮的可能性,歡迎將你的思路分享出來(lái)~

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(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)遵守用戶 評(píng)論公約

        類(lèi)似文章 更多