一個bug 一個腳印的叫你們用gradle。
1介於網絡上的很多資料都是老的 不適用與現在的新版本gradle 尤其是有些gradle方法改名了老的用不了
2介於網上都是粘貼復制並且零碎我很蛋疼啊,走了很多歪路才弄出來,所以我弄一個完全完整的版本
3我不但會寫gradle還會寫ant打包方式,希望能幫到大家
在這之前你需要有一個android工程(工程中不能有已經過時的方法)
可以沒有eclipse或者ADT 因為只要你工程是ok的 gradle就可以直接用
后面我會越說越詳細 前面都太簡單了 但是還是要從頭說起撒
上一篇的鏈接
http://www.cnblogs.com/uncle2000/p/4276833.html
工程:單個應用的所有文件的根目錄就叫工程
下面就是我的“xxx工程”

配置完了gradle 接下來就是代碼里的配置 這一篇先講個簡單的,下一篇講復雜的:用gradle 簽名 混淆 加依賴工程 關於依賴工程如何配置如:appcompat_v7_6這種依賴工程而不僅僅是依賴jar
1新建一個或者啟用一個工程(工程名為字母,不要用漢字),保證工程里沒有錯誤代碼,沒有已過時的代碼(就是被划中划線的代碼)既然是國內,那么工程的編碼格式默認是“utf-8”。
2在你的工程的根目錄下新建文件命名為“build.gradle”,以文本形式打開 輸入內容(你先別管我的內容適用不適用,你先照貓畫虎的粘貼復制,我后面會講)
最初始的代碼是這樣的
//gradle的配置 buildscript { //倉庫 基本不會變的 如果你也是用eclipse開發 你不必理解它是什么意思,你就把他當做調用一個外部代碼的引用即可 repositories { mavenCentral() } //gradle自身依賴的包(注意不是你工程依賴的包!!!) dependencies { classpath 'com.android.tools.build:gradle:1.0.0' } } //普通工程寫'android' .jar包工程寫'android-library' apply plugin: 'android' //!!!這是你工程所依賴包的聲明的地方(注意這個方法並不是在buildscript內喲) dependencies { } //工程的配置 android { }
我是從簡單到難來寫的,所以一步一步來,
關於代碼中的
//gradle自身依賴的包(注意不是你工程依賴的包!!!) dependencies { classpath 'com.android.tools.build:gradle:1.0.0' }
gradle的版本號為什么是1.0.0 ?還記得上篇文章中讓大家記住的那個2.2.1么?沒錯, gradle的2.2.1對應的classpath所依賴的包的版本就是1.0.0 后面還有一個對應馬上就講到
所以這段代碼只適用於2.2.1的gradle 是適用於2015年,若多年后 肯定不適用了,那么對於 gradle這個功能的版本和所它所依賴的版本是如何一一對應的呢?網上基本沒人講,而講的都是讓去看api,但是我說實話,那些個網址打不開,因為是goole被屏蔽了,所以我看不到api,我也不知道是如何一一對應的,這是我摸索出來的一個結果。
下面上一部分片碼,先不要着急的加,因為gradle“域”的概念一開始把我搞的到處都是bug
//使得gradle不會把你的代碼中的中文注釋搞亂
//特別注意 參數是JavaCompile 而不是Compile 很多老版本的gradle和android studio 的教程里面用的都是沒有加java的 坑爹啊!
tasks.withType(JavaCompile) { options.encoding = "UTF-8" }
//工程的引用 dependencies { //compile是編譯的意思是個動詞 //fileTree表示一堆文件 //dir:你要“編譯”“一堆文件”的地址/盤符是什么,這里我們要把工程下的“libs”目錄下的所有.jar一同編譯了,並且libs是屬於工程的子目錄 //*.jar表示所有.jar結尾的文件,如果有.so庫寫法相同 (又一個子文件夾下的就這么寫 '**/*.so') compile fileTree(dir: 'libs', include: '*.jar') }
//你的這個工程的sdk的版本 別說你不知道= = compileSdkVersion 19 //這就是 那個2.2.1對應1.0.0且再對應19.1.0的最后一處, buildToolsVersion "19.1.0" //默認false 什么意思我也不知道 enforceUniquePackageName=false //默認配置 其實都不用寫的,這個里面的東西和manifest中的意思是一樣的 defaultConfig { targetSdkVersion 19 }
上面切忌注意 如果你和我一樣 下載的是 gradle2.2.1 那么classpath 后面必須跟1.0.0 這里的buildToolsVersion必須是 19.1.0
sourceSets { //可以指定每種文件的存儲路徑 這是標配 main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } }
下面再把代碼集合到一起(還不完整喲~)
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') } android { compileSdkVersion 19 buildToolsVersion "19.1.0" enforceUniquePackageName=false defaultConfig { targetSdkVersion 19 } sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } } }
如果出現了以下錯誤,是說明了沒有找到你sdk的地址。
sdk location not found.define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable.
有兩種方法解決
1:配置android_home 具體自己百度
2:在根目錄下新建一個文件 “local.properties” 內容“sdk.dir=D:\\android\\SDK\\sdk”注意是你存放sdk的根目錄,這里是我的sdk的地址,是雙杠

如果出現了以下錯誤
9-path image xxxxxxxxx.png malformed.
must have one-pixel frame that is either transparent or white.
這是因為你的xxxxx.9.png格式的圖片並不是真正的xxxx.9.png格式,刪除中間的.9變成 xxxx.png
如果你必須要用.9.png格式 那么你要注意它的制作方法。因為gradle的檢查是非常嚴謹的,你的文件頭部信息所寫的文件類型是A,但是你的文件的后綴卻是B,當然不通過了
如果出現了以下錯誤 gradle全是亂碼 則記得加前面那句話,自己看前面有寫,並且工程要是utf-8編碼方式喲
關於方法的域 我這篇文章的最后說一下
如果出現了下面這種錯誤
could not find property 'Compile' on root project 'xxxxxx'
這個我前面說過 老版本的gradle的參數才是Compile 新版本的是 JavaCompile 將你文件中所有的tasks.withType(Compile)變成tasks.withType(JavaCompile)
如果出現了下面這種錯誤
could not find method runProguard() for .......
意思是你文件中的runProguard是老版本的 講你文件中的那個方法改成:
//混淆方法 對應工程根目錄下的混淆文件proguard-properties.txt proguardFile getDefaultProguardFile('proguard-properties.txt')
如果是
could not find method buildscript()
如果是這個方法沒有被找到 那么
首先檢查你文件中的所有的“{”和“}”是否是一一對應的 是否域錯誤
其次就是當你執行 gradle build時
你的build.gradle文件的打開方式改變 比如默認為文本打開而沒法改回去 比如默認為xml打開 因為gradle的打開方式是null 可是系統附上了一個打開方式 尤其是win7不能直接返回默認
導致執行 gradle build 時 或許發生了一些類似於轉碼錯誤而產生了沒有找到完整的字符 此時 打開cmd 輸入"assoc .gradle = " 注意有2個空格 等號后的空格代表賦值null 這樣可以使.gralde文件的打開方式為空。然后應該就沒有問題了,再不行重啟一下。我反正解決了這個問題

如果是下面這個問題 java.lang.StackOverflowError 這種錯誤(說實話我不知道我是如何解決的,我跟的網上做結果不行,但是突然就好了)我吧網上的在這里再寫一遍
首先 刪除C:\Users\Administrator\.gradle 這個.gradle文件夾(一開始gradle下載的2.2.1的文件)
再刪除 %GRADLE_HOME%/bin 下的.gradle文件夾(如果沒有就算了)
然后點擊%GRADLE_HOME%/bin 下的gradle.bat 運行一下 再 gradle build讓它重新下載2.2.1的相關文件 不行就再重裝一遍gradle 再不行就重啟

關於域的概念大家肯定都曉得
A{ } BBBBBBB=*** C{ }
那么gradle要小心的就是不要把域寫錯了,一定要把域的歸屬寫對,否則出了錯誤你會很蛋疼 下面是一個簡化的例子
//buildscript域 buildscript { //buildscript.repositories 域 repositories { } //buildscript.dependencies域 dependencies { } } apply plugin: 'android' //dependencies域 dependencies { } //android 域 android { }
在比如一個例子 方法的執行和域的關系,在這里,一個域就是一個方法。
productFlavors { no1{ } no1{ } //注意這個all方法現在在productFlavors 域內 all {} }
上面的這段代碼和下面這段代碼完全相等
productFlavors { no1{ } no1{ } } //注意這個all方法現在不在productFlavors 域內,但是卻和上面的方法塊等價 productFlavors.all {}
這第二篇就講些簡單的和一些我遇到的錯誤
下一篇講 用gradle 簽名 混淆 加依賴工程



