因爲本人精力有限,若是內容有更新可能沒法及時更新其餘渠道的內容,請移步簡書 查看文章前端
2014年中的時候,當時國內使用 Android Studio 的人尚未不少,不少人還沒處理嚐鮮的時候我開始把公司的項目遷移到 Android Studio 上了,開始了挺長一段踩坑的日子,開始接觸到了 Gradle,纔開始瞭解到使用它來管理項目的依賴庫,因爲在過程當中有很多第三方庫是沒有將依賴包發佈到 jCenter / Maven Central ,並且我的並不太喜歡把一整個開源項目添加到項目中,致使常用一些非官方倉庫,從而可能給後續維護帶來一些問題。java
例如:git
依賴庫可能有被作修改致使產生沒必要要的 Buggithub
依賴庫被做者從倉庫中刪掉apache
依賴庫更新不及時,升級依賴庫麻煩json
後續跟進的開發者沒法得知依賴庫的來源bash
等等一系統問題~微信
不地能夠經過如下兩個解決方案解決:app
給做者提 issues 讓做者將庫提交到 jCenter / Maven Central框架
本身 fork 一份代碼後提交到 JitPack 上
其實在過程當中一真會出現一些倉庫地址的 URL 是 GitHub 的地址。
例如 Emojicon 庫,如今最新版本已經發布到 jCenter 了:
build.gradle
... allprojects { repositories { maven { url 'https://raw.githubusercontent.com/rockerhieu/mvn-repo/master/' } jcenter() } } ...
app/build.gradle
... dependencies { ... compile 'com.rockerhieu.emojicon:library:1.2' }
最終定位到了這個倉庫 https://github.com/Goddchen/mvn-repo,後來對此進行了一些研究,瞭解到如何使用公共的 Git 倉庫發佈依賴庫,後面我就把一些經常使用的庫本身編譯發佈到本身的 GitHub 的 mvn-repo 倉庫上,一樣達到了相同的效果,而且更可控。
這一步就不詳述了,相信你們 Git 和 GitHub 使用確定比我還熟練。
因爲本人已經不使用 Eclipse,因此確定是使用 Android Studio。
建立一個 BlankApp 項目,這個項目是本身在開發過程當中爲了優化開發流程而寫的(以前的版本 被廢棄了,這個是重寫版,還在構思中)
這是目錄結構
. ├── BlankApp.iml ├── LICENSE ├── README.md ├── build │ ├── generated │ └── intermediates ├── build.gradle ├── examples │ ├── build │ ├── build.gradle │ ├── examples.iml │ ├── libs │ ├── proguard-rules.pro │ └── src ├── gradle │ └── wrapper ├── gradle.properties ├── gradlew ├── gradlew.bat ├── library │ ├── build │ ├── build.gradle │ ├── gradle.properties │ ├── library.iml │ ├── libs │ ├── proguard-rules.pro │ └── src ├── local.properties └── settings.gradle
library
就是一個 Android Library 的Module,examples
是一個Demo Module。
使用了Chris Banes 大神開發的 gradle-mvn-push Gradle 腳本,Chris Banes大神是 Android-PullToRefresh、PhotoView 等流行開源庫的做者。
COMPILE_SDK_VERSION=23 BUILD_TOOLS_VERSION=23.0.2 MIN_SDK_VERSION=14 TARGET_SDK_VERSION=23 VERSION_NAME=0.0.1-alpha VERSION_CODE=1 GROUP=org.blankapp POM_DESCRIPTION= POM_URL=https://github.com/lijy91/BlankApp POM_SCM_URL=https://github.com/lijy91/BlankApp POM_SCM_CONNECTION=scm:git@github.com:lijy91/BlankApp.git POM_SCM_DEV_CONNECTION=scm:git@github.com:lijy91/BlankApp.git POM_LICENCE_NAME=The Apache Software License, Version 2.0 POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt POM_LICENCE_DIST=repo POM_DEVELOPER_ID=lijy91 POM_DEVELOPER_NAME=JianyingLi <lijy91@foxmail.com> RELEASE_REPOSITORY_URL=file:///Users/Lijy91/Documents/Projects/mvn-repo/ SNAPSHOT_REPOSITORY_URL=file:///Users/Lijy91/Documents/Projects/mvn-repo/snapshots/
RELEASE_REPOSITORY_URL
和 SNAPSHOT_REPOSITORY_URL
兩個配置分別是正式版和快照版的本地路徑。若是版本號後帶有 -SNAPSHOT
編譯後會發佈到 SNAPSHOT_REPOSITORY_URL
相應的目錄下。
library
建立 gradle.properties
文件app/library/gradle.properties
POM_NAME=BlankApp Library POM_ARTIFACT_ID=blankapp POM_PACKAGING=aar
library
模塊調用 gradle-mvn-push 腳本library/build.gradle
... apply from: 'https://raw.githubusercontent.com/lijy91/gradle-mvn-push/master/gradle-mvn-push.gradle'
加在文件的未行便可,而後執行 Sync Now 便可
Build
$ ./gradlew clean build uploadArchives
執行些命令後,會在 /Users/Lijy91/Documents/Projects/mvn-repo/
建立相關的文件
. ├── README.md └── org └── blankapp ├── blankapp │ ├── 0.0.1-alpha │ │ ├── blankapp-0.0.1-alpha-javadoc.jar │ │ ├── blankapp-0.0.1-alpha-javadoc.jar.md5 │ │ ├── blankapp-0.0.1-alpha-javadoc.jar.sha1 │ │ ├── blankapp-0.0.1-alpha-sources.jar │ │ ├── blankapp-0.0.1-alpha-sources.jar.md5 │ │ ├── blankapp-0.0.1-alpha-sources.jar.sha1 │ │ ├── blankapp-0.0.1-alpha.aar │ │ ├── blankapp-0.0.1-alpha.aar.md5 │ │ ├── blankapp-0.0.1-alpha.aar.sha1 │ │ ├── blankapp-0.0.1-alpha.pom │ │ ├── blankapp-0.0.1-alpha.pom.md5 │ │ └── blankapp-0.0.1-alpha.pom.sha1 │ ├── maven-metadata.xml │ ├── maven-metadata.xml.md5 │ └── maven-metadata.xml.sha1 └── ...
Push
$ git add . $ git commit -am "Add BlankApp Library" $ git push -u origin master
到此,一個私人的Maven倉庫已經建立完成
一、只需將 mvn-repo 地址添加到您的 build.gradle 文件:
repositories { maven { url 'https://raw.githubusercontent.com/lijy91/mvn-repo/master/' } jcenter() }
二、在要集成的項目中的 build.gradle 中添加依賴,以下:
dependencies { compile 'org.blankapp:blankapp:0.0.1-alpha@aar' }
我最先寫的一個基礎框架庫,就引用了一些我的認爲比較好用的 JSON 解析庫,ORM庫,後來應用在其餘項目的時候發現有一些是在這個項目中是使用不到的,形成了耦合度過大,後面維護難度過大。因此建議儘可能不要依賴,或者參考最後面兩個建議的作法。
library
,sdk
等名稱若是 ArtifactId 使用的是 library,sdk 這種名字,編譯後生成的相關文件就會是 library.jar、sdk.jar 這種文件,不便於分辨。
例如 FIR.im 的 SDK
compile 'im.fir:sdk:latest.integration@aar'
最終在 Android Studio 看到的 External Libraries
就會出現一個sdk.jar 的文件,若是你引用了多個 ArtifactId 爲 library 的類庫,那就會出現 library.jar
、library1.jar
這樣的文件,根本沒法分辨。
後來在個人建議下修改成
compile 'im.fir:fir-sdk:latest.integration@aar'
如下是以前我對 Ping++ SDK 提的一些建議
將基礎部分封裝爲一個sdk 模塊,並提供統一的接口,而後支付寶,微信支付,百度錢包等根據sdk模塊提供的接口進行開發,後面若是用戶須要接入或者升級支付平臺的內容,便可以經過在 build.gradle 文件添加相應平臺的依賴便可。
在 build.gradle 使用時相似這樣子
compile 'com.pingxx:pingxx-sdk:1.0.+' compile 'com.pingxx:pingxx-alipay:1.0.+' compile 'com.pingxx:pingxx-wxpay:1.0.+'
這個問題估計是大多數項目都有出現的問題,例若有個人項目使用了 Fastjson 做爲個人JSON解析庫,但我使用的HTTP庫 Retrofit 1.x 卻使用 Gson,這個時候個人項目裏就引用了兩個一樣功能的庫,並且在咱們不注意的時候,包括HTTP庫,圖片加載庫等等都有可能會有重疊,會大大增長咱們APK的大小。
後來Retrofit2解決了這個問題,它把數據轉換爲獨立出來了,咱們能夠自由選擇本身的數據轉換庫,相似這樣
com.squareup.retrofit2:converter-gson // Gson com.squareup.retrofit2:converter-jackson // Jackson com.squareup.retrofit2:converter-moshi // Moshi com.squareup.retrofit2:converter-protobuf // Protobuf com.squareup.retrofit2:converter-wire // Wire com.squareup.retrofit2:converter-simplexml // Simple XML com.squareup.retrofit2:converter-scalars // Scalars (primitives, boxed, and String)
Enjoy~
剛離職幾天,這段時間在整理近兩年的工做經驗,把本身一些經驗心得分享給你們,但願不斷的優化開發體驗,改進交付方式,將更多的時間花在學習以及生活上,也但願找一份爲開發者服務的工做,座標深圳。
4年工做經驗,近2年從事Android應用開發,熟悉從項目啓動到上線的完整流程,對產品及體驗有必定的理解,對Node.js及前端有着強烈的興趣,但願能夠爲優化開發體驗改進交付軟件交付方式出一點微薄之力~