編輯:關於Android編程
互聯網的發展是非常迅猛的,剛剛覺得自己適應了eclipse的用法,突然發現它已經被淘汰了。
OK,今天不是來說eclipse和Android studio的褒貶。我們是來學習技術的。在做SDK相關的開發時發現一個問題,Android studio 使用第三方包超級簡單方面。一行代碼搞定。
compile ‘com.ruffian.utils.android:utilssdk:0.1.0’
這就可以把第三包(Library)導入到項目編譯使用。我的天啊,這麼神奇嗎?回想起使用eclipse導入項目,當做依賴包使用的艱辛,是不是頓時覺得這種方式碉堡了。
這行代碼神奇的背後影藏著什麼呢?先問問自己
1.首先這個第三方的包如何能為我?它在哪裡?雲服務器?本地?
2.這個第三方包是怎樣的項目結構呢?jar?apk?
3.我們如何能做到一行代碼使用第三方包?
1.首先這個第三方的包如何能為我?它在哪裡?雲服務器?本地?
通過測試發現,這個第三方包,存在雲服務器上,compile 之後Android studio 會將代碼下載到本地。通過以下方式查看文件位置
項目右鍵->Library Properties 就可以查看文件位置<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxpbWcgYWx0PQ=="這裡寫圖片描述" src="/uploadfile/Collfiles/20160531/20160531091153453.png" title="\" />
這個第三方包是怎樣的項目結構呢?jar?apk?
在Library文件目錄項看到三個文件夾
.pom jar aar打開 .pom 文件,可以看到是關於library項目的一些基本信息。網上解釋:
pom,Project Object Model,在maven1中叫做project.xml,到maven2後改為pom.xml。該文件用於管理:源代碼、配置文件、開發者的信息和角色、問題追蹤系統、組織信息、項目授權、項目的url、項目的依賴關系等等。一個maven項目可以沒有任何源代碼,但必須包含pom文件。
jar:不解釋了,就是java/Android代碼
aar:诶,這個是啥,貌似在哪裡見過,但是又不是很熟。修改後綴看看裡面什麼狀況
aar文件夾結構如上圖。略微了解了一下,aar是 SDK的一種項目結構。使用studio打包。而我們使用eclipse處理SDK Library一般是一個完整的Android項目(包括資源文件)和jar文件
我們如何能做到一行代碼使用第三方包?
前面簡單交代一下1,2兩個問題。接下來說說我們一個普普通通的開發者如何做到看似高大上的行為。
其實Android Studio是從build.gradle裡面定義的Maven 倉庫服務器上下載library的。Apache Maven是Apache開發的一個工具,提供了用於貢獻library的文件服務器。總的來說,只有兩個標准的Android library文件服務器:jcenter 和 Maven Central。
關於以及將Android Library發布到JCenter的操作可以查看下面這篇文章
https://inthecheesefactory.com/blog/how-to-upload-library-to-jcenter-maven-central-as-dependency/en
臥槽,這麼坑爹,丟給你們一個英文網站就算完了?那好咯,給多一個中文的翻譯
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0623/3097.html
這是一篇好文章,能看懂的話基本都知道怎麼回事了,列舉的條條是道,但是好像有點坑爹,怎麼弄都跑不起來,或者各種報錯。程序員嘛,誰跟你講道理,跑起來才是硬道理。好吧,下面我嘗試了之後做了一下總結個改進。反正我是成功實現了。我跑起來了,怎麼樣。
第1部分:在bintray上創建package 第2部分:准備一個Android Studio項目 第3部分:把library上傳到你的bintray空間 第4部分:測試使用第1部分:可以參考上面鏈接文章操作,注冊賬號,創建包名。圖文並茂真的可以參考,就不在重復
第2部分:創建一個Android studio項目,然後添加一個module,做為library項目
2.1創建項目
2.2配置項目[ 這個是最關鍵的啦 ](跳過功能代碼部分,可以寫一個最簡單的log類)
為了快速上手,這裡直接給出幾個配置文件的代碼
1.在library項目中添加以下3個文件
1.1 project.properties
#project
project.name=UtilsSdk
project.groupId=com.ruffian.utils.android
project.artifactId=utilssdk
project.versionName=0.1.0
project.packaging=aar
#這兩個值可以隨便找一個項目
project.siteUrl=https://github.com/adamrocker/volley
project.gitUrl=https://github.com/adamrocker/volley.git
#javadoc
javadoc.name=UtilsSdk
解釋一下文件(記得實際項目中一定要替換成開發者自己的項目名稱,包名等等)
project.name:項目名稱
project.groupId:項目組ID,通常情況下如果你的包名為com.example.test,那麼項目組ID就是com.example
project.artifactId:項目ID,通常情況下如果你的包名為com.example.test,那麼項目ID就是test
project.packaging:包類型,Android庫是aar
project.siteUrl:項目官方網站的地址,沒有的話就用Github上的地址,例如:https://github.com/xiaopansky/Sketch
project.gitUrl:項目的Git地址,例如:https://github.com/xiaopansky/Sketch.git
javadoc.name:生成的javadoc打開後主頁顯示的名稱,通常跟項目名稱一樣即可
1.2 local.properties
#bintray
bintray.user=ruffian
bintray.apikey=******************
#developer
developer.id=Ruffian
developer.name=RuffianZhong
[email protected]
解釋一下文件(記得實際項目中一定要替換成開發者自己的項目名稱,包名等等)
bintray.user:你的Bintray的用戶名
bintray.apikey:你的的Bintray的API Key
developer.id:通常是你在開源社區的昵稱
developer.name:你的姓名
developer.email:你的郵箱
1.3 bintrayUpload.gradle
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
// load properties
Properties properties = new Properties()
File localPropertiesFile = project.file("local.properties");
if (localPropertiesFile.exists()) {
properties.load(localPropertiesFile.newDataInputStream())
}
File projectPropertiesFile = project.file("project.properties");
if (projectPropertiesFile.exists()) {
properties.load(projectPropertiesFile.newDataInputStream())
}
// read properties
def projectName = properties.getProperty("project.name")
def projectGroupId = properties.getProperty("project.groupId")
def projectArtifactId = properties.getProperty("project.artifactId")
def projectVersionName = properties.getProperty("project.versionName")
def projectPackaging = properties.getProperty("project.packaging")
def projectSiteUrl = properties.getProperty("project.siteUrl")
def projectGitUrl = properties.getProperty("project.gitUrl")
def developerId = properties.getProperty("developer.id")
def developerName = properties.getProperty("developer.name")
def developerEmail = properties.getProperty("developer.email")
def bintrayUser = properties.getProperty("bintray.user")
def bintrayApikey = properties.getProperty("bintray.apikey")
def javadocName = properties.getProperty("javadoc.name")
group = projectGroupId
// This generates POM.xml with proper parameters
install {
repositories.mavenInstaller {
pom {
project {
name projectName
groupId projectGroupId
artifactId projectArtifactId
version projectVersionName
packaging projectPackaging
url projectSiteUrl
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
developers {
developer {
id developerId
name developerName
email developerEmail
}
}
scm {
connection projectGitUrl
developerConnection projectGitUrl
url projectSiteUrl
}
}
}
}
}
// This generates sources.jar
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
// This generates javadoc.jar
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives javadocJar
archives sourcesJar
}
// javadoc configuration
javadoc {
options {
encoding "UTF-8"
charSet 'UTF-8'
author true
version projectVersionName
links "http://docs.oracle.com/javase/7/docs/api"
title javadocName
}
}
// bintray configuration
bintray {
user = bintrayUser
key = bintrayApikey
configurations = ['archives']
pkg {
repo = "maven"
name = projectName
websiteUrl = projectSiteUrl
vcsUrl = projectGitUrl
licenses = ["Apache-2.0"]
publish = true
}
}
bintrayUpload.gradle這個文件不用解釋,不用修改,直接復制
2.在library項目的build.gradle文件最後添加代碼
apply from: "bintrayUpload.gradle"
引用本地的 “bintrayUpload.gradle” 文件。這個文件的代碼直接復制到項目中即可,不需要修改。
3.在項目目錄下的build.gradle文件中添加代碼
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
}
好了,精華都在那幾個配置文件裡面了,前提是在bintray上面已經建好了賬號。填好包名
接下來就要上傳代碼到bintray中了。
第3部分:把library上傳到你的bintray空間
3.1請到Android Studio的終端(Terminal)選項卡
第一步是檢查代碼的正確性,以及編譯library文件(aar,pom等等),輸入下面的命令:
gradlew install
如果沒有什麼問題,會顯示:
BUILD SUCCESSFUL
現在我們已經成功一半了。下一步是上傳編譯的文件到bintray,使用如下的命令:
gradlew bintrayUpload
如果顯示如下你就大神問問周圍的人:“你看我吊不”!然後去在bintray的網頁上檢查一下你的package
SUCCESSFUL
但是你怎麼可能有我那麼吊,你肯定一直在報錯,哈哈。報錯就對了。
常見問題
Error:Cause: org/gradle/api/publication/maven/internal/DefaultMavenFactory:當你使用的Gradle版本是2.4以上,Android插件版本是1.3.0以上的時候就會出現這個問題,這時候你只需將android-maven-gradle-plugin插件版本改為classpath ‘com.github.dcendents:android-maven-gradle-plugin:1.3’即可
—我是分隔符—
You are using JDK version ‘java version “1.7.0_71”’. Some versions of JDK 1.7 (e.g. 1.7.0_10) may cause class loading errors in Gradle.Please update to a newer version (e.g. 1.7.0_67):當你使用的Gradle版本是2.4以上,Andriod插件版本是1.2.3的時候就會出現這個問題,同樣的你只需要將android-maven-gradle-plugin插件版本改為classpath ‘com.github.dcendents:android-maven-gradle-plugin:1.3’即可
—我是分隔符—
No value has been specified for property ‘packageName’.出這個問題肯定是看文檔不仔細,把project.properties文件放在了項目根目錄下,一定要放在mudule目錄下才可以
—我是分隔符—
Could not upload to ‘https://.pom’: HTTP/1.1 400 Bad Request [message:Unable to upload files: Maven group, artifact or version defined in the pom file do not match the file path ‘***.pom’]這個問題一般都是你的module的名字和你在project.properties 配置的artifactId不一致導致的,改成一樣的即可
估計這幾個問題之後就應該可以看見SUCCESS了。現在看看bintray網站上面的變化
1.
2.
3.
終於把代碼放到了網上,現在需要將代碼從bintray同步到jcenter。這一步很簡單,查看鏈接中的文章有說明。
那現在是不是就可以實現1行代碼實現吊炸天的操作?哪有那麼容易,隨便弄一下就想一行代碼搞定?
得2行代碼!!
因為代碼從bintray同步到jcenter需要幾個小時的時間,但是我已經等不及想看看自己成果,那麼就多寫一行代碼配置一下library路徑就可以了
新建一個Android studio 測試項目。
在項目根目錄下的build.gradle中添加
allprojects {
repositories {
jcenter(){
url 'https://dl.bintray.com/ruffian/maven/'
}
}
}
引入Library項目,在APP目錄下的build.gradle中添加
dependencies {
//utils
compile 'com.ruffian.utils.android:utilssdk:0.1.0'
}
sync now
ok,搞定,在activity中調用Library中的方法測試一下,能正確調用。沒問題!你做到了
1、 WIFI網卡的狀態WIFI網卡的狀態信息都以整型變量的形式存放在 android.net.wifi.WifiManager 類中,有以下狀態:WIFI_STATE_
其實很早之前也寫了一篇Gradle的基礎博客,但是時間很久了,現在Gradle已經更新了很多,所以暫且結合Stduio 1.0正式版與最新的Gradle語法來詳細講解下,
需求是在我按下按鈕時,該變按鈕顏色,使用戶感覺到自己按了按鈕,當松開的時候,變回原來的顏色。正常時:按下時:有人說,直接監聽按鈕的按下事件不得了嘛,其實這樣確實能實現同樣
引言在應用程序開發過程經常需要對文本進行處理,比如說對一段描述文字的其中一段加入點擊事件,或者對其設置不一樣的前景色,有什麼方法可以實現要求的功能吶?需求樣例比如我們需要