用了一段时间的android studio(简称as)了,总体来说还是比eclipse还用的多,推荐还在用eclipse的同学赶紧转了,上手还是很快的。
在as下打包有两种方式,一种是as打包,一种是直接执行gradle命令打包,两种方式都要使用gradle,所以学会配置gradle是必要的。
什么是Gradle?
Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的领域特定(DSL)语言。Android Studio中新建项目成功后自动下载Gradle。
你肯定要问了,groovy是个什么东东,我也没接触过,下面是百度百科,贴过来,抛个砖,有兴趣的童鞋自己再去搜吧:
Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy 可以使用其他 Java 语言编写的库。
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,欢迎加入。