studio目录详细介绍


### 一,项目目录 ###
* .gradle gradle             缓存文件
* .idea                            缓存配置文件 
*  app                            模块
*  build                          build时候的中间文件
*  gradle                       绑定项目使用的gradle版本
*  .gitignore                   版本控制忽略的文件
*  build.gradle               构建项目的gradle配置
*  gradle.properties        gradle配置
*  gradlew                       linux下gradle的启动脚本
*  gradlew.bat                 windows下gradle启动脚本 
*  local.properties           sdk路径和ndk路径
*  MyApplication.iml        项目的配置文件
*  settings.gradle            配置项目的模块

 

### 二,app模块目录 ###
* build                            构建模块的中间文件
* libs                               等同于Eclipse中的libs,放jar包
* src/androidTest           安卓测试用例
* src/main                      代码,资源,清单文件
* src/test java                测试用例
* .gitignore                    版本控制忽略的文件 
* app.iml                       模块配置文件
* build.gradle                构建模块的gradle配置
* proguard-rules.pro     代码混淆配置


### 三,模块的build.gradle ###
- (一)模块下的build.gradle主要是配置模块的设置及其依赖。

    apply plugin: 'com.android.application'//使用application插件,表明这是一个app
    
    android { //Gradle插件为Project对象添加的一个拓展
        compileSdkVersion 25 //编译版本 对应android7.0
        buildToolsVersion "25.0.2"//构建工具版本


        //1,默认配置
        defaultConfig {
            applicationId "com.leon.asdemo"//包名
            minSdkVersion 15//此app允许运行的最低的API版本的手机
           targetSdkVersion 25//目标版本,此app允许使用新特性的最高版本,也就是说api25以上的手机也能安装这个app,但仅有api25以下的新特性
            versionCode 1//版本号
            versionName "1.0"//版本名
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"//单元测试
            //当方法数超过65535(方法的索引使用的是一个short值,(防止超过65535时报错)
            //而short最大值是65535)的时候允许打包成多个dex文件,动态加载dex。这里面坑很深啊
            multiDexEnabled true 
        }


        //2,程序在编译的时候会检查lint,有任何错误提示会停止build,我们可以关闭这个开关
        lintOptions {
                abortOnError false  //即使报错也不会停止打包               
             checkReleaseBuilds false  //打包release版本的时候进行检测
            
        }


        //3,关闭Android Studio的PNG合法性检查的
        //3.1将Eclipse项目导入到Android studio 中 很多点9图出现问题解决方法:
        //3.2有时从网上下载的Demo资源文件不规范,会出现直接将jpg文件改为png后缀名的情况,
        //gradle打包检查时报错编译通不过的。

        //用来关闭Android Studio的PNG合法性检查的,直接不让它检查。
       aaptOptions {
           cruncherEnabled = false
           useNewCruncher = false
       }

        
        //4,默认的一些文件路径的配置
        sourceSets {   
            main {
                assets.srcDirs = ['assets']    //资源文件
                jni.srcDirs 'src/main/jni'     //jni文件
                jniLibs.srcDir 'src/main/jniLibs' //jni库
           }
        }


         //5,multiDex的一些相关配置,这样配置可以让你的编译速度更快
         dexOptions {
             preDexLibraries = false   //让它不要对Lib做preDexing
             //开启incremental dexing,优化编译效率,这个功能android studio默认是关闭的。
             incremental true         
             javaMaxHeapSize "4g"     //增加java堆内存大小
         }

        

        //6,将项目导入到AS中出现以下问题:
        //Error:Execution failed for task
        // ':app:transformResourcesWithMergeJavaResForDebug'. > com.android.bui
        //解决方式:---->在build.grade中添加以下代码:
        packagingOptions {
            exclude 'META-INF/DEPENDENCIES.txt'
            exclude 'META-INF/NOTICE'
            exclude 'META-INF/NOTICE.txt'
            exclude 'META-INF/LICENSE'
            exclude 'META-INF/LICENSE.txt'
        }




      //7,构建类型
      buildTypes {
         release { //release版本的配置
            shrinkResources true  // 移除无用的resource文件
            minifyEnabled false    //是否进行混淆
            zipAlignEnabled true  //是否支持zip
            debuggable false  //是否支持调试
            //release的Proguard默认为Module下的proguard-rules.pro文件.
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
            
            //ndk的一些配置
            ndk {
                // cFlags "-std=c++11 -fexceptions -O3 -D__RELEASE__" // C++11
                // platformVersion  = "19"
                moduleName "xiaopaowifisafe" //设置库(so)文件名称
                ldLibs "log", "z", "m", "jnigraphics", "android"
                //引入库,比如要用到的__android_log_print
                abiFilters "armeabi", "x86", "armeabi-v7a"//, "x86"
                cFlags "-std=c++11 -fexceptions" // C++11
                stl "gnustl_static"
            }
            //采用动态替换字符串的方式生成不同的release.apk
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('release.apk')) {
                        def timeStamp = new Date().format('yyyyMMddHH');
                        def fileName = "WeShare-${defaultConfig.versionName}" + "-" + timeStamp + "-lj-" + ".apk";
                        output.outputFile = file("${outputFile.parent}/${fileName}")
                    }
                }
            }
            jniDebuggable false  //关闭jni调试
        }


        debug {//debug版本的配置
            minifyEnabled false     //是否进行混淆
            zipAlignEnabled true    //是否支持zip       
            shrinkResources true    // 移除无用的resource文件
            debuggable true         //是否支持调试
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            

            ndk {
                cFlags "-std=c++11 -fexceptions -g -D __DEBUG__" // C++11
            }
            jniDebuggable true
        }
    }


        //8,在这里你可以进行 Java 的版本配置,以便使用对应版本的一些新特性
        //错误:
        //Error:(51, 52) 错误: -source 1.6 中不支持 diamond 运算符
        //(请使用 -source 7 或更高版本以启用 diamond 运算符)
        //解决方式:---->在build.grade中添加以下代码:

        compileOptions {
             sourceCompatibility JavaVersion.VERSION_1_7
             targetCompatibility JavaVersion.VERSION_1_7
         }


       //9,为每个渠道包产生不同的 UMENG_CHANNEL_VALUE 的值。
        //所谓ProductFlavors其实就是可定义的产品特性,
        //配合 manifest merger 使用的时候就可以达成在一次编译
        //过程中产生多个具有自己特性配置的版本。
        productFlavors.all {
            flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
       }


        //10,在这里你可以设置你的产品发布的一些东西,
       //比如你现在一共软件需要发布到不同渠道,
       //且不同渠道中的包名不同,那么可以在此进行配置;
      //甚至可以设置不同的 AndroidManifest.xml 文件。
         productFlavors {
             xiaopao {}
             googlePlay {}
             solo {}
         }

    //11,依赖
    dependencies {

        //3.0以前使用   compile
        compile fileTree(dir: 'libs', include: ['*.jar'])//位于app/libs/下的jar包
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        compile 'com.android.support:appcompat-v7:25.3.0'//v7包依赖
        compile 'com.android.support.constraint:constraint-layout:1.0.2'//ConstraintLayout依赖
        testCompile 'junit:junit:4.12'//单元测试依赖


        //3.0以后使用 implementation
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation 'com.android.support:appcompat-v7:26.1.0'
        implementation 'com.android.support.constraint:constraint-layout:1.1.2'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'com.android.support.test:runner:1.0.2'
        androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
        androidTestCompile('com.android.support:support-annotations:26.1.0') {
            force = true
        }
    }

    

- (二)从Android Gradle plugin 3.0开始推荐使用implementation和api来替换原先的compile。理论上你可以把所有的compile替换成api。下面说说它们的区别:
- 1,compile
    本module将会泄露其依赖的module的内容
- 2,api    
    同compile
- 3,implementation    
         本module不会通过自身的接口向外部暴露其依赖module的内容。推荐使用implementation
    来进行依赖(而不是api或compile),这会大大改善工程的构建时间

- (三)其他改动:

    provided -> compileOnly

    apk -> runtimeOnly

    testCompile -> testImplementation // 编译测试用例时依赖, 不会打包到发布的产品中

    androidTestCompile -> androidTestImplementation // 编译测试用例时依赖, 不会打包到发布的产品中



[User Guide](https://sites.google.com/a/android.com/tools/tech-docs/new-build-system/user-guide)

### 四,项目的build.gradle ###
配置所有模块公共的配置

    // Top-level build file where you can add configuration options common to all sub-projects/modules.
    
    buildscript {//构建脚本配置
        repositories {//代码仓库配置
            jcenter()//代码仓库为jcenter
        }
        dependencies {// 配置需要依赖的gradle插件
            //Android Gradle插件版本,下载下来目录为android-studio\gradle\m2repository\com\android\tools\build\gradle\2.3.1
            classpath 'com.android.tools.build:gradle:2.3.1'
        }
    }
    
    //默认代码仓库
    allprojects {
        repositories {
            jcenter()
        }
    }
    
    //clean任务,构建时会执行该任务,删除根目录下的build文件夹
    task clean(type: Delete) {
        delete rootProject.buildDir
    }

## 五, gradle-wrapper.properties
####这里我们基本只需关注distributionUrl即可, 这个字段决定了你的gradle wrapper依赖哪个gradle版本。
- 1,distributionBase=GRADLE_USER_HOME 
        下载的Gradle压缩包解压后储存的主目录
- 2,distributionPath=wrapper/dists
        相对于distributionBase的解压缩后的Gradle压缩包路径
- 3,zipStoreBase=GRADLE_USER_HOME
        同distributionBase,只不过是存放zip压缩包的
- 4,zipStorePath=wrapper/dists
        同distributionPath,只不过是存放zip压缩包的
- 5,distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
        Gradle发型版压缩包的下载地址

![](img/elipse_vs_as.png)

## 六,其他文件介绍:
 - 1,local.properties    
     声明AndroidSDK和NDK所在路径
- 2,gradle.properties    
     可以放置gradle相关的全局常量声明和项目运行内存设置等
 - 3,app/proguard-rules.pro    
     代码混淆配置
- 4,.gitignore、app/.gitignore    
     记录需要被git忽略的文件/文件夹


## 七,drawable文件夹

- 1,drawable    
    放置selector、shape、vector文件
- 2,drawable-mdpi    
    中分辨率图标(72*72, 320*480)
- 3,drawable-hdpi    
    高分辨率图标(尺寸标准:48*48, 对应手机分辨率:480*800)
- 4,drawable-xhdpi    
    超高分辨率图标(96*96, 720*1280)
- 5,drawable-xxhdpi    
    超超高分辨率图标(144*144, 1080*1920), 主流分辨率
- 6,drawable-xxxhdpi    
    超超超高分辨率图标(192*192, 3840*2160)
- 7,drawable-v19
    Android4.4(API19)及以上特别设置的样式/图标
- 8,drawable-v21
    Android5.0(API21)及以上特别设置的样式/图标
- 9,drawable-v24
    Android7.0(API24)及以上特别设置的样式/图标

- 10,总结:图标加载顺序:
          drawable-v[对应的高API]->drawble-v[低API]->drawable-[对应高分辨率]dpi->
    drawable-[低分辨率]dpi->drawable

##八,mipmap,用法与drawable一致。
    区别在于: mipmap文件夹仅仅用于放置app的logo图标。

##九,res文件夹下的其他文件
- 1,anim ---->(在res文件夹下新建文件夹)
    动画文件
- 2,raw    ---->(在res文件夹下新建文件夹)
    媒体文件(音频、视频文件)
- 3,xml---->(在res文件夹下新建文件夹)
    其他的xml类型文件
- 4,menu---->(在res文件夹下新建文件夹)
    菜单文件


##十,清单文件
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="wang.relish.demo">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher" // app桌面logo。不设置的话是Android系统自带的图标(不同Android版本长得不同)。
        android:label="@string/app_name" // App名。不设置的话, 默认为启动的Activity的全类名
        android:roundIcon="@mipmap/ic_launcher_round" // Android O 新特性, 原型图标
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

    </manifest>
    
### 模块的删除 ###
选中模块,右键-->Open Module Settings-->"-"号,这时候模块文件夹的小图标就会消失,这时候再点右键就可以删除了。
![](img/delete_module.png)

借鉴:

build.gradle配置参数详解

Android开发各类常见错误解决方案(不断更新中)

猜你喜欢

转载自blog.csdn.net/qq_38859786/article/details/81355813