zoukankan      html  css  js  c++  java
  • android gradle配置及编译command

    build.gradle

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion rootProject.ext.android.compileSdkVersion //编译sdk版本
        buildToolsVersion rootProject.ext.android.buildToolsVersion //编译tools version
    
        defaultConfig {
            applicationId "com.example.myapp"
            minSdkVersion rootProject.ext.android.minSdkVersion //最低sdk
            targetSdkVersion rootProject.ext.android.targetSdkVersion//目标sdk
            versionCode 6
            versionName "1.0"
            multiDexEnabled true //使用multidex
    //        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
    
        signingConfigs { //签名配置
            release {
                keyAlias 'deviceapp'
                keyPassword '111111'
                storeFile file('../deviceAppKey.key')
                storePassword '111111'
            }
            debug {
                //empty
            }
        }
    
        buildTypes {
            debug {
                versionNameSuffix "-debug"
                minifyEnabled false
                zipAlignEnabled false
                shrinkResources false
                signingConfig signingConfigs.debug
            }
    
            release {
                //混淆
                minifyEnabled true
                //Zipalign优化
                zipAlignEnabled true
                // 移除无用的resource文件 minifyEnabled true有效
                shrinkResources true
                signingConfig signingConfigs.release
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆配置
            }
    
        }
    
        dataBinding {//data binding 使用
            enabled = true
        }
    
    }
    
    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')//文件夹下面全部依赖
        compile files('libs/gson.jar')//单文件依赖
        //    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        //        exclude group: 'com.android.support', module: 'support-annotations'
        //    })
        compile 'com.android.support.constraint:constraint-layout:1.0.2'
        compile rootProject.ext.libSupportAppcompatV7
        compile rootProject.ext.libGson
        compile rootProject.ext.libOKHttp
        //    compile rootProject.ext.libOKIO
        compile rootProject.ext.libRetorfit
        //    compile rootProject.ext.libOKHttpLogging
        compile rootProject.ext.libRetorfitConvertGson
        compile rootProject.ext.libRXJava
        compile rootProject.ext.libRXAndroid
        compile rootProject.ext.libRXRetrofitAdapter
    compile project(':configlibrary')//module library依赖 compile (project(':configlibrary')) { exclude group: "com.android.support" }//类库去重处理 }

     这里涉及到统一版本号(类库版本,编译版本,使用版本)管理,为了防止相同项目引入相同类库不同版本,以及编译相关版本,方便后续统一维护修改,所以需要统一版本号

    在项目根目录创建config.gradle将通用的类库写在里面,内容如下

    ext {
        android = [
                compileSdkVersion: 25,
                buildToolsVersion: "25",
                minSdkVersion    : 18,
                targetSdkVersion : 25
        ]
    
        def supportVersion = "23.4.0"
        def gsonVersion = "2.7"
        def butterKnifeVersion = "8.4.0"
        def butterKnifeCompilerVersion = "8.4.0"
    
        def okHttpVersion = "3.6.0";
        def okIOVersion = "1.11.0";
        def retrofitVersion = "2.2.0";
        def okHttpLogVersion = "3.6.0";
    
        def rxJavaVersion = "2.0.7"
        def rxAndroidVersion = "2.0.1"
        def retorfitRxAdapterVersion = "2.2.0"
    
        libSupportAppcompatV7 = "com.android.support:appcompat-v7:${supportVersion}"
        libSupportDesign = "com.android.support:design:${supportVersion}"
        libSupportRecyclerview = "com.android.support:recyclerview-v7:${supportVersion}"
        libSupportV4 = "com.android.support:support-v4:${supportVersion}"
        libGson = "com.google.code.gson:gson:${gsonVersion}"
    
        libButterKnife = "com.jakewharton:butterknife:${butterKnifeVersion}"
        libButterKnifeCompiler = "com.jakewharton:butterknife-compiler:${butterKnifeCompilerVersion}"
    
        libOKHttp = "com.squareup.okhttp3:okhttp:${okHttpVersion}"
        libOKIO = "com.squareup.okio:okio:${okIOVersion}"
        libRetorfit = "com.squareup.retrofit2:retrofit:${retrofitVersion}"
        libRetorfitConvertGson = "com.squareup.retrofit2:converter-gson:${retrofitVersion}"
        libOKHttpLogging = "com.squareup.okhttp3:logging-interceptor:${okHttpLogVersion}"
        libRXJava = "io.reactivex.rxjava2:rxjava:${rxJavaVersion}"
        libRXAndroid = "io.reactivex.rxjava2:rxandroid:${rxAndroidVersion}"
        libRXRetrofitAdapter = "com.squareup.retrofit2:adapter-rxjava2:${retorfitRxAdapterVersion}"
    
    }
    

    在根目录build.gradle里引用该配置文件

    // Top-level build file where you can add configuration options common to all sub-projects/modules.
    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:2.3.1'
        }
    }
    apply from: "config.gradle"
    

     即可在其它module内使用,统一通用版本,防止相同类库产生多个版本

    编译产生java.lang.OutOfMemoryError: GC overhead limit exceeded问题解决

     // solve java.lang.OutOfMemoryError: GC overhead limit exceeded
    dexOptions {
        preDexLibraries true
        javaMaxHeapSize "3g"
        incremental true
        dexInProcess = true
    }
    


    debug,release打包签名配置

     signingConfigs {
            config {
                keyAlias 'key0'
                keyPassword 'xinju123'
                storeFile file('F:/StudioProjects/PublisherSystem/xinju_mediaplayer.jks')
                storePassword 'xinju123'
            }
        }
    
        buildTypes {
            debug {
                versionNameSuffix "-debug"
                applicationIdSuffix ".alpha"
                minifyEnabled false
                zipAlignEnabled false
                shrinkResources false
    //            signingConfig signingConfigs.config
            }
            release {
                versionNameSuffix "-release"
                applicationIdSuffix ".beata"
                debuggable false
                jniDebuggable false
                //混淆
                minifyEnabled false
                //Zipalign优化
                zipAlignEnabled false
                // 移除无用的resource文件 minifyEnabled true有效
                shrinkResources false
                signingConfig signingConfigs.config
    //            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆配置
            }
        }
    

    项目内部分为多个功能模块,同时会产生在同一个res资源内的layout,value,drawable对应文件有很多,不方便查找及后续的分离处理,

    因此需要对资源内容进行按功能模块进行分离除处理,使用gradle可以轻松实现此需求

    在module工程内的build.gradle android内加入sourceSets命令

    android {
        compileSdkVersion rootProject.ext.android.compileSdkVersion
        buildToolsVersion rootProject.ext.android.buildToolsVersion
    
        defaultConfig {
            minSdkVersion rootProject.ext.android.minSdkVersion //最低sdk
            targetSdkVersion rootProject.ext.android.targetSdkVersion//目标sdk
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
       
        sourceSets { //资源分割模块化处理
            main.res.srcDirs += 'src/main/res-logcat'
            main.res.srcDirs += 'src/main/res-config'
            main.res.srcDirs += 'src/main/res-config2'
            main.res.srcDirs += 'src/main/res-httpchunk'
            main.res.srcDirs += 'src/main/res-logviewer'
            main.res.srcDirs += 'src/main/res-standout'
        }
    }
    

     最终效果

    可以看到,多个res资源目录按功能分割好了。

     或者按目录进行划分处理

        sourceSets { //资源分割模块化处理
    //        java.srcDirs('src/test1','src/test2')
            main.java.srcDirs('src/test1/java')//定义java源文件目录
            main.res.srcDirs('src/test1/res')//定义资源目录,drawable layout values
        }
    

     gradle 生产同一程序,不同packgeName方法
    http://blog.csdn.net/chenaini119/article/details/46874241

    productFlavors{
        flavors_release{
            manifestPlaceholders = [str:"releaseStr",package_name:"com.example.android.newsreader"]
            applicationId "com.example.android.newsreader"
        }
    
        flavors_dev{
            manifestPlaceholders = [str:"devStr",package_name:"com.example.android.newsreaderdev"]
            applicationId "com.example.android.newsreaderdev"
        }
    }
    

     androidStudio3.0 gradle flavor打包

    buildTypes {
    	......
        flavorDimensions "ver_test","ver_online"
        productFlavors {
            opt_test {
                dimension "ver_test"
                applicationIdSuffix ".test"
            }
            opt_online {
                dimension "ver_online"
                applicationIdSuffix ".online"
            }
        }
    	//包数量flavorDimensions * productFlavors (2x2)
    }
    


    在Android Studio的右侧的gradle面板中点击  按钮刷新下,于是在build子栏目中
    其中以assemble*打头的都是生成apk的选项,生成的apk在build/outputs/apk中,这里我们对任一项双击即可生成对应的apk
    对应flavors_release和flavors_dev的apk应该就是和这两个,于是分别双击他们等待各自生成apk的过程

    工程内部代码功能分离

    sourceSets {
        main {
            def dirs = ['p_widget', 'p_theme',
                        'p_location', 'p_log','p_im','p_share']
            dirs.each { dir ->
                java.srcDir("src/$dir/java")
                res.srcDir("src/$dir/res")
            }
        }
    	wm {
            dirs.each { dir ->
                java.srcDir("src/${dir}/wm/java")
                res.srcDir("src/${dir}/wm/res")
            }
        }
        mt {
            dirs.each { dir ->
                java.srcDir("src/${dir}/mt/java")
                res.srcDir("src/${dir}/mt/res")
            }
        }
    }
    

     gradle动态控制BuildConfig.java

    BuildConfig.java是Android Gradle自动生成的一个java类文件,无法手动编译,但是可以通过Gradle控制,也就是说它是动态可配置的

    buildTypes {
        debug {         
            //debug包BuildConfig LOG_DEBUG 为true
            buildConfigField "boolean", "LOG_DEBUG", "true"
            buildConfigField "String", "Flag", "111"
           }
              
        release {
            //release包BuildConfig LOG_DEBUG 为false
            buildConfigField "boolean", "LOG_DEBUG", "false"
            //release的包中BuildConfig.Flag 就会被赋值为 222 
            buildConfigField "String", "Flag", "222"
            }
    }
    

    在配置加入如上命令时,编译后 BuildConfig会生成LOG_DEBUG,Flag常量,并且会根据不同的包产生不同值

     同时也可以生成resValue内容,如,生成strings.xml类型的字符串的值,

    buildTypes {
            debug {
                resValue "string", "app_name1", "MyApp_debug"
                ...
            }
            release {
                //将release的包中名为 app_name 的 string value 值改为 app1
                resValue "string", "app_name1", "MyApp_release"
            }
        }
    

     值得注意,resValue生成内容并不是在strings.xml内,而在MyAppappuildgenerated es esValuesdebugvaluesgenerated.xml内,内容如下

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <!-- Automatically generated file. DO NOT MODIFY -->
    
        <!-- Values from build type: debug -->
        <string name="app_name1" translatable="false">MyApp_debug</string>
    
    </resources>
    

    关于gradle编译命令:

    命令行切换到项目根目录:

    执行gradlew -v如有内容输出即可证明正常

    基本命令:

    ./gradlew -v 版本号
    ./gradlew clean 清除Project目录下的build文件夹
    ./gradlew build 检查依赖并编译打包
    注意gradlew build 命令把debug、release环境的包都打出来

    ./gradlew assembleDebug 编译并打Debug包
    ./gradlew assembleRelease 编译并打Release的包
    ./gradlew installRelease Release模式打包并安装
    ./gradlew uninstallRelease 卸载Release模式包

    gradlew app:clean 清理app module输出文件
    gradlew app:build 构建app module
    gradlew app:check lint检查

    gradlew app:assembleRelease 打release安装包
    gradlew app:assembleDebug debug安装包

    依赖类库:
    对只依赖类库中的很小功能的,需要对内容进行精简处理重新打包

    例如:butterknife
    compile('com.jakewharton:butterknife:8.4.0') {
            exclude group: 'com.android.support', module: 'support-annotations'
        }
        annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'

     其它module
    // 编译CommonSDK模块,但是去掉此模块中对com.android.support的依赖,防止重复依赖报错
            compile (project(':CommonSDK')) { exclude group: "com.android.support" }

    依赖 aar 包
        把 aar 包放到 libs 目录下
      repositories {
        flatDir {
            dirs 'libs'
        }
    }
    implementation(name:'faceplatform-release', ext:'aar')    

    aar 包需要被多个 module 依赖时,我们就不能把 aar 包放在单一的 module 中,我们可以在项目的根目录创建一个目录,比如叫 aar 目录,然后把我们的 aar 包放进去
    在项目的根目录的 build.gradle 的 allprojects 标签下的 repositories 添加
    flatDir {
                dirs ../aar  //    ../aar 表示根目录下的 aar 文件夹。
            }
    然后就可以添加依赖了 compile(name:'tt',ext:'aar')

    compile是默认的那个,其含义是包含所有的依赖包,即在APK
    provided的意思是提供编译支持,但是不会写入apk
    debugCompile/releaseCompile

    更多介绍:https://mp.weixin.qq.com/s/hCXLz-9BnAOGWyZ2eRikKg


     两个重要的命令:
    Gradle查看Android项目中库的依赖关系

    使用gradlew <projectname>:dependencies --configuration compile检测依赖关系,去除重复
    dependencies指令,
    ./gradlew :app:dependencies --configuration compile

    dependencyInsight指令,查看指定库的依赖关系
    ./gradlew :app:dependencyInsight --dependency fastjson --configuration compile

    studio3.0 compile 替换为 implementation 引用类库,查找改为,

    dependencies指令,
    gradlew :app:dependencies --configuration releaseCompileClasspath
    :app:dependencies

    dependencyInsight指令
    gradlew :app:dependencyInsight --dependency support-annotations --configuration releaseCompileClasspath
    :app:dependencyInsight

     

    studio3.0

    implementation 替换compile依赖类库,只对本module有效,不能传递依赖,(隔离功能)

    api可以对外暴露依赖类库,可传递

  • 相关阅读:
    linux 分析 目标文件 的命令
    bss,data,text,rodata,堆,栈,常量段
    Linux进程地址空间详解
    机器周期,指令周期,时钟周期,节拍与晶振
    银行家算法——C语言(11计科1班-孙鹏启——修正)
    bash —— bind ( 一个功能强大的组合键! Alt + . )
    【5002】排版问题
    【?】【7007】栈、模拟
    【u235】背单词
    【t076】竞赛排名
  • 原文地址:https://www.cnblogs.com/happyxiaoyu02/p/7346436.html
Copyright © 2011-2022 走看看