gradle多渠道打包及友盟統計-eclipse版本

在進行渠道打包的之前,先看看準備篇,知道打包爲了什麼。
參見1.0android批量打包認知。
批量打包認知
eclipse中使用gradle多渠道打包全部流程

一.生成gradle文件,配置本地的gradle環境
1.選中需要打包的項目右鍵選擇expert->生成gradle文件,如下圖所示

2.完成第一步後,刷新項目可以得到如下圖所示的文件


顯然項目中多出了gradle.build文件,gradle文件夾。如果沒有出現,點擊項目右鍵-refresh
刷新過後看到已經生成的gradle文件夾,如下圖:

3.打開上述gradle-wrapper.properties文件

紅色表示部分:使用gradle打包的時候,所需要使用的文件。

4.複製上述的url,或者直接到官網下載相應的gradle-1.12-all.zip.
爲什麼要下載對應的,可能是由於版本之間的差異,導致打包失敗。應該也可以嘗試升級adt或者eclipse中的gradle插件的版本。

以上是官網下載的截圖,在紅色標誌部分,可以選擇想要下載的對應版本。在初期我下載最高版本,最終打包沒有成功。下載了匹配版本打包成功。
可是測試高版本,如果不行,就使用匹配的對應版本。這裏面選擇了匹配的對應版本。
5.配置gradle的本地環境。
gradle-1.12-all的解壓路徑

  GRADLE_HOME      
  D:\Gradle\gradle-1.12-all\gradle-1.12

配置一下path(GRADLE_HOME只是作爲一個根路徑而已)

新建一個 gradle-repo文件夾配置環境變量

  GRADLE_USER_HOME

  D:\Gradle\gradle-repo

測試gradle環境是否配置成功。

在命令提示符中輸入:gradle -version


出現如上圖結果,表示gradle配置成功。

二.使用gradle進行打包

1.查看需要打包的項目中的gradle.build文件(默認生成的文件)並添加相關腳本代碼

  1. buildscript {  
  2.  //buildscript中的聲明是gradle腳本自身需要使用的資源。  
  3.  //可以聲明的資源包括依賴項、第三方插件、maven倉庫地址等  
  4.     repositories {  
  5.         mavenCentral()  
  6.     }  
  7.     dependencies {  
  8.         classpath 'com.android.tools.build:gradle:0.12.+'  
  9.     }  
  10. }  
  11. apply plugin: 'android'  
  12. //在build.gradle文件中直接聲明的依賴項、倉庫地址等信息是項目自身需要的資源  
  13. dependencies {  
  14.     compile fileTree(dir: 'libs', include: '*.jar')  
  15. }  
  16. android {  
  17.     compileSdkVersion 19  
  18.     buildToolsVersion "19.1.0"  
  19.     sourceSets {  
  20.         main {  
  21.             manifest.srcFile 'AndroidManifest.xml'  
  22.             java.srcDirs = ['src']  
  23.             resources.srcDirs = ['src']  
  24.             aidl.srcDirs = ['src']  
  25.             renderscript.srcDirs = ['src']  
  26.             res.srcDirs = ['res']  
  27.             assets.srcDirs = ['assets']  
  28.         }  
  29.         // Move the tests to tests/java, tests/res, etc...  
  30.         instrumentTest.setRoot('tests')  
  31.         // Move the build types to build-types/<type>  
  32.         // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...  
  33.         // This moves them out of them default location under src/<type>/... which would  
  34.         // conflict with src/ being used by the main source set.  
  35.         // Adding new build types or product flavors should be accompanied  
  36.         // by a similar customization.  
  37.         debug.setRoot('build-types/debug')  
  38.         release.setRoot('build-types/release')  
  39.     }  
  40.      
  41.     lintOptions {  
  42.      abortOnError false  
  43.    }  
  44.    
  45.  ////////////////////以上代碼打出了最簡單的包,一般情況下生成了兩個包////////////////////  
  46.  //*-debug-unaligned.apk:未進行zipAlign優化的apk包  
  47.  //*-release-unsigned.apk:未簽名的apk包  
  48.  //以上兩種包都不是正式所需要的包,添加下面代碼打出簽名包  
  49.    
  50.     signingConfigs {  
  51.    myConfig {  
  52.         //絕對路徑和相對路徑都可以  
  53.          storeFile file("E:\\sjjywork\\key\\key4VipOneToOne\\JyVipKey.keystore")  
  54.         storePassword ""  
  55.         keyAlias ""  
  56.         keyPassword ""  
  57.    }  
  58.   }  
  59.  buildTypes{  
  60.       release {  
  61.       //1.添加簽名  
  62.       signingConfig  signingConfigs.myConfig  
  63.       //2.runProguard 執行混淆代碼  
  64.       runProguard true  
  65.       //混淆規則文件  
  66.        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'  
  67.       }  
  68.  }  
  69.      
  70.    //添加了上述代碼之後,打出了已經簽名的apk:其中xxx-release-unaligned.apk是簽名爲進行zipAligned優化的包  
  71.    //xxx-release.apk是簽名和zipAlign優化過的包  
  72.    //添加混淆代碼的執行代碼如上第二步,就可以實現打出混淆包  
  73.      
  74.    //下面的代碼開始打批量包  
  75.      
  76.    productFlavors {  
  77.      GooglePlay{  
  78.       //替換manifest文件中的佔位符(placeHolder)  
  79.         manifestPlaceholders = [UMENG_CHANNEL_VALUE:"GooglePlay"]  
  80.      }  
  81.      Store360{  
  82.         manifestPlaceholders = [UMENG_CHANNEL_VALUE:"Store360" ]    
  83.      }  
  84.      //在下面繼續添加不同渠道的渠道代碼  
  85.  }  
  86.  //通過以下方式是批量的設置  
  87. // productFlavors.all { flavor ->  
  88.   //  flavor.manifestPlaceholders = [ UMENG_CHANNEL_VALUE:name ]  
  89.   //}  
  90. }  
  91. tasks.withType(Compile) { options.encoding = "UTF-8" }  

在這個文件中手動添加的代碼都已經做了詳細的註釋。

2.manifest中添加友盟統計的key和渠道代碼(關於友盟統計的key的獲取和添加,直接參考友盟統計的文檔,不多做解釋)
打渠道包的目的是什麼?爲什麼要打渠道包?這個可以見<<1.0apk批量打包認知>>
得到的結論,是要做統計。上面的文件中,使用了友盟統計。
此時需要在manifest.xml添加如下代碼:
  1. <!-- 渠道id,key直接使用umeng的,方便接入umeng sdk -->  
  2.         <meta-data android:name="UMENG_APPKEY" android:value="YOUR_APP_KEY" ></meta-data>  
  3.         <!--配置placeHolder(佔位符),用於多渠道打包的時候替換-->  
  4.         <meta-data  
  5.             android:name="UMENG_CHANNEL"  
  6.             android:value="${UMENG_CHANNEL_VALUE}" />  

打批量包的時候,主要使用到的placeHolder:${UMENG_CHANNEL_VALUE} 清單文件中的一個佔位符。
在批量打包的過程批量替換這個UMENG_CHANNEL_VALUE這個字段生成不同的apk包。

3.正式執行批量打包
在控制檯中,進入項目所在的目錄,執行gradle clean,gradle  build。如果沒有報錯,將打包成功
如下圖:gradle clean

報錯的原因:註釋和代碼之間添加空行。因爲對這個腳本語言不太熟悉,所以不明具體原因。
執行gradle build


到此整個批量打包的過程就完美結束。
刷新項目文件夾看看打出的包:
其中-項目名稱-渠道-release.apk就是最終我們所需的渠道apk。
整個批量打包的過程大概十幾分鍾就搞定了。但是如果對這裏面的打包過程是不是還存在很多疑惑。
推薦看如下幾篇文章.

①自動生成的gradle.build文件 直接進行打包會生成那些包?各種不同的包,有什麼區別?
參見2.1 gradle打包blog
Gradle分步構建android應用
②zipAlign優化是什麼意思?
參見2.4
zipAlign優化
③lint工具是做什麼用的?
④配置和打包的全過程大概十多分鐘。但是如果出現報錯,可就要耗費時間了。
常見的報錯參考以下文章:
參見2.3gradle打包遇到的錯誤

gradle打包錯誤彙總

至此算是打包的所有流程真正的結束了。加入統計功能的代碼,直接根據友盟統計的文檔添加相應位置的代碼就可以了。





gradle  build.gradle配置文件:

buildscript {
    repositories {
        mavenCentral()
    }
 
    dependencies {
        classpath 'com.android.tools.build:gradle:0.9.0'    //最新版本
    }
}
 
//使用android插件
apply plugin: 'android'
 
//各種依賴
dependencies {
    //添加libs文件夾下的所有jar
    compile fileTree(dir: 'libs', include: '*.jar')
    //這裏添加其他依賴,可以是本地、遠程的庫,例如本地libraries/support_v7的庫
    //compile project(':libraries:support_v7')
}
 
//下面一段是將libs/*/*.so文件加入打包
//如果你的項目是使用Eclipse+ADT建立的,則需要這段代碼
task copyNativeLibs(type: Copy) {
    from(new File('libs')) { include '**/*.so' }
    into new File(buildDir, 'native-libs')
}
 
tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }
clean.dependsOn 'cleanCopyNativeLibs'
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
    pkgTask.jniFolders = new HashSet<File>()
    pkgTask.jniFolders.add(new File(buildDir, 'native-libs'))
}
 
//開始android配置
android {
    //編譯版本,這裏指定的是最新的19
    compileSdkVersion 19
    buildToolsVersion "19.0.0"
 
    //配置source路徑(如果使用的不是默認路徑的話,必須配置)
    sourceSets{
        main{
            manifest {
                srcFile 'AndroidManifest.xml'
            }
            //下面的寫法看起來比較簡潔,當然你也可以用上面的寫法
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
        //測試所在的路徑,這裏假設是tests文件夾,沒有可以不寫這一行
        //androidTest.setRoot('tests')
    }
 
    //簽名
    signingConfigs {
        debug {
            storeFile file("~/.android/debug.keystore")
        }
 
        //你自己的keystore信息
        release {
            storeFile file("your.keystore")
            storePassword "yourPassword"
            keyAlias "yourAlias"
            keyPassword "yourPassword"
        }
    }
 
    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
        release {
            signingConfig signingConfigs.release
        }
    }
 
    //渠道Flavors,我這裏寫了一些常用的,你們自己改
    productFlavors {
        GooglePlay{}
        //Store360{}
        //QQ{}
        //Taobao{}
        //WanDouJia{}
        //AnZhuo{}
        //AnZhi{}
        //BaiDu{}
        //Store163{}
        //GFeng{}
        //AppChina{}
        //EoeMarket{}
        //Store91{}
        //NDuo{}
    }
 
    //這個是解決lint報錯的代碼
    lintOptions {
          abortOnError false
    }
 
}
 
tasks.withType(Compile) {
    options.encoding = "UTF-8"
}
 
//替換AndroidManifest.xmlUMENG_CHANNEL_VALUE字符串爲渠道名稱 By Remex Huang
android.applicationVariants.all{ variant ->
    variant.processManifest.doLast{
    
        //之前這裏用的copy{},我換成了文件操作,這樣可以在v1.11版本正常運行,並保持文件夾整潔
        //${buildDir}是指./build文件夾
        //${variant.dirName}flavor/buildtype,例如GooglePlay/release,運行時會自動生成
        //下面的路徑是類似這樣:./build/manifests/GooglePlay/release/AndroidManifest.xml
        def manifestFile = "${buildDir}/manifests/${variant.dirName}/AndroidManifest.xml"
        
        //將字符串UMENG_CHANNEL_VALUE替換成flavor的名字
        def updatedContent = new File(manifestFile).getText('UTF-8').replaceAll("UMENG_CHANNEL_VALUE", "${variant.productFlavors[0].name}")
        new File(manifestFile).write(updatedContent, 'UTF-8')
        
        //將此次flavorAndroidManifest.xml文件指定爲我們修改過的這個文件
        variant.processResources.manifestFile = file("${buildDir}/manifests/${variant.dirName}/AndroidManifest.xml")
    }    
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章