【转】Android 多渠道打包:使用Gradle和Android Studio

来源:互联网 发布:幻影粒子软件 编辑:程序博客网 时间:2024/05/21 17:25

本文出自:   http://blog.csdn.net/jjwwmlp456/article/details/45057067  ----------------- 匆忙拥挤repeat


Gradle,这个东西好复杂,不过在Android中,我们知道它大概怎么用,它的依据何来,就够了。

Gradle的DSL,领域特定语言(domain-specific languages,简称DSL),地址:http://gradle.org/docs/2.3/dsl/

Gradle的用户指南,地址:http://gradle.org/docs/2.3/userguide/userguide.html

Android-Gradle-DSL    Android结合Gradle的DSL

   下载地址:https://developer.android.com/shareables/sdk-tools/android-gradle-plugin-dsl.zip

简单介绍Android-Gradle构建插件的官方地址:https://developer.android.com/tools/building/plugin-for-gradle.html

详细介绍Android-Gradle构建插件的官方地址:http://tools.android.com/tech-docs/new-build-system


build.gradle的基本形式

Android Studio 建立project,可在其下建立多个moudle。

一个project自动生成一个build.gradle,每个module下也自动生成一个build.gradle (本文主要讨论module中的build.gradle构建)

module/build.gradle:

[plain] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. apply plugin: 'com.android.application'  //启用android 应用插件  
  2.   
  3. android {  
  4.     compileSdkVersion 22  
  5.     buildToolsVersion "22.0.1"  
  6.   
  7.     defaultConfig {  
  8.         applicationId "com.stone.testbuild"  
  9.         minSdkVersion 8  
  10.         targetSdkVersion 22  
  11.         versionCode 1  
  12.         versionName "1.0"  
  13.     }  
  14.     buildTypes {  
  15.         release {  
  16.             minifyEnabled false  
  17.             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
  18.         }  
  19.     }  
  20. }  
  21.   
  22. dependencies {  
  23.     compile fileTree(dir: 'libs', include: ['*.jar'])  
  24.     compile 'com.android.support:appcompat-v7:22.0.0'  
  25. }  

Android-Gradle DSL 简介

上面示例中的android{ },就是我们需要主了解的,在android{}块中可以包含以下直接配置项:

  • defaultConfig{} 默认配置,是ProductFlavor类型。它共享给其他ProductFlavor使用
  • sourceSets{ } 源文件目录设置,是AndroidSourceSet类型。
  • buildTypes{ } BuildType类型
  • signingConfigs{ } 签名配置,SigningConfig类型
  • productFlavors{ } 产品风格配置,ProductFlavor类型
  • testOptions{ } 测试配置,TestOptions类型
  • aaptOptions{ } aapt配置,AaptOptions类型
  • lintOptions{ } lint配置,LintOptions类型
  • dexOptions{ } dex配置,DexOptions类型
  • compileOptions{ } 编译配置,CompileOptions类型
  • packagingOptions{ } PackagingOptions类型
  • jacoco{ } JacocoExtension类型。 用于设定 jacoco版本
  • splits{ } Splits类型。

在DSL文档中,以上每个类型都有它的详细配置选项


多渠道打包

自动签名、混淆、打包、注入多个渠道。

例,module>build.gradle:

[plain] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. apply plugin: 'com.android.application'  
  2.   
  3. /*  
  4. 定义一个方法,仅def声明时,返回类型任意(自动判断)  
  5.    可以将返回值直接写成String 或def String  
  6. gradle支持groovy语言,groovy默认引入的包有:  
  7.   java.io.* java.lang.* java.math.BigDecimal java.math.BigInteger  
  8.   java.net.* java.util.* groovy.lang.* groovy.util.*  
  9.  */  
  10. def String computeVersionName() {  
  11.     return "8.8.8"  
  12. }  
  13.   
  14.   
  15. android {  
  16.     compileSdkVersion 22  
  17.     buildToolsVersion "22.0.1"  
  18.   
  19.   
  20.     defaultConfig {  
  21.         applicationId "com.stone.myapplication"  
  22.         minSdkVersion 8  
  23.         targetSdkVersion 22  
  24.         versionCode 1  
  25.         versionName computeVersionName() //使用外部定义的方法  
  26.         /*  
  27.         manifestPlaceholders   
  28.             manifest中使用占位符,如:<... android:name="${YOUR_APP_KEY}" >  
  29.             以[key-value]形式替换:[YOUR_APP_KEY:"value"]  
  30.         */  
  31.         manifestPlaceholders = [YOUR_APP_KEY: "友盟后台的appkey"]  
  32.     }  
  33.   
  34.     signingConfigs { //gradle assembleRelease  
  35.         /*  
  36.            可以定义多个签名配置项,如下面的myConfig  
  37.          */  
  38.         myConfig {  
  39.             storeFile file("stone.keystore")  
  40.             storePassword "mypasswd"  
  41. //          storePassword System.console().readLine("\nKeystore password: ")  
  42.             keyAlias "stone"  
  43.             keyPassword "mypasswd"  
  44. //          keyPassword System.console().readLine("\nKey password: ")  
  45.         }  
  46.     }  
  47.   
  48.     buildTypes {  
  49.         /*  
  50.             可以配置多个buildType项,如下面的release,debug,aabbcc  
  51.          */  
  52.         release {  
  53.             minifyEnabled true  //译:使变小enabled。   即启用混淆器  
  54.             //混淆文件:sdk/tools/proguard/proguard-android.txt 和 当前module下的proguard-rules.pro  
  55. //            proguardFiles  getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'  
  56.             //getDefaultProguardFile('proguard-android.txt'),  
  57.             //getDefaultProguardFile('proguard-android-optimize.txt'),  
  58.             signingConfig signingConfigs.myConfig  
  59.             zipAlignEnabled true    //混淆后的zip优化,默认为true,可不写。当不显示配置为true时,不会生成unaligned.apk  
  60.         }  
  61.         debug {  
  62.             debuggable true  //启用debug的buildType配置  
  63.         }  
  64.   
  65.         aabbcc {//自定义配置,未配置签名项,所以会生成未签名apk  
  66.             multiDexEnabled true  
  67.         }  
  68.     }  
  69.   
  70.     productFlavors {  
  71.         /*  
  72.           productFlavors-产品风格:  
  73.                 即不同产品的配置,它会基于上面的公共配置项defaultConfig  
  74.                 下面的配置项与buildTypes{}中的配置项,成类似sql中的全联(full join)关系  
  75.                  当执行 $gradle build   命令后,会生成:  
  76.                     module-flavor1-release-unaligned.apk  
  77.                     module-flavor1-release.apk  
  78.                     module-flavor1-debug-unaligned.apk  
  79.                     module-flavor1-debug.apk  
  80.                     module-flavor1-aabbcc.apk  
  81.                     ...flavor2...apk  
  82.   
  83.           applicationId 用于标识 在谷歌Play商店上的唯一标识 默认不配置,则与app的AndroidManifest.xml中的package一致  
  84.                 仅替换<manifest>中的package属性值,其它不受影响  
  85.   
  86.          */  
  87.   
  88.         flavor1 {  
  89.             proguardFiles 'proguard-rules.pro'  
  90.             applicationId "com.stone.myapplication.pro" //比如 专业版  
  91.             manifestPlaceholders = [channelID: "百度应用平台"]  
  92.         }  
  93.   
  94.         flavor2 {  
  95.             proguardFile 'proguard-rules.pro'  
  96.             applicationId "com.stone.myapplication.free" //比如 免费版  
  97.             manifestPlaceholders = [channelID: "豌豆夹"]  
  98.         }  
  99.     }  
  100.   
  101. }  
  102.   
  103. dependencies {  
  104.     //  Local binary dependency  本地jar包  
  105.     compile fileTree(dir: 'libs', include: ['*.jar'])  
  106.     // Module dependency 引用android-library项目  
  107.     compile project(':eventbuslib')  
  108.     /*  
  109.       Remote binary dependency  download to local   group:name:version   
  110.       配置远程仓库中的jar包,打包时,检查本地有没有,若没有则下载到本地。  
  111.      */  
  112.     compile 'com.android.support:appcompat-v7:22.0.0'  
  113.     compile 'com.android.support:support-v4:22.0.0'  
  114.     compile 'com.android.support:cardview-v7:22.0.0'  
  115.     compile 'com.android.support:recyclerview-v7:22.0.0'  
  116. }  
关于多渠道,其实就是定义了多个flavor。用manifestPlaceholders配置,替换manifest中的占位符${}。

manifest.xml:

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.stone.myapplication">  
  4.   
  5.     <application  
  6.         android:allowBackup="true"  
  7.         android:icon="@mipmap/ic_launcher"  
  8.         android:label="@string/app_name"  
  9.         android:theme="@style/AppTheme">  
  10.         <activity  
  11.             android:name=".MainActivity"  
  12.             android:label="@string/app_name">  
  13.             <intent-filter>  
  14.                 <action android:name="android.intent.action.MAIN" />  
  15.   
  16.                 <category android:name="android.intent.category.LAUNCHER" />  
  17.             </intent-filter>  
  18.   
  19.             <meta-data  
  20.                 android:name="UMENG_APPKEY"  
  21.                 android:value="${YOUR_APP_KEY}" />  
  22.             <meta-data  
  23.                 android:name="channelName"  
  24.                 android:value="${channelID}" />  
  25.         </activity>  
  26.     </application>  
  27.   
  28. </manifest>  

最后,执行 $gradle build 命令 , 就ok了


完整示例:https://github.com/aa86799/ProguardPack


0 0
原创粉丝点击