Android-Gradle打包

用了一段时间的android studio(简称as)了,总体来说还是比eclipse还用的多,推荐还在用eclipse的同学赶紧转了,上手还是很快的。
在as下打包有两种方式,一种是as打包,一种是直接执行gradle命令打包,两种方式都要使用gradle,所以学会配置gradle是必要的。

  1. 什么是Gradle?

    Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的领域特定(DSL)语言。Android Studio中新建项目成功后自动下载Gradle。

    你肯定要问了,groovy是个什么东东,我也没接触过,下面是百度百科,贴过来,抛个砖,有兴趣的童鞋自己再去搜吧:

    Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy 可以使用其他 Java 语言编写的库。

  2. as打包
    先看一下我的build.gradle配置。

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.wd.demo"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false #是否混淆,先打一个不混淆的
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

}

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

基本就是自动生成的,没有修改。
as ->Build -> Generate Signed APK
弹出如下提示框,选择你要打包的模块,点击Next
选择你要打包的模块

选择你的签名文件,输入alias和password,如果你不知道android如何生成签名文件,请自行搜索,输入完成后点击Next,这里有可能还会弹出密码输入框,让你二次确认,再输入一遍就好;
这里写图片描述

选择打包文件的存放地址和你要打包的类型,release(发布版本)/debug(调试版本),点击finish,如果代码和配置都没问题,那就会生成apk了;
这里写图片描述

是不是觉得少点什么,对,木有混淆,如果你要混淆,需要添加以下配置:

buildTypes {
        release {
            minifyEnabled true #修改为true,混淆
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

需要配置proguard-rules.pro,设定一些混淆参数和一些不混淆的类和方法:

-optimizationpasses 5          # 指定代码的压缩级别
-dontusemixedcaseclassnames   # 是否使用大小写混合
-dontpreverify           # 混淆时是否做预校验
-verbose                # 混淆时是否记录日志

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  # 混淆时所采用的算法

-keep public class * extends android.app.Activity      # 保持哪些类不被混淆
-keep public class * extends android.app.Application   # 保持哪些类不被混淆
-keep public class * extends android.app.Service       # 保持哪些类不被混淆
-keep public class * extends android.content.BroadcastReceiver  # 保持哪些类不被混淆
-keep public class * extends android.content.ContentProvider    # 保持哪些类不被混淆
-keep public class * extends android.app.backup.BackupAgentHelper # 保持哪些类不被混淆
-keep public class * extends android.preference.Preference        # 保持哪些类不被混淆
-keep public class com.android.vending.licensing.ILicensingService    # 保持哪些类不被混淆

-keepclasseswithmembernames class * {  # 保持 native 方法不被混淆
    native <methods>;
}
-keepclasseswithmembers class * {   # 保持自定义控件类不被混淆
    public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {# 保持自定义控件类不被混淆
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity { # 保持自定义控件类不被混淆
    public void *(android.view.View);
}
-keepclassmembers enum * {     # 保持枚举 enum 类不被混淆
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆
    public static final android.os.Parcelable$Creator *;
}
-keep public class com.wd.interact.WDInterface {#自定义不混淆的类
  public *;
}

重复打包流程,这回就是混好的包了。

3.使用gradle命令进行打包
为什么要使用gradle命令进行打包呢,
1.提供给测试等非开发人员进行打包,更加方便,不需要改动代码;
2.避免每次输入签名文件地址,密码等,更加简单;
3.最重要的是,能批量打出渠道包,如果市场的同学找你,要1000个渠道的包,你是不是觉得用as打包会疯掉,解决方式就是使用gradle命令进行打包,来吃狗;

(1)配置gradle环境:
想用gradle命令打包,首先配置环境变量,我的是mac,所以只说mac版本的配置方式,pc的童鞋自行搜索吧。
开打终端,输入touch ~/.bash_profile,回车,创建文件;
这里写图片描述

命令行输入以下内容,一个是gradle文件夹路径,一个是bin路径,找到你电脑相对应的路径,按照以下格式插入:

echo "export GRADLE_HOME=/Users/username/.gradle/wrapper/dists/gradle-2.10-all/a4w5fzrkeut1ox71xslb49gst/gradle-2.10" >> ~/.bash_profile

echo 'export PATH=/Users/username/.gradle/wrapper/dists/gradle-2.10-all/a4w5fzrkeut1ox71xslb49gst/gradle-2.10/bin:$PATH' >> ~/.bash_profile

输入open .bash_profile,打开文件,查看是否包含以下内容,包含了就没问题:
这里写图片描述

输入source .bash_profile,生效命令;
这里写图片描述
重启终端,输入gradle -v,有信息就ok了;
这里写图片描述
自此,环境配置完成。

(2)配置签名信息

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.wd.demo"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }

    #签名信息
    signingConfigs {
        releaseConfig {
            keyAlias 'keystore'
            keyPassword '12345678'
            storeFile file('/Users/username/dev/android/SDK/software/keystore')
            storePassword '12345678'
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.releaseConfig#配置签名信息
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile project(':leilbsdk1.0')
    compile 'com.android.support:appcompat-v7:23.2.0'
    compile 'com.android.support:design:23.2.0'
}

(3)as打开Terminal模块,输入gradlew assembleRelease,开始执行打包脚本,噼里啪啦的命令行开始滚动,最后成功会显示successful。
(4)打多渠道包
首先,在manifest里面配置:

<meta-data
            android:name="CHANNEL"
            android:value="${CHANNEL_VALUE}" />

build.gradle里面添加一段

productFlavors {
        wandoujia {}
        baidu {}
        c360 {}
        uc {}

        productFlavors.all { flavor ->
            flavor.manifestPlaceholders = [CHANNEL_VALUE:name]
        }
    }

执行gradlew assembleRelease,会看到会分渠道打包了;
问题来了,打出来的包在哪呢?
../项目名/模块名/build/outputs/apk,可以看到刚才的包了,整个流程完成。

其实这个只是一个简单的利用gradle打包的演示,还有一些更为复杂的功能有空了继续研究,欢迎大家拍砖。

QQ交流群:455166035,欢迎加入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值