什么是Gradle

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

1.整个项目的gradle配置文件build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript {repositories {mavenCentral()}dependencies {classpath 'com.android.tools.build:gradle:1.1.0'// NOTE: Do not place your application dependencies here; they belong// in the individual module build.gradle files}
}allprojects {repositories {mavenCentral()}
}

内容主要包含了两个方面:一个是声明仓库的源,我这里用的是mavenCentral(), jcenter可以理解成是一个新的中央远程仓库,兼容maven中心仓库,而且性能更优。另一个是声明了android gradle plugin的版本,android studio 1.1正式版必须要求支持gradle plugin 1.1的版本。


2.app文件夹下这个Module的gradle配置文件,也可以算是整个项目最主要的gradle配置文件

apply plugin: 'com.android.application'buildscript {repositories {mavenCentral()}dependencies {classpath 'com.android.tools.build:gradle:1.1.0'}
}android {compileSdkVersion 17buildToolsVersion "21.1.2"defaultConfig {applicationId "com.lippi.recorder"minSdkVersion 15targetSdkVersion 17versionCode 1versionName '1.4' // dex突破65535的限制multiDexEnabled true // AndroidManifest.xml 里面UMENG_CHANNEL的value为 ${UMENG_CHANNEL_VALUE}manifestPlaceholders = [UMENG_CHANNEL_VALUE: "channel_name"]}sourceSets {main {manifest.srcFile 'src/main/AndroidManifest.xml'java.srcDirs = ['src/main/java']resources.srcDirs = ['src/main/resources']aidl.srcDirs = ['src/main/aidl']renderscript.srcDirs = ['src/maom']res.srcDirs = ['src/main/res']assets.srcDirs = ['src/main/assets']jniLibs.srcDir 'src/main/jniLibs'} // Move the tests to tests/java, tests/res, etc...instrumentTest.setRoot('tests') // Move the build types to build-types/<type> // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ... // This moves them out of them default location under src/<type>/... which would // conflict with src/ being used by the main source set. // Adding new build types or product flavors should be accompanied // by a similar customization.debug.setRoot('build-types/debug')release.setRoot('build-types/release')} //执行lint检查,有任何的错误或者警告提示,都会终止构建,我们可以将其关掉。lintOptions {abortOnError false} //签名signingConfigs {debug {storeFile file("/home/lippi/.android/debug.keystore")}relealse { //这样写就得把demo.jk文件放在项目目录storeFile file("recorder.jks")storePassword "recorder"keyAlias "recorder"keyPassword "recorder"}}buildTypes {debug { // 显示LogbuildConfigField "boolean", "LOG_DEBUG", "true"versionNameSuffix "-debug"minifyEnabled falsezipAlignEnabled falseshrinkResources falsesigningConfig signingConfigs.debug}release { // 不显示LogbuildConfigField "boolean", "LOG_DEBUG", "false" //混淆minifyEnabled true //Zipalign优化zipAlignEnabled true // 移除无用的resource文件shrinkResources true //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg' //签名signingConfig signingConfigs.relealse}} //渠道Flavors,配置不同风格的appproductFlavors {GooglePlay {}xiaomi {}umeng {}_360 {}baidu {}wandoujia {}} //批量配置productFlavors.all { flavor ->flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]}compileOptions {sourceCompatibility JavaVersion.VERSION_1_7targetCompatibility JavaVersion.VERSION_1_7}applicationVariants.all { variant ->variant.outputs.each { output ->def outputFile = output.outputFileif (outputFile != null && outputFile.name.endsWith('.apk')) {def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}.apk")output.outputFile = new File(outputFile.parent, fileName)}}}dependencies {compile fileTree(include: ['*.jar'], dir: 'libs')compile 'org.apache.commons:commons-math:2.1'compile 'org.slf4j:slf4j-log4j12:1.7.5'}
}
  • 文件开头apply plugin是最新gradle版本的写法,以前的写法是apply plugin: ‘android’, 如果还是以前的写法,请改正过来。

  • buildToolsVersion这个需要你本地安装该版本才行,很多人导入新的第三方库,失败的原因之一是build version的版本不对,这个可以手动更改成你本地已有的版本或者打开 SDK Manager 去下载对应版本。

  • applicationId代表应用的包名,也是最新的写法,这里就不在多说了。

  • android 5.0开始默认安装jdk1.7才能编译

  • minifyEnabled(混淆)也是最新的语法,很早之前是runProguard,这个也需要更新下。

  • proguardFiles这部分有两段,前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,免去了我们很多事,这个文件的目录在 /tools/proguard/proguard-android.txt , 后一部分是我们项目里的自定义的混淆文件,目录就在 app/proguard-rules.txt , 如果你用Studio 1.0创建的新项目默认生成的文件名是 proguard-rules.pro , 这个名字没关系,在这个文件里你可以声明一些第三方依赖的一些混淆规则,后面会具体讲到。

compile project(‘:extras:ShimmerAndroid’)这一行是因为项目中存在其他Module,你可以理解成Android Library,由于Gradle的普及以及远程仓库的完善,这种依赖渐渐的会变得非常不常见,但是你需要知道有这种依赖的。


3.gradle目录下有个 wrapper 文件夹,里面可以看到有两个文件,我们主要看下 gradle-wrapper.properties 这个文件的内容:

#Fri Dec 19 21:59:01 CST 2014
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip

可以看到里面声明了gradle的目录与下载路径以及当前项目使用的gradle版本,这些默认的路径我们一般不会更改的,这个文件里指明的gradle版本不对也是很多导包不成功的原因之一。


4.settings.gradle

这个文件是全局的项目配置文件,里面主要声明一些需要加入gradle的module

include ':recorder'

文件中recorder是项目的module,如果还有其他module按照相同的格式加上去。


Gradle多渠道打包

由于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有了Gradle,这再也不是事了。
以友盟统计为例,在AndroidManifest.xml里面会有这么一段:

<meta-data
android:name="UMENG_CHANNEL"
android:value="Channel_ID" />

里面的Channel_ID就是渠道标示。我们的目标就是在编译的时候这个值能够自动变化。

第一步 在AndroidManifest.xml里配置PlaceHolder
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
第二步 在build.gradle 设置productFlavors
android {
productFlavors {xiaomi {}_360 {}baidu {}wandoujia {}
} productFlavors.all { flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] }
}

然后直接执行./gradlew assembleRelease然后就等待打包完成吧。

assemble 这个命令,会结合 Build Type 创建自己的task,如:

  • ./gradlew assembleDebug

  • ./gradlew assembleRelease

除此之外 assemble 还能和 Product Flavor 结合创建新的任务,其实 assemble 是和 Build Variants 一起结合使用的,而 Build Variants = Build Type + Product Flavor , 举个例子大家就明白了:

如果我们想打包wandoujia渠道的release版本,执行如下命令就好了:

./gradlew assembleWandoujiaRelease

如果我们只打wandoujia渠道版本,则:

./gradlew assembleWandoujia

此命令会生成wandoujia渠道的Release和Debug版本

同理我想打全部Release版本:

./gradlew assembleRelease

这条命令会把Product Flavor下的所有渠道的Release版本都打出来。


代码混淆

下面是常见的的proguard.cfg配置项:

# 指定代码的压缩级别
-optimizationpasses 5

# 包明不混合大小写
-dontusemixedcaseclassnames

# 不去忽略非公共的库类
-dontskipnonpubliclibraryclasses
# 优化不优化输入的类文件
-dontoptimize
# 预校验
-dontpreverify
# 混淆时是否记录日志
-verbose
# 混淆时所采用的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

# 保护注解
-keepattributes *Annotation*

# 保持哪些类不被混淆
-keep public class * extends android.app.Fragment
-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
# 如果有引用v4包可以添加下面这行
-keep public class * extends android.support.v4.app.Fragment
# 忽略警告
-ignorewarning

#记录生成的日志数据,gradle build时在本项目根目录输出 # apk 包内所有 class 的内部结构
-dump class_files.txt
# 未混淆的类和成员
-printseeds seeds.txt
# 列出从 apk 中删除的代码
-printusage unused.txt
# 混淆前后的映射
-printmapping mapping.txt

#记录生成的日志数据,gradle build时 在本项目根目录输出-end#####混淆保护自己项目的部分代码以及引用的第三方jar包library#-libraryjars libs/umeng-analytics-v5.2.4.jar#三星应用市场需要添加:sdk-v1.0.0.jar,look-v1.0.1.jar
#-libraryjars libs/sdk-v1.0.0.jar
#-libraryjars libs/look-v1.0.1.jar#如果不想混淆 keep 掉
-keep class com.lippi.recorder.iirfilterdesigner.** {*; }
#友盟
-keep class com.umeng.**{*;}
#项目特殊处理代码#忽略警告
-dontwarn com.lippi.recorder.utils**
#保留一个完整的包
-keep class com.lippi.recorder.utils.** {    *;}-keep class  com.lippi.recorder.utils.AudioRecorder{*;}
#如果引用了v4或者v7包
-dontwarn android.support.**

#混淆保护自己项目的部分代码以及引用的第三方jar包library-end-keep public class * extends android.view.View {    public <init>(android.content.Context);public <init>(android.content.Context, android.util.AttributeSet);public <init>(android.content.Context, android.util.AttributeSet, int);public void set*(...);
}#保持 native 方法不被混淆
-keepclasseswithmembernames class * {    native <methods>;
}#保持自定义控件类不被混淆
-keepclasseswithmembers class * {    public <init>(android.content.Context, android.util.AttributeSet);
}#保持自定义控件类不被混淆
-keepclassmembers class * extends android.app.Activity {   public void *(android.view.View);
}#保持 Parcelable 不被混淆
-keep class * implements android.os.Parcelable {  public static final android.os.Parcelable$Creator *;
}#保持 Serializable 不被混淆
-keepnames class * implements java.io.Serializable

#保持 Serializable 不被混淆并且enum 类也不被混淆
-keepclassmembers class * implements java.io.Serializable {    static final long serialVersionUID;private static final java.io.ObjectStreamField[] serialPersistentFields;!static !transient <fields>;!private <fields>;!private <methods>;private void writeObject(java.io.ObjectOutputStream);private void readObject(java.io.ObjectInputStream);java.lang.Object writeReplace();java.lang.Object readResolve();
}#保持枚举 enum 类不被混淆 如果混淆报错,建议直接使用上面的 -keepclassmembers class * implements java.io.Serializable即可
#-keepclassmembers enum * {
#  public static **[] values();
#  public static ** valueOf(java.lang.String);
#-keepclassmembers class * {    public void *ButtonClicked(android.view.View);
}#不混淆资源类
-keepclassmembers class **.R$* {    public static <fields>;
}#避免混淆泛型 如果混淆报错建议关掉
#–keepattributes Signature#移除log 测试了下没有用还是建议自己定义一个开关控制是否输出日志
#-assumenosideeffects class android.util.Log {
#    public static boolean isLoggable(java.lang.String, int);
#    public static int v(...);
#    public static int i(...);
#    public static int w(...);
#    public static int d(...);
#    public static int e(...);
##如果用用到Gson解析包的,直接添加下面这几行就能成功混淆,不然会报错。
#gson
#-libraryjars libs/gson-2.2.2.jar
-keepattributes Signature
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }

原文:http://ezlippi.com/blog/2015/03/android-studio-prefrence.html

Android Studio多渠道打包和代码混淆教程相关推荐

  1. (转)Android studio 使用心得(五)—代码混淆和破解apk

    这篇文章等是跟大家分享一在Android studio 进行代码混淆配置.之前大家在eclipse上也弄过代码混淆配置,其实一样,大家可以把之前在eclipse上的配置文件直接拿过来用.不管是.cfg ...

  2. android studio获取数字签名,Android应用开发Android Studio数字签名打包apk图文步骤教程...

    本文将带你了解Android应用开发Android Studio数字签名打包apk图文步骤教程,希望本文对大家学Android有所帮助. Android Studio数字签名打包release版apk ...

  3. Android Studio 多渠道打包、自动版本号及 gradlew 命令的基本使用

    Android Studio 真可谓神器,详细请点这里:打造安卓开发航空母舰 这里介绍其多渠道打包: 1 建立多渠道 这里介绍一种简单的,直接as操作: 直接上图咯,在项目结构你添加flavor就好了 ...

  4. android 自定义apk名,Android Studio多渠道打包、自定义打包APK名称

    现在为了推广产品,会在多个渠道应用市场发布应用,为了统计不同渠道的数据,需要在应用中表明渠道,如果一个一个去修改打包效率会很低.AS为我们提供了简便的方法,可以多渠道打包,一次打包所有的渠道包. 1. ...

  5. Android Studio 多渠道打包之友盟打包

    单一打包比较麻烦需要进行多次重复的打包,在此推荐可以更高效,更安全的多渠道打包方式--------友盟多渠道打包 下面是具体步骤介绍: 1.配置清单文件 代码如下: <meta-data     ...

  6. Android studio 多渠道打包(包括不同的包使用不同的资源文件、不同的包写不同的代码,包名等等)

    1,创建一个项目 ** 2,在项目中创建几个文件夹,等级和main文件夹平级,我这里创建了2个文件夹作为测试用.分别为ou1,out2.(文件夹名字按自己需求创建,用于区分不同渠道就行) ** 3,两 ...

  7. Android Studio 多渠道打包

    2019独角兽企业重金招聘Python工程师标准>>> build.gradle实例: apply plugin: 'com.android.application'android ...

  8. win10 jenkins svn android studio 自动化打包教程 以及一些问题的解决办法

    win10 jenkins svn android studio 自动化打包教程 这两天搭建jenkins自动构建环境,中间遇到点坑坑洼洼 分享出来希望后来人少走些弯路 准备软件 jenkins.ms ...

  9. Android studio 多渠道(多环境)打包grade配置详解

    Android studio 多渠道(多环境)打包grade配置详解 场景:开发app,我们需要两套环境或者两套环境以上的apk,每套环境的apk分两个版本debug版和release版. 公司有套平 ...

最新文章

  1. abaqus高性能服务器怎么用,高性能计算平台ABAQUS任务调度使用说明作者陈林E-Mailchenlin.PDF...
  2. 构建从目标到研发过程的全生命周期体验
  3. Python可视化(matplotlib)在图像中添加文本和标记(Text and Annotation)
  4. python常用内置函数总结-python常用内置函数
  5. 评价一个人,就是要看他把时间都花在哪了
  6. 三维重建11:点云的全局特征和局部特征
  7. SAP Spartacus部署到SAP Commerce Cloud,不同的系统设置不同的OCC Base url
  8. html之字符数字引用
  9. http://sourceforge.net/projects/rtspdirectshow/
  10. 控制台——EventLog实现事件日志操作
  11. 阿里巴巴中台技术架构实践与思考
  12. 一个正经的前端学习 开源 仓库(阶段十九)
  13. HTML插入Flash的全兼容完美解决方案-SWFObject
  14. 用层次分析法解决购买笔记本电脑的问题
  15. Android 扫码盒子全局接收付款码(全局事件上层接收多重下发)
  16. linux下读写ntfs硬盘吗,Linux环境下实现NTFS分区完全读写的方法
  17. OpenStack Heat服务介绍
  18. Mysql、SqlServer、Oracle三大数据库的区别
  19. 怎么做能打印发票的软件?
  20. pretty-errors:美化python异常输出以使其清晰易读

热门文章

  1. 五一回宜兴记 -- 植物志_拔剑-浆糊的传说_新浪博客
  2. 龙芯2K1000实战开发-项目整体框架介绍
  3. 自定义ASP.NET MVC JsonResult序列化结果
  4. css+javascript+jquery+prototype+ajax+html5+iis+apache
  5. 聋校计算机教学案例,聋校语文第五册第一课教学案例
  6. 如何使用小乌龟拉取git仓库项目
  7. Excel 利用同期群分析计算新用户留存率
  8. 前瞻-全时优化和LLVM-1(转)
  9. 国内直接使用的ChatGTP
  10. ssh远程执行服务器命令,ssh远程连接服务器执行命令