├── .gitignore ├── .idea ├── .name ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── encodings.xml ├── gradle.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── WuXiaolong.jks ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── wuxiaolong │ │ └── gradle4android │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── wuxiaolong │ │ │ └── gradle4android │ │ │ └── MainActivity.java │ └── res │ │ ├── layout │ │ ├── activity_main.xml │ │ └── content_main.xml │ │ ├── menu │ │ └── menu_main.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-v21 │ │ └── styles.xml │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── wuxiaolong │ └── gradle4android │ └── ExampleUnitTest.java ├── build.gradle ├── config.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | Gradle4Android -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 46 | 47 | 48 | 49 | 50 | 1.8 51 | 52 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Gradle for Android 2 | Gradle是一种基于Groovy的动态DSL,而Groovy语言是一种基于jvm的动态语言。这里只分享实际开发中会用到的场景,您不需要去学习Groovy语言,知道Java的您是很容易阅读Groovy语言的。 3 | 涉及的知识点有:Gradle基本配置、依赖管理、全局设置、自定义BuildConfig、混淆、多渠道打包、配置签名信息、单元测试,是不是迫不及待了啊,快来学习学习。 4 | 5 | # 系列博客 6 | [Gradle for Android(一)基本配置、依赖管理](http://wuxiaolong.me/2016/03/30/gradle4android1/) 7 | 8 | [Gradle for Android(二)全局设置、自定义BuildConfig、混淆](http://wuxiaolong.me/2016/03/31/gradle4android2/) 9 | 10 | [Gradle for Android(三)多渠道打包、配置签名信息](http://wuxiaolong.me/2016/04/01/gradle4android3/) 11 | 12 | # 微信公众号 13 | 欢迎微信扫一扫关注:不止于技术分享,每天进步一点点。 14 | 15 | ![](http://7q5c2h.com1.z0.glb.clouddn.com/qrcode_wuxiaolong.jpg) 16 | 17 | # 关于作者 18 | [点击查看](http://wuxiaolong.me/about/) 19 | 20 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/WuXiaolong.jks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WuXiaolong/Gradle4Android/32f086077b37a950ee2fc29066f088d260c3cbe5/app/WuXiaolong.jks -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | android { 3 | compileSdkVersion rootProject.ext.android.compileSdkVersion 4 | defaultConfig { 5 | applicationId "com.wuxiaolong.gradle4android" 6 | minSdkVersion rootProject.ext.android.minSdkVersion 7 | targetSdkVersion rootProject.ext.android.targetSdkVersion 8 | versionCode 1 9 | versionName "1.0" 10 | buildConfigField 'String', 'API_SERVER_URL', '"http://wuxiaolong.me/"' 11 | } 12 | signingConfigs {//签名的配置 13 | release { 14 | storeFile file('WuXiaolong.jks') 15 | storePassword 'android' 16 | keyAlias 'android' 17 | keyPassword 'android' 18 | } 19 | debug { 20 | storeFile file('WuXiaolong.jks') 21 | storePassword 'android' 22 | keyAlias 'android' 23 | keyPassword 'android' 24 | } 25 | } 26 | buildTypes { 27 | release { 28 | minifyEnabled false//是否启动混淆 29 | zipAlignEnabled false//是否启动zipAlign 30 | shrinkResources false // 是否移除无用的resource文件 31 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 32 | signingConfig signingConfigs.release//打包命令行:gradlew assembleRelease 33 | applicationVariants.all { variant -> 34 | if (variant.buildType.name == 'release') { 35 | variant.outputs.all { 36 | def apkName = "gradle4android_v${variant.versionName}" 37 | if (!variant.flavorName.isEmpty()) { 38 | apkName += "_${variant.flavorName}" 39 | } 40 | outputFileName = apkName + "_${releaseTime()}.apk" 41 | } 42 | } 43 | } 44 | //针对很多渠道 45 | productFlavors.all { flavor -> 46 | manifestPlaceholders.put("UMENG_CHANNEL_VALUE", name) 47 | } 48 | } 49 | } 50 | flavorDimensions 'tier' 51 | productFlavors { 52 | //多渠道打包,命令行打包:gradlew assembleRelease 53 | debugServer { 54 | dimension 'tier' 55 | buildConfigField 'String', 'API_SERVER_URL', '"我的公众号:吴小龙同学"' 56 | } 57 | 58 | releaseServer { 59 | dimension 'tier' 60 | buildConfigField 'String', 'API_SERVER_URL', '"http://wuxiaolong.me/"' 61 | } 62 | 63 | xiaomi { 64 | dimension 'tier' 65 | applicationId 'com.wuxiaolong.gradle4android1' 66 | } 67 | 68 | googlepaly { 69 | dimension 'tier' 70 | applicationId 'com.wuxiaolong.gradle4android2' 71 | } 72 | } 73 | lintOptions { 74 | //设置编译的lint开关,程序在buid的时候,会执行lint检查,有任何的错误或者警告提示,都会终止构建 75 | abortOnError false 76 | } 77 | } 78 | 79 | dependencies { 80 | compile fileTree(include: ['*.jar'], dir: 'libs') 81 | testCompile 'junit:junit:4.12' 82 | compile rootProject.ext.appcompatV7 83 | compile rootProject.ext.dependencies.design 84 | 85 | } 86 | 87 | def releaseTime() { 88 | return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC")) 89 | } 90 | 91 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\Android\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/wuxiaolong/gradle4android/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.wuxiaolong.gradle4android; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/wuxiaolong/gradle4android/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.wuxiaolong.gradle4android; 2 | 3 | import android.os.Bundle; 4 | import android.support.design.widget.FloatingActionButton; 5 | import android.support.design.widget.Snackbar; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.support.v7.widget.Toolbar; 8 | import android.util.Log; 9 | import android.view.Menu; 10 | import android.view.MenuItem; 11 | import android.view.View; 12 | 13 | public class MainActivity extends AppCompatActivity { 14 | 15 | @Override 16 | protected void onCreate(Bundle savedInstanceState) { 17 | super.onCreate(savedInstanceState); 18 | setContentView(R.layout.activity_main); 19 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 20 | setSupportActionBar(toolbar); 21 | FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 22 | fab.setOnClickListener(new View.OnClickListener() { 23 | @Override 24 | public void onClick(View view) { 25 | Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 26 | .setAction("Action", null).show(); 27 | Log.d("wxl", "API_SERVER_URL=" + BuildConfig.API_SERVER_URL); 28 | } 29 | }); 30 | 31 | 32 | } 33 | @Override 34 | public boolean onCreateOptionsMenu(Menu menu) { 35 | // Inflate the menu; this adds items to the action bar if it is present. 36 | getMenuInflater().inflate(R.menu.menu_main, menu); 37 | return true; 38 | } 39 | 40 | @Override 41 | public boolean onOptionsItemSelected(MenuItem item) { 42 | // Handle action bar item clicks here. The action bar will 43 | // automatically handle clicks on the Home/Up button, so long 44 | // as you specify a parent activity in AndroidManifest.xml. 45 | int id = item.getItemId(); 46 | 47 | //noinspection SimplifiableIfStatement 48 | if (id == R.id.action_settings) { 49 | return true; 50 | } 51 | 52 | return super.onOptionsItemSelected(item); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 14 | 15 | 21 | 22 | 23 | 24 | 25 | 26 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/layout/content_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 14 | 15 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_main.xml: -------------------------------------------------------------------------------- 1 | 5 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WuXiaolong/Gradle4Android/32f086077b37a950ee2fc29066f088d260c3cbe5/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WuXiaolong/Gradle4Android/32f086077b37a950ee2fc29066f088d260c3cbe5/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WuXiaolong/Gradle4Android/32f086077b37a950ee2fc29066f088d260c3cbe5/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WuXiaolong/Gradle4Android/32f086077b37a950ee2fc29066f088d260c3cbe5/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WuXiaolong/Gradle4Android/32f086077b37a950ee2fc29066f088d260c3cbe5/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | > 2 | 3 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 16dp 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Gradle4Android 3 | Settings 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 15 | 16 |