安卓中的SVG,Vector,gradle

简介: 安卓中的SVG,Vector,gradle

SVG(Scalable Vector Graphics,可缩放的矢量图形:就是用于描述二维矢量图形的图形格式。


svg网站:(www.iconfont.cn/collections…


还有在线转化工具。


75ec3619ae1a44c5ae91482b1277da78_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.jpg

0238869549934540ac9882a84885413e_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


VectorDrawable:   从5.0(API等级21)开始,android了支持矢量图,优点:文件比位图要小,可以缩小我们apk体积,并且可以任意放大矢量图形,而不会丢失细节或影响清晰度,在屏幕适配时,只用一套图即可。它是Android当中的SVG实现,它并不支持SVG的全部语法,只是支持部分有必要的部分。


Android 开发 VectorDrawable 矢量图 (二)了解矢量图属性与绘制 - 观心静 - 博客园


Gradle详解



基本配置:AS中的Android项目通常至少包含两个build.gradle,一个是Project范围的,另一个是Module范围的,由于一个Project可以有多个Module,所以每个Module下都会对应一个build.gradle


5.1 Project下的build.gradle


// Top-level build file where you can add configuration options common to all sub-projects/modules.
apply from: "config.gradle"
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.1'
    }
}
allprojects {
    repositories {
        jcenter()
    }
}
task clean(type: Delete) {
    delete rootProject.buildDir
}

  • buildscript下的repositoriesgradle脚本自身需要的资源,
  • allprojects下的repositories是项目所有模块需要的资源。


5.2 模块的build.gradle


//声明插件,表明这是一个Android程序;如果是库,那么应当是com.android.library
apply plugin: 'com.android.application'
//Android构建过程需要配置的参数
android {
    //编译版本
    compileSdkVersion rootProject.ext.android.compileSdkVersion
    //buildTool版本
    buildToolsVersion rootProject.ext.android.buildToolsVersion
    //默认配置,同时应用到debug和release版本上
    defaultConfig {
        applicationId rootProject.ext.android.applicationId
        minSdkVersion rootProject.ext.android.minSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode rootProject.ext.android.versionCode
        versionName rootProject.ext.android.versionName
        testInstrumentationRunner rootProject.ext.android.testInstrumentationRunner
    }
    //配置debug和release版本的一些参数,例如混淆,签名配置等
    buildTypes {
        //release版本
        release {
            minifyEnabled false //是否开启混淆
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //混淆文件位置
        }
    }
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile rootProject.ext.dependencies["support-v7"]
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testCompile 'junit:junit:4.12'
}

下面对Android构建过程中需要配置的参数做一些解释:


  • compileSdkVersion:告诉gradle用那个Android SDK的版本编译你的应用,修改它不会改变运行时的行为,因为它不会被包含进入最终的APK中;因此,推荐使用最新的SDK编译;如果使用Suppport Library,那么compileSdkVersion必须要大于等于它的大版本号。
  • minSdkVersion:应用最低可运行的要求;它必须要大于等于你所依赖的库的minSdkVersion
  • targetSdkVersionAndroid提供向前兼容的重要依据。(targetSdkVersion is the main way Android provides forward compatibility
    因为随着Android系统的升级,某个api或者模块的行为有可能发生改变,但是为了保证老APK的行为和以前兼容,只要APKtargetSdkVersion不变,那么即使这个APK安装在新的Android系统上,那么行为还是保持老的系统上的行为。
    系统在调用某个api或者模块的时候,会先检查调用的APKtargetSdkVersion,来决定执行什么行为。


minSdkVersiontargetSdkVersion最终会被包含进入最终的APK文件中,如果你查看生成的AndroidManifest.xml,那么会发现:


<uses-sdk android:targetSdkVersion="23" android:minSdkVersion="7" />

所以,我们一般遵循的规则是:


minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)

5.3 gradle相关文件


  • gradle.properties
    配置文件,可以定义一些常量供build.gradle使用,比如可以配置签名相关信息,例如keystore位置、密码、keyalias等。
  • settings.gradle
    用来配置多模块的,如果你的项目有两个模块BrowserScannerSDK,那么就需要:


include ':Browser'
include ':ScannerSDK'
project(':ScannerSDK').projectDir = new File(settingsDir, './ScannerSDK/')

  • gradle文件夹
    里面有两个文件,gradle-wrapper.jargradle-wrapper.properties,后者当中指定了gradle的版本。
distributionUrl=https://services.gradle.org/distributions/gradle-2.8-all.zip

  • gradlewgradlew.bat
    分别是Linuxwindows下的批处理文件,它们的作用是根据gradle-wrapper.properties文件中的distributionUrl下载对应的gradle版本,这样即使环境没有安装gradle也可以编译。


5.4 gradle仓库


gradle有三种仓库:maven/ivy/flat本地


maven{
    url  "..."
}
ivy{
    url  "..."
}
flatDir{
    dirs 'xxx'
}

有些仓库取了别名:


repositories{
    mavenCentral()
    jcenter()
    mavenLocal()
}

5.5 gradle任务


通过以下指令,可以看到支持的任务:


./gradlew tasks


9f544e10f9db463b8ecebc0610618afc_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


Task1.png


fe14051506174fb7bc804de747a2be34_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


Task2.png


六、常见问题



6.1 导入本地Jar


导入单个jar文件:


compile files('libs/xxx.jar')

导入libs的多个jar文件:


compile fileTree(dir: 'libs', include: ['*.jar'])

6.2 导入maven


compile 'groupId:artifactId:version'

6.3 导入Project


在导入之前,需要在settings.gradle中把模块包含进来,例如前面的ScannerSDK模块:


compile project(':ScannerSDK')

6.4 声明第三方maven


如果项目中需要的一些库文件不再中央仓库中,而是在某个特定地址里,那么就需要在Project中的build.gradle中的allprojects结点下或者直接配到某个模块中:


allprojects {
    repositories {
        maven {
            url '地址'
        }
    }
}

6.5 依赖第三方aar


aar:     Android库项目的二进制归档文件,包含所有资源,class以及res资源文件全部包含。


jar     :只包含了class文件与清单文件 ,不包含资源文件,如图片等所有res中的文件。


compile 'com.aaa.xxx:core:1.0.1@aar'

6.6 将库导出为aar


首先,你的项目必须是一个库项目,之后在build.gradle中进行配置:


apply plugin : 'com.android.library'

之后,进入到该项目中,执行gradle命令:


./gradlew assembleRelease

生成的aar放在/build/output/aar文件当中


6.7 引用本地aar


首先,将aar文件拷贝到对应目录下,然后在该模块的build.gradle中声明flat仓库:


repositories{
   flatDir{
      dirs '以build.gradle为根目录的相对路径'
   }
}

之后,在dependencies结点下依赖该aar模块:


dependencies{
    compile (name:'xxx',ext:'aar')
}

七、多版本打包



在此之前,我们先了解几个基本的概念:


  • buildTypes构建类型Android StudioGradle组件默认提供了debugrelease两个默认配置,这里主要用于是否需要混淆,是否调试。
  • productFlavors产品渠道,在实际发布中,根据不同渠道,可能需要使用不同的包名,甚至是不同的代码。
  • buildVaiants:每个buildTypesproductFlavors组成一个buildvariant


以上我们讨论的buildTypesproductFlavors可以通过每个Module中的build.gradleandroid标签来配置。


下面,我们先看一下不同的productFlavors,分别用来支持读取不同的文件和替换不同的字符串。


7.1 引用不同的代码


我们首先在app/src目录下新建两个目录,分别对应两个Flavor,再在其中建立相同名字的文件Constant.java,对里面的某个常量赋予不同的值。


8ce849f35de945aebd739b2c1f19ade6_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


Flavor.png

  • constantFlavor1
package com.example.lizejun.repogradle;
public class Constant {
    public static final String NAME = "flavor1";
}

  • constantFlavor2
package com.example.lizejun.repogradle;
public class Constant {
    public static final String NAME = "flavor2";
}

我们的app下的build.gradle中的android标签下添加如下几行代码,让两个Flavor分别引用不同的Constant文件:


sourceSets {
        constantFlavor1 {
            java.srcDirs =  ['src/constantFlavor1', 'src/constantFlavor1/java', 'src/constantFlavor1/java/']
        }
        constantFlavor2 {
            java.srcDirs =  ['src/constantFlavor2', 'src/constantFlavor2/java', 'src/constantFlavor2/java/']
        }
    }
    productFlavors {
        constantFlavor1 {}
        constantFlavor2 {}
    }

之后我们进行打包,可以得到以下不同安装包,这两个apk如果在其中引用的了NAME,那么它会得到不同的值:


ee0913c5fbdf4dbb94070cfb981da9dc_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


7.2 自定义buildConfig


如果我们只需要定义一些简单的值,那么我们可以用buildConfig类:

productFlavors {
        constantFlavor1 {
            buildConfigField "boolean", "BOOLEAN_VALUE", "true"
        }
        constantFlavor2 {
            buildConfigField "boolean", "BOOLEAN_VALUE", "false"
        }
    }

7.3 占位符


productFlavors {
        constantFlavor1 {
            buildConfigField "boolean", "BOOLEAN_VALUE", "true"
            manifestPlaceholders = [label:"constantFlavor1"]
        }
        constantFlavor2 {
            buildConfigField "boolean", "BOOLEAN_VALUE", "false"
            manifestPlaceholders = [label:"constantFlavor2"]
        }
    }

之后,我们再在AndroidManifest.xml中引用它:


android:label="${label}"

7.4 签名配置


首先是在android标签下,我们使用signingConfigs来配置不同的签名类型


signingConfigs {
        eng {
            keyAlias 'androiddebugkey'
            keyPassword 'android'
            storeFile file('debug.keystore')
            storePassword 'android'
        }
        prd {
            keyAlias 'androiddebugkey'
            keyPassword 'android'
            storeFile file('debug.keystore')
            storePassword 'android'
        }
    }

之后,再在buildTypes的各个分支中引用对应的签名配置:


buildTypes {
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.eng
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.prd
        }
    }

7.5 依赖


有时候,我们需要在不同的buildTypes下,引用不同的依赖,例如内存泄露的检测工具,我们希望在debug版本时检查内存泄露,并在发生时在桌面上生成图标,但是在release版本上我们并不希望这么做,这时候我们可以这么写:


debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'

这样,release版本就不会在桌面生成内存泄露的图标。


目录
相关文章
|
6月前
|
SQL 人工智能 移动开发
Android Studio插件版本与Gradle 版本对应关系
Android Studio插件版本与Gradle 版本对应关系
Android Studio插件版本与Gradle 版本对应关系
|
6月前
|
Java 开发工具 Android开发
Cocos Creator 2.4.6 Android Gradle 版本升级为 6.5.1(插件4.1.0)
Cocos Creator 2.4.6 Android Gradle 版本升级为 6.5.1(插件4.1.0)
186 1
|
7月前
|
存储 Java Android开发
Android 开发 - 充分利用Gradle
Android 开发 - 充分利用Gradle
112 2
|
11月前
|
XML IDE Java
Android gradle.properties 基础使用和常规配置
Gradle 是一个开源构建自动化工具,其设计足够灵活,可以构建几乎任何类型的软件。
|
Android开发
android学习之——Gradle sync failed: Could not determine artifacts for xxxxx
android学习之——Gradle sync failed: Could not determine artifacts for xxxxx
android学习之——Gradle sync failed: Could not determine artifacts for xxxxx
|
8月前
|
IDE Java 开发工具
Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8的解决方案
Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8的解决方案
|
4月前
|
开发工具 Android开发 开发者
Android 项目编译 Gradle 配置说明
Android 项目编译 Gradle 配置说明
152 0
|
5月前
|
Java Maven Android开发
android之gradle配置仓库与引入依赖
android之gradle配置仓库与引入依赖
237 0
|
7月前
|
Java 开发工具 Maven
Android 编译 gradle 内存 OOM 解决之路(二)
Android 编译 gradle 内存 OOM 解决之路
|
7月前
|
Java Android开发
Android 编译 gradle 内存 OOM 解决之路(一)
Android 编译 gradle 内存 OOM 解决之路