一、Gradle構建簡介
轉載來自:Gradle入門系列(1):簡介 - 文章 - 伯樂在線http://blog.jobbole.com/71999/
在Gradle中,有兩個基本概念:項目和任務。請看以下詳解:
項目是指我們的構建產物(比如Jar包)或實施產物(將應用程序部署到生產環境)。一個項目包含一個或多個任務。
任務是指不可分的最小工作單元,執行構建工作(比如編譯項目或執行測試)。
那么,這些概念和Gradle的構建又有什么聯系呢?好,每一次Gradle的構建都包含一個或多個項目。
我們能夠使用以下配置文件對Gradle的構建進行配置:
Gradle構建腳本(build.gradle)指定了一個項目和它的任務。
Gradle屬性文件(gradle.properties)用來配置構建屬性。
Gradle設置文件(gradle.settings)對于只有一個項目的構建而言是可選的,如果我們的構建中包含多于一個項目,那么它就是必須的,因為它描述了哪一個項目參與構建。每一個多項目的構建都必須在項目結構的根目錄中加入一個設置文件。
二、更簡短的Gradle插件簡介
Gradle的設計理念是,所有有用的特性都由Gradle插件提供,一個Gradle插件能夠:
在項目中添加新任務
為新加入的任務提供默認配置,這個默認配置會在項目中注入新的約定(如源文件位置)。
加入新的屬性,可以覆蓋插件的默認配置屬性。
為項目加入新的依賴。
Gradle用戶手冊提供了一系列標準Gradle插件。
在我們為項目加入Gradle插件時,我們可以根據名稱或類型來指定Gradle插件。
三、了解Android studio 和 Gradle
請閱讀這篇文章---http://blog.csdn.net/lincyang/article/details/43853259
四、解決方法:android 6.0(api 23) SDK,不再提供org.apache.http.*(只保留幾個類) - JavAndroid - 博客頻道 - CSDN.NET
http://blog.csdn.net/yy1300326388/article/details/48784475
在使用Android-async-http的時候我的apl 更新到了23,我的build version也是23的時候出現了,org.apache.http.Header這個類找不到的情況,原因是在api 23中,不提供org.apache.http.*(只保留幾個類)
android {? ? useLibrary'org.apache.http.legacy'}
五、Date().toLocaleString()
toLocaleString()方法可根據本地時間把Date對象轉換為字符串,并返回結果。
語法:dateObject.toLocaleString()
=============================================================================
Java代碼
System.out.println(newjava.util.Date());
輸出:Thu Jan 27 14:43:28 CST 2011
System.out.println(newjava.util.Date().toLocaleString());
輸出:2011-1-27 14:45:21
不過現在toLocaleString()方法已過時,由DateFormat.format(Date date)取代。
------------------------------------------------------------------------------------------------------------------------------------------
Java代碼:
DateFormat?ddf?=?DateFormat.getDateInstance();
DateFormat?dtf?=?DateFormat.getTimeInstance();
DateFormat?ddtf?=?DateFormat.getDateTimeInstance();
Date?date?=newDate();
System.out.println("日期:"+?ddf.format(date));
System.out.println("時間:"+?dtf.format(date));
System.out.println("日期時間:"+?ddtf.format(date));
SimpleDateFormat?sdf?=?(SimpleDateFormat)?DateFormat.getDateTimeInstance();
System.out.println("日期時間:"+?sdf.format(date));
------------------------------------------------------------------------------------------------------------------------------------------
輸出:
日期:2011-2-9
時間:11:16:02
日期時間:2011-2-9 11:16:02
日期時間:2011-2-9 11:16:02
六、buildTypes
默認情況下,Android插件自動為項目構建一個debug和一個release版本的應用。這兩個版本的不同主要體現在在非開發機上的調試功能以及APK的簽名方式。debug版本使用一個用公開的name/password創建的key來簽名(這樣構建的時候就不需要提示輸入密碼了)。release版本在構建的時候不會進行簽名,而是稍后在做。
這個可以使用gradle中的BuildType對象來進行配置。默認情況下,2個BuildType的實例會被創建,一個debug,一個release。Android插件允許自定義這兩個實例,當然你也可以創建其他的build type。配置由buildTypes這個DSL來完成:
android {
? ? ?buildTypes {
? ? ? ? ?debug {
? ? ? ? ? ? ? ? ? ? applicationIdSuffix".debug"
? ? ? ? ? }
? ? ? ? ?jnidebug.initWith(buildTypes.debug)
? ? ? ? ?jnidebug {
? ? ? ? ? ? ? packageNameSuffix".jnidebug"
? ? ? ? ? ? ? ? jniDebuggabletrue
? ? ? ? ?}
? ? ? ? }
?}
上面的代碼完成了下列配置:
1.配置默認的debug Build Type
設置debug版本的報名為<應用id>.debug,這樣就可以在設備上同時安裝debug和release版本了。
2.創建一個新的BuildType,名字是jnidebug,同時配置它是復制自debug Build Type。
配置jnidebug開啟debug版本的JNI組件,添加一個不同的包名后綴。
創建一個新的的Build Types非常簡單,只需要在buildTypes下面通過調用initWith或者使用閉包添加一個新的元素。下表是可以配置的屬性以及默認值:
屬性明 debug版本默認值 release或其他版本 默認值
debuggable true false
jniDebuggable false false
renderscriptDebuggable false false
renderscriptOptimLevel 3 3
applicationIdSuffix null null
versionNameSuffix null null
signingConfig android.signingConfigs.debug null
zipAlignEnabled false true
minifyEnabled false false
proguardFile N/A (set only) N/A (set only)
proguardFiles N/A (set only) N/A (set only)
出了這些屬性,Build Types還可以用來配置代碼和資源文件。針對每一個Build Type,一個新的對應的sourceSet會被創建,這個sourceSet使用一個默認的路徑src//。這就意味著Build Type的名字不能是main或者androidTest(這是由插件強制的),同時每個Build Type的名字必須是唯一的。
和其他的source sets一樣,Build Type中的source set路徑也是可以配置
android {
sourceSets.jnidebug.setRoot('foo/jnidebug')
}
另外,對每一個Build Type,一個新的assemble任務會被創建.前面我已經講過assembleDebug和assembleRelease任務了,這里就可解釋這兩個任務的來源了.當debug和release Build Types被預先創建的時候,他們對應的assemble任務也會被一起創建.
上面的build.gradle代碼片段還會創建一個assembleJnidebug任務,assemble任務也會添加對assembleJniDebug任務的依賴,正如它對assembleDebug和assembleRelease任務的依賴一樣。
小提示:你可以使用 gradle aJ命令來運行assembleJnidebug任務。
可能是使用場景:
僅在debug模式下使用的權限,release模式不使用。
debug時使用不同的實現
debug模式使用不同的資源(比如當一個資源的值依賴于簽名的時候)
BuildType中的 代碼/資源文件 將會被按照下列方式處理:
manifest配置會被merge到app manifest中
代碼不會被merge,會被當做另一個代碼目錄(source folder)來使用
資源文件會覆蓋同名的main中的資源文件
參考資料:http://www.open-open.com/lib/view/open1439216256770.html
Android Gradle manifestPlaceholders 的妙用
manifestPlaceholders 可以替換androidmanifest文件中的標簽,可作為快速渠道打包替換渠道名的一種方式,也可以自定義標簽用來替換需要的文本,多作為不同環境不同key的修改。
七、ext
gradle 完整配置
https://github.com/WuXiaolong/Gradle4Android
如果有很多項目,可以設置全局來統一管理版本號或依賴庫,根目錄下build.gradle下:
ext {
compileSdkVersion = 23
buildToolsVersion = "23.0.2"
minSdkVersion = 14
targetSdkVersion = 23
}
app/build.gradle
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "com.wuxiaolong.gradle4android"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
}
可以在根目錄下建個config.gradle,然后只需在根目錄下build.gradle最頂部加上下面一行代碼,然后同步下,意思就是所有的子項目或者所有的modules都可以從這個配置文件里讀取內容。
apply from: "config.gradle"
config.gradle
ext {
android = [
compileSdkVersion: 23,
buildToolsVersion: "23.0.2",
minSdkVersion ? ?: 14,
targetSdkVersion : 22,
]
dependencies = [
appcompatV7': 'com.android.support:appcompat-v7:23.2.1',
design ? ? ?: 'com.android.support:design:23.2.1'
]
}
app/build.gradle
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "com.wuxiaolong.gradle4android"
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
versionCode 1
versionName "1.0"
}
...
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile rootProject.ext.dependencies.appcompatV7
compile rootProject.ext.dependencies.design
}
自定義BuildConfig
實際開發中服務器可能有正式環境和測試環境,gradle可以通過buildConfigField來配置。
defaultConfig {
buildConfigField 'String','API_SERVER_URL','"http://wuxiaolong.me/"'
}
buildConfigField 一共有3個參數,第一個是數據類型,和Java的類型是對等的;第二個參數是常量名,這里是API_SERVER_URL;第三個參數就是你要配置的值。
如圖路徑下就有個常量API_SERVER_URL,如何在代碼取得這個常量值:
Log.d("wxl", "API_SERVER_URL=" + BuildConfig.API_SERVER_URL);
啟用proguard混淆
一般release發布版本是需要啟用混淆的,這樣別人反編譯之后就很難分析你的代碼,而我們自己開發調試的時候是不需要混淆的,所以debug不啟用混淆。對release啟用混淆的配置如下:
android {
buildTypes {
release {
minifyEnabled true//是否啟動混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
minifyEnabled為true表示啟用混淆,proguardFile是混淆使用的配置文件,這里是module根目錄下的proguard-rules.pro文件