zoukankan      html  css  js  c++  java
  • gradle教程 [原创](eclipse/ADT下 非插件 非Android Studio/AS)纯手打 第三篇:gradle完整的实战

    上两篇的地址

    安装配置

    http://www.cnblogs.com/uncle2000/p/4276833.html

    简单实战

    http://www.cnblogs.com/uncle2000/p/4277476.html

    我之所以以前用ant现在用gradle是因为 ant打包给 加入第三方依赖工程非常非常非常麻烦,而网上关于两者的对比就数不胜数了,大家可以去查,充分的说明了 gradle的优势

    而且还有一点就是gradle的中文资料是要多于ant的,想当初ant中加入for-each 和 switch-case 可是让我操碎了心,关于我的ant代码我也会在后面的android打包中给出源码。

    而关于gradle来打包我学一天就已经掌握了,而ant 用个循环还要装支持的插件我擦!并且我很讨厌标签化的语言

    好了废话少说 开门见山 此篇的内容要少于上篇,如果gradle此篇的这些功能,eclipse可不能简单批量的完成哟

    一 签名

    //签名的配置  我后面配上完整代码  这里关于域就不细写了
    signingConfigs {
        myConfig{
        //签名文件,放到工程根目录哟
                 storeFile file("xxxx.keystore")
        //签名文件的密码
                storePassword "xxxxx"
        //工程的Alias名
                keyAlias "xxxx"
        //签名的密码
                keyPassword "xxxx"
            }
    }
    //构建的时候要做的事情都在这里,比如签名或者混淆
    buildTypes{
         release {
        //注意网上有些是错的,这个是对应新的2.2.1的gradle中的方法
        //这个的意思是 执行签名 执行的方法是signingConfigs下的myConfig内的配置 就是上面那个域
            signingConfig  signingConfigs.myConfig
         } 
    }

    二混淆

    关于混淆文件(proguard-properties.txt)内容我就不给出了哈

    刚刚说了混淆也是在那个执行方法里

    buildTypes{
         release {
        //执行混淆 混淆配置在根目录下的proguard-properties.txt文件内
             proguardFile getDefaultProguardFile('proguard-properties.txt')//指定混淆文件  
         } 
       }

    三批量打包的两种方法

    第一种:

    批量打包的部分代码我上一篇都有提过

    defaultConfig { 
            manifestPlaceholders = [ activityLabel:"defaultName"] 
     } 
    
    productFlavors {
    //渠道一的配置
        channelname1{ 
    //把manifest中的“CHANNEL”变量名(key)的变量值(value)替换成xxx1
    //这里也可以把“"xxx1"” 换成name=> [CHANNEL:name]  这个的意思就是把value换成 channelname1
    //由于网上的乱七八糟的粘贴复制 所有网上的那些根本没说清楚,这里的CHANNEL必须要再manifest中有且对应 具体我写在下面代码块
            manifestPlaceholders = [CHANNEL:"xxx1"]  
        }
    //渠道二的配置
        channelname2{
            manifestPlaceholders = [CHANNEL:"xxx2" ]  
        }
    ....渠道n...... }

    注意manifest中加入这么一段  属于那个域都可以,但是你要会取,我写在了<application> 

    //这里的$对于android编译器来说就是个char 但是对于gradle来说就是变量的意思,可以替换,用什么替换?当然是我上个代码块中的productFlavors域中的值了。切忌这个CHANNEL要和上个代码块中的CHANNEL对应 如果改变其中一个记得改变另一个
    <meta-data android:name="UMENG_CHANNEL" android:value="${CHANNEL}" />

    这样就可以了,这种配置适合在每一个里面都单独配置,比如不同渠道不同的版本号,不同的各种各样的配置,但是如果不需要那么多花哨,就可以用第二种方法

    第二种:

    defaultConfig { 
            manifestPlaceholders = [ activityLabel:"defaultName"] 
     } 
    
    productFlavors {
        channelname1{ }
        channelname2{ }
    //执行all方法,循环把 channelname*赋值给manifest中的变量
        all { flavor ->
            flavor.manifestPlaceholders = [CHANNEL:name ]
        }
    }    

    四依赖工程/依赖第三方工程/依赖外部工程

    什么是依赖工程?

    其实很简单的只要在原来代码上加入几行代码几个文件就可以实现,所以不要想那么难

    我举个例子就是我的xxx工程依赖appcompat_v7_6这个工程的情况

    如上图  两个工程 两个文件 这是最上级目录

    目录结构是这样

    /appcompat_v7_6/1~n个子文件

    /xxx/1~n个子文件

    /local.properties

    /settings.gradle

    除此以外

    两个工程中各有一个 build.gradle

    一个一个说。

    1 local.properties文件内的内容是你sdk的根目录 很简单吧

    2settings.gradle文件内的内容是所有有联系的工程名

    结构是   include ':x1',':x2',':x3',.........注意不要用中文

    ":"相当于文件夹系统的“xx”中的“”

    3 然后看我appcompat_v7_6中的build.gradle的内容 标配哈

    buildscript{
        repositories{
            mavenCentral();
        }
        
        dependencies{
            //你可能需要改动的地方
            classpath 'com.android.tools.build:gradle:1.0.0'
        }
        
        tasks.withType(JavaCompile) { options.encoding = "UTF-8" }
    }
    
    apply plugin:'android-library'
    
    dependencies{
        compile fileTree(dir:'libs',include:"*.jar")
    }
    
    android{
            //你可能需要改动的地方
        compileSdkVersion 19
            //你可能需要改动的地方
        buildToolsVersion "19.1.0"
        enforceUniquePackageName=false
        
        lintOptions{
            abortOnError false
        }
        
        sourceSets{
            main{
                manifest.srcFile 'AndroidManifest.xml'
                java.srcDirs = ['src']
                resources.srcDirs  = ['src']
                aidl.srcDirs = ['src']
                renderscript.srcDirs = ['src']
                res.srcDirs = ['res']
                assets.srcDirs = ['assets']
            }
        }
        
        lintOptions{
            abortOnError false
        }
    }

    以上出了注释可能需要改动的地方 其他地方一律不变,除非你用的gradle是很老的版本 有些方法不能用

    4最后看我xxx中的文件内容

    import java.util.regex.Pattern//用到的一些java的包
    import com.android.builder.core.DefaultManifestParser
    buildscript {
    
        repositories {
            mavenCentral()
        }
    
        dependencies {
    //你可能需要改动的地方
            classpath 'com.android.tools.build:gradle:1.0.0'
        }
    }
    
    tasks.withType(JavaCompile) {
        options.encoding = "UTF-8"
    }
    
    apply plugin: 'android'
    
    dependencies {
            compile fileTree(dir: 'libs', include: '*.jar')
    //你可能需要改动的地方
    //这里 project就是编译一个工程的意思 注意名字要和settings中的对其 这个方法会自动去工程外找settings文件
            compile project(':appcompat_v7_6')
    }
    
    android {
    //你可能需要改动的地方
        compileSdkVersion 19
    //你可能需要改动的地方
        buildToolsVersion "19.1.0"
        enforceUniquePackageName=false
    
        defaultConfig {
    //你可能需要改动的地方
            targetSdkVersion 19
        }
            lintOptions{
            abortOnError false
        }
    
        dexOptions {
            preDexLibraries = false
        }
    
    //简化编译过程
        packagingOptions {
            exclude 'META-INF/DEPENDENCIES.txt'
            exclude 'META-INF/LICENSE.txt'
            exclude 'META-INF/NOTICE.txt'
            exclude 'META-INF/NOTICE'
            exclude 'META-INF/LICENSE'
            exclude 'META-INF/DEPENDENCIES'
            exclude 'META-INF/notice.txt'
            exclude 'META-INF/license.txt'
            exclude 'META-INF/dependencies.txt'
            exclude 'META-INF/LGPL2.1'
            exclude 'META-INF/ASL2.0'
        }
        signingConfigs {
               myConfig{
                 storeFile file("android.keystore")
               storePassword "xxx"
               keyAlias "xxx"
               keyPassword "xxx"
           }
        }
        
       buildTypes{
         release {
            signingConfig  signingConfigs.myConfig
            proguardFile getDefaultProguardFile('proguard-properties.txt')
         } 
       }
       defaultConfig { 
            manifestPlaceholders = [ activityLabel:"defaultName"] 
        } 
    
        sourceSets {
            main {
                manifest.srcFile 'AndroidManifest.xml'
                java.srcDirs = ['src']
                resources.srcDirs = ['src']
                aidl.srcDirs = ['src']
                renderscript.srcDirs = ['src']
                res.srcDirs = ['res']
                assets.srcDirs = ['assets']
            }
            
    //把工程都搞过来一起编译包括所有的.so文件
            task copyNativeLibs(type: Copy) {  
    //你可能需要改动的地方
        from(new File(project(':appcompat_v7_6').getProjectDir(), 'libs')) { include '**/*.so' }
         into new File(buildDir, 'native-libs')  
            }  
            tasks.withType(JavaCompile){  
                compileTask -> compileTask.dependsOn copyNativeLibs  
            }  
            clean.dependsOn 'cleanCopyNativeLibs'  
            tasks.withType( com.android.build.gradle.tasks.PackageApplication){  
                pkgTask -> pkgTask.jniFolders = new HashSet<File>()  
                pkgTask.jniFolders.add(new File(buildDir,'native-libs'))  
            }  
            
           productFlavors {
                xxx1{  }
                xxx2{ }
                all { flavor ->
                    flavor.manifestPlaceholders = [CHANNEL:name ]
                }
            }
        }
    }    
  • 相关阅读:
    循环神经网络(Recurrent Neural Network)
    特征选择
    程序猿能挣多少钱
    python socket
    python 2 encode and decode
    pandas series
    source collection list
    pep8摘要
    python 正则表达式
    django显示图片
  • 原文地址:https://www.cnblogs.com/uncle2000/p/4277731.html
Copyright © 2011-2022 走看看