編輯:Android資訊
Jenkins是一個開源軟件項目,旨在提供一個開放易用的軟件平台,使軟件的持續集成變成可能。目前大部分公司都在使用Jenkins來持續構建。
安裝Jenkins有兩種方式:
第一種就是下載安裝包直接安裝,下載地址:http://mirrors.jenkins-ci.org
第二種就是下載war包,放到Tomcat中啟動。war包下載地址:http://mirrors.jenkins-ci.org/war/,
或者http://updates.jenkins-ci.org/download/war/
這裡因為我電腦上面之前裝了Tomcat,所以我使用直接下載war包的方式進行安裝。
將下載的jenkins.war放到Tomcat下的webapps目錄下,然後啟動Tomcat。在浏覽器中訪問”Tomcat訪問地址/jenkins”即可安裝,因為我的Tomcat裝在本機,並且端口為8080,所以訪問http://localhost:8080/jenkins/即可進行安裝。
Jenkins安裝之後可以進行用戶的權限設置、插件的安裝等配置。
用戶權限設置
系統管理–>Configure Global Security
如下圖所示,在此處可以添加、刪除用戶以及配置用戶權限。

插件安裝
搭建Android自動化打包環境需要安裝Gradle插件,如果使用Git還需要Git的插件,安裝Jenkins時默認已經安裝了這兩個插件。如果沒有安裝可以進入“系統管理>管理插件”進行插件的安裝。

要想Jenkins能夠幫我們自動構建項目,我們需要創建一個任務,並且配置這個任務要它幫我們執行什麼操作,以及什麼時候執行等。

如上圖所示,點擊“新建”按鈕並且選擇“構建一個自由風格的軟件項目”,完了之後會進入到任務的配置界面,配置好之後任務會出現在如上圖右邊的任務列表中。
創建一個任務之後,會自動跳轉到任務的配置界面對該任務進行配置,大概包括如下配置:
源碼管理

構建項目,當然得有代碼了。Jenkins支持使用版本控制工具來進行源碼管理,比如Git或者SVN。這裡我使用的是Git,項目使用的是我的github上面的一個多渠道打包的demo。在Repository URL中輸入項目地址,點擊Add按鈕添加認證信息,然後選擇構建的分支,我這裡使用的是master分支。
構建觸發器

Jenkins支持上圖所示的觸發時機配置,如果都不選,則為手動構建,需要點擊“立即構建”按鈕才構建。
Build periodically:周期進行項目構建(它不關心源碼是否發生變化);
Build when a change is pushed to GItHub:表示只要GitHub上面源碼一更新即進行構件;
Poll SCM:定時檢查源碼變更(根據SCM軟件的版本號),如果有更新就checkout最新code下來,然後執行構建動作。
Build periodically和Poll SCM都支持日程表的設置,這個與Spring框架中定時器的日程表配置類似,有5個參數:
第一個參數代表的是分鐘 minute,取值 0~59;
第二個參數代表的是小時 hour,取值 0~23;
第三個參數代表的是天 day,取值 1~31;
第四個參數代表的是月 month,取值 1~12;
最後一個參數代表的是星期 week,取值 0~7,0 和 7 都是表示星期天。
如:
選擇Build periodically並設置日程表為“0 4 ”,則表示每天凌晨4點構建一次源碼。
選擇Poll SCM並設置日程表為“/10 ”,則表示每10分鐘檢查一次源碼變化,如果有更新才進行構建。
構建工具
因為現在Android項目默認都是使用Gradle來進行構建的,所以在構建中我選擇的是Invoke Gradle script。當然你也可以選擇其它的構建工具,比如Ant。
選擇Invoke Gradle script之後可以選Invoke Gradle和Use Gradle Wrapper,選擇Invoke Gradle就是調用本地安裝配置好的Gradle,此時需要指定Gradle路徑。為了方便所有開發者同意Gradle版本,一般都使用Gradle Wrapper。關於Gradle和Gradlew的區別可以看這篇文章https://www.zybuluo.com/xtccc/note/275168。

Tasks中填上需要執行的gradle的task。上面我填的clean assembleRelease,即執行gradlew clean assembleRelease。
構建後的操作
配置構建後的操作可以讓Jenkins在構建完之後執行什麼操作,比如郵件通知、構建其它項目等。

這裡我配置了Archive the artifacts,在“用於存檔的文件”中填寫需要存檔的文件名,可以使用通配符。比如上面我配置了app/build/outputs/apk/v*.apk,表示疑v開頭的apk文件都存檔。構建完之後在任務首頁可以下載存檔的文件。
任務配置完成之後,點擊任務首頁的“立即構建”按鈕,即可開始構建,構建過程首先會將源碼下載下來,位於jenkins目錄下的workspace中。然後執行配置好的gradle命令,如果使用gradlew,第一次應該會下載gradlew設置的版本的gradle,最後執行構建任務。構建完之後,如下圖,可以看到存檔的文件,點擊即可下載。

apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.lauren.multichanneldemo"
minSdkVersion 17
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
signingConfigs {
release {
def liulingStoreFile = System.getenv("LIULING_STORE_FILE")
def liulingKeyAlias = System.getenv("LIULING_KEY_ALIAS")
def liulingKeyPassword = System.getenv("LIULING_KEY_PASSWORD")
def liulingStorePassword = System.getenv("LIULING_STORE_PASSWORD")
def isSigning = (liulingStoreFile != null) && (liulingKeyAlias != null) && (liulingKeyPassword != null) && (liulingStorePassword != null)
if(isSigning){
storeFile file(liulingStoreFile)
keyAlias liulingKeyAlias
keyPassword liulingKeyPassword
storePassword liulingStorePassword
} else {
storeFile file("debug.keystore")
keyAlias "AndroidDebugKey"
keyPassword "android"
storePassword "android"
}
}
debug {
storeFile file("debug.keystore")
keyAlias "AndroidDebugKey"
keyPassword "android"
storePassword "android"
}
}
buildTypes {
release {
// 不顯示Log
buildConfigField "boolean", "LOG_DEBUG", "false"
//啟用混淆代碼的功能
minifyEnabled true
//壓縮對齊生成的apk包
zipAlignEnabled true
//指定混淆規則,需要壓縮優化的混淆要把proguard-android.txt換成proguard-android.txt
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
shrinkResources true
signingConfig signingConfigs.release //打包命令行:gradlew assembleRelease
}
debug {
signingConfig signingConfigs.debug
}
}
lintOptions {
abortOnError false
}
// productFlavors {
// _91 {
// manifestPlaceholders = [MTA_CHANNEL_VALUE: "91"]
// }
// wandoujia {
// manifestPlaceholders = [MTA_CHANNEL_VALUE: "wandoujia"]
// }
// xiaomi {
// manifestPlaceholders = [MTA_CHANNEL_VALUE: "xiaomi"]
// }
//
// _360shoufa{
// manifestPlaceholders = [MTA_CHANNEL_VALUE: "360shoufa"]
// }
// anzhi{
// manifestPlaceholders = [MTA_CHANNEL_VALUE: "anzhi"]
// }
// baidushoufa{
// manifestPlaceholders = [MTA_CHANNEL_VALUE: "baidushoufa"]
// }
// huaweishoufa{
// manifestPlaceholders = [MTA_CHANNEL_VALUE: "huaweishoufa"]
// }
// }
// 如果嫌上面寫法麻煩,也可以這樣簡寫,加上一個批量處理即可.
productFlavors {
_91 {}
wandoujia {}
xiaomi {}
_360shoufa{}
anzhi{}
baidushoufa{}
huaweishoufa{}
}
//批量處理
productFlavors.all {
flavor ->
def channel = name.startsWith("_") ? name.substring(1) : name
flavor.manifestPlaceholders = [MTA_CHANNEL_VALUE: channel]
}
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (variant.buildType.name.equals('release')) {
//可自定義自己想要生成的格式
def channel = variant.productFlavors[0].name.startsWith("_") ? variant.productFlavors[0].name.substring(1) : variant.productFlavors[0].name
def fileName = "v${defaultConfig.versionName}_${releaseTime()}_${channel}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
apply from: 'productFlavors.gradle'
}
def releaseTime() {
return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
}
Android應用Loaders全面詳解及源碼淺析
1 背景 在Android中任何耗時的操作都不能放在UI主線程中,所以耗時的操作都需要使用異步實現。同樣的,在ContentProvider中也可能存在耗時操作,
Android 7.0 Nougat 不得不知的 11 項新功能
本文由碼農網 – 豆照建原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃! 最近 Google 已經發布 Android 新版本 7.0 N
使用 Lambda 取代 Android 中的匿名類
Lambda Lambda是第十一個希臘字母,大寫Λ,小寫λ,額,跑題了…Lambda表達式 是Java8的新特性之一: Lambda表達式 函數式
Android圖片(視頻)選擇器:android-media-picker
本文由碼農網 – 小峰原創,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃! android-media-picker是一個基於Android的圖片