Android 項(xiàng)目打包到 JCenter 的坑

搜索下如何發(fā)布 Android 項(xiàng)目的信息益眉,大部分都會(huì)找到這篇文章 Publishing Gradle Android Library to jCenter Repository,中文的指引可以看使用Gradle發(fā)布項(xiàng)目到JCenter倉庫。不過,如果按照這些文章提供的 build.gradle毕匀,可能還會(huì)遇到一些坑熊杨。

調(diào)用 getBootClassPath() 出錯(cuò)

具體的錯(cuò)誤信息是

Cannot call getBootClasspath() before setTargetInfo() is called.

這個(gè)是 gradle 的 android plugin 1.1.0 版本的 bug肿轨,見 Issue 152811 - android - Android Gradle Plugin 1.1.0 breaks Javadoc tasks荡碾。將插件更新到 1.1.1 以上版本就可以了。

classpath 'com.android.tools.build:gradle:1.1.2'

GBK 編碼問題

Windows 用戶可能會(huì)遇到這個(gè)問題均践,因?yàn)槟銓⑽募O(shè)置為 UTF-8 編碼晤锹,javadoc 默認(rèn)的是系統(tǒng)編碼,Windows 就是 GBK 編碼彤委。所以一旦 java 文件中出現(xiàn)中文注釋就會(huì)報(bào)錯(cuò)鞭铆,提示無法映射的GBK編碼

這個(gè)很容易解決,為 javadoc 指明編碼就可以车遂。在 gradle 可以這么做: options.encoding = "utf-8"封断,具體的任務(wù)代碼如下:

task javadoc(type: Javadoc) {
    ...
    options.encoding = "utf-8"
    ...
}

javadoc 的依賴問題

task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}

文章中的 javadoc 任務(wù)是這樣的,重點(diǎn)在 classpath 那一行舶担,這一行的意思是添加 Android 框架到 javadoc 的 classpath 中坡疼。不過,如果你的項(xiàng)目使用了其他第三方依賴衣陶,那 javadoc 任務(wù)很可能會(huì)執(zhí)行失敗的柄瑰,因?yàn)樯厦娴拇a并沒有這些添加第三方依賴到 classpath 中。比如我的項(xiàng)目剪况,有下面這些依賴:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.google.code.gson:gson:2.3.1'
    compile 'com.android.support:gridlayout-v7:22.1.1'
    compile 'com.android.support:support-v4:22.1.1'
    compile 'com.android.support:appcompat-v7:22.1.1'
}

跑起上面的 javadoc 就會(huì)報(bào)錯(cuò)教沾,類似下面的錯(cuò)誤:

    xxxx.java:20: 錯(cuò)誤: 找不到符號(hào)
    public static <T> T create(JsonElement json, Class<T> classOfModel) {
                               ^
  符號(hào):   類 JsonElement
  位置: 類 xxxx

這時(shí)最簡單的方法就是把第三方依賴加入 classpath:

 classpath += project.files(configurations.compile.files,android.getBootClasspath().join(File.pathSeparator))

但是仍然報(bào)錯(cuò)

Error:Could not find com.android.support:gridlayout-v7:22.1.1.
Searched in the following locations:
USER_HOME/.m2/repository/com/android/support/gridlayout-v7/22.1.1/gridlayout-v7-22.1.1.pom
USER_HOME/.m2/repository/com/android/support/gridlayout-v7/22.1.1/gridlayout-v7-22.1.1.jar
https://jcenter.bintray.com/com/android/support/gridlayout-v7/22.1.1/gridlayout-v7-22.1.1.pom
https://jcenter.bintray.com/com/android/support/gridlayout-v7/22.1.1/gridlayout-v7-22.1.1.jar
...

這時(shí)我的 repositories 是這樣的:

allprojects {
    repositories {
        mavenLocal()
        jcenter()
    }
}

找不到 support 庫,因?yàn)?support 庫是 sdk 下載下來的译断,所以在這兩個(gè)位置找不到也很正常授翻。Android Plugin 自帶的任務(wù)執(zhí)行起來卻不會(huì)報(bào)錯(cuò),想必是做了特殊處理孙咪。

sdk 目錄下也有個(gè) maven repository堪唐,就是那些 support libs 所在的位置。

ANDROID_HOME\extras\android\m2repository

加進(jìn)去再試一下

Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream()) // local.properties 有 sdk 的絕對(duì)位置
allprojects {
    repositories {
        maven {
            url properties.getProperty("sdk.dir")+"/extras/android/m2repository"
        }
        mavenLocal()
        jcenter()
    }
}

依然報(bào)錯(cuò)该贾,這次是找到那些庫了羔杨,但因?yàn)?sdk 目錄下的庫是 aar 格式的,javadoc 不支持杨蛋。所以問題到這里近乎無解了,幸好我在 stackoverflow 找到另一個(gè) android 生成 javadoc 的方法理澎。稍加改寫就可以生成 javadoc 為 maven 所用:

android.libraryVariants.all { variant ->
    println variant.javaCompile.classpath.files
    if(variant.name == 'release') { //我們只需 release 的 javadoc
        task("generate${variant.name.capitalize()}Javadoc", type: Javadoc) {
            // title = ''
            // description = ''
            source = variant.javaCompile.source
            classpath = files(variant.javaCompile.classpath.files, project.android.getBootClasspath())
            options {
                encoding "utf-8"
                links "http://docs.oracle.com/javase/7/docs/api/"
                linksOffline "http://d.android.com/reference", "${android.sdkDirectory}/docs/reference"
            }
            exclude '**/BuildConfig.java'
            exclude '**/R.java'
        }
        task("javadoc${variant.name.capitalize()}Jar", type: Jar, dependsOn: "generate${variant.name.capitalize()}Javadoc") {
            classifier = 'javadoc'
            from tasks.getByName("generate${variant.name.capitalize()}Javadoc").destinationDir
        }
        artifacts {
            archives tasks.getByName("javadoc${variant.name.capitalize()}Jar")
        }
    }
}

以 support-v4 為例逞力,configurations.compilevariant.javaCompile.classpath 打印出來的位置是不同的,分別是

  • SDK_HOME\extras\android\m2repository\com\android\support\support-v4\22.1.1\support-v4-22.1.1.aar
  • PROJECT_HOME/MODULE/build/intermediates/exploded-aar/com.android.support/support-v4/22.1.1/jars/libs/internal_impl-22.1.1.jar

看來 Android Plugin 確實(shí)有特殊處理糠爬。生成 javadoc 沒問題其他的也基本沒有什么問題寇荧,最終的 build.gradlegist

關(guān)于 javadoc 的坑寫得十分啰嗦执隧,主要是想和大家分享一些 gradle 的使用經(jīng)驗(yàn)揩抡,其實(shí) gradle 并不困難,主要是 Android Plugin 缺乏文檔又鮮有例子镀琉,所以折騰起來比較難受峦嗤。Android Plugin 的用戶指南是在 New Build System 而 DSL 文檔則是在 Android Plug-in for Gradle 右邊有個(gè)下載 DSL 文檔按鈕。Gradle 可看官方的用戶指南 Gradle User Guide屋摔,我還有一個(gè)亂糟糟的筆記這個(gè)不足為看了烁设。

如何上傳到 JCenter 這個(gè)按照一開始提及文章的操作應(yīng)該是沒什么問題的,反正我沒遇到問題钓试,成功上傳了 lru-image装黑。其實(shí)副瀑,不用上傳到 jcenter 單單運(yùn)行 install 任務(wù), gradle 會(huì)在 maven 的本地倉庫中生成工件(artifact)恋谭,只需將 mavenLocal 添加到 repositories糠睡,我們可以像發(fā)布到 JCenter 一樣引用自己的庫,方便打包那些多個(gè)項(xiàng)目共享又不想發(fā)布的私有庫疚颊。

allprojects {
    repositories {
        mavenLocal()
        jcenter()
    }
}

原文鏈接:https://dourok.info/2015/05/09/trouble-of-publish-aar/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铜幽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子串稀,更是在濱河造成了極大的恐慌除抛,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件母截,死亡現(xiàn)場(chǎng)離奇詭異到忽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)清寇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門喘漏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人华烟,你說我怎么就攤上這事翩迈。” “怎么了盔夜?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵负饲,是天一觀的道長。 經(jīng)常有香客問我喂链,道長返十,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任椭微,我火速辦了婚禮洞坑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蝇率。我一直安慰自己迟杂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布本慕。 她就那樣靜靜地躺著排拷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪间狂。 梳的紋絲不亂的頭發(fā)上攻泼,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼忙菠。 笑死何鸡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的牛欢。 我是一名探鬼主播骡男,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼傍睹!你這毒婦竟也來了隔盛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤拾稳,失蹤者是張志新(化名)和其女友劉穎吮炕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體访得,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡龙亲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悍抑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鳄炉。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖搜骡,靈堂內(nèi)的尸體忽然破棺而出拂盯,到底是詐尸還是另有隱情,我是刑警寧澤记靡,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布谈竿,位于F島的核電站,受9級(jí)特大地震影響簸呈,放射性物質(zhì)發(fā)生泄漏榕订。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一蜕便、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贩幻,春花似錦轿腺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至趣些,卻和暖如春仿荆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工拢操, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锦亦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓令境,卻偏偏與公主長得像杠园,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子舔庶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,070評(píng)論 25 707
  • 由于本篇文章的排版問題抛蚁,不利于閱讀,請(qǐng)看排版后的文章:傳送門 引言 使用Android Studio開發(fā)的童鞋惕橙,相...
    SupLuo閱讀 1,584評(píng)論 0 50
  • 框架:提供一定能力的小段程序 http://www.cnblogs.com/jincheng-yangchaofa...
    姑娘請(qǐng)別為難小僧閱讀 7,221評(píng)論 0 132
  • 退潮了 我們追逐著夕陽 像個(gè)孩子似的 雀躍在寬闊的河灘上 被潮水洗刷過的河灘 還殘留著海的余味 它披著金色的華服 ...
    詩姬閱讀 703評(píng)論 6 2
  • 科二練了有一個(gè)多月了瞧甩,每次去都能聽到各個(gè)學(xué)員對(duì)自己教練的抱怨:就知道搭訕美女,就知道較那些年輕人(目測(cè)全是95后)...
    輕嚀閱讀 206評(píng)論 0 0