編輯:關於Android編程
Gradle是一個工具,同時它也是一個編程框架.。可以調用Gradle自帶的api編譯我們的android工程,打包成apk或aar,也可以在.gradle文件中使用Groovy語言進行邏輯編程。我們在android工程中使用的每個.gradle文件 和task執行時都會轉換成一個個的java對象,運行在java虛擬機上。其中主要的有Gradle對象、Project對象和Settings對象。
後面我們通過配置和創建屬性文件實現以下幾個任務:
1、實現多渠道打包
2、通過文件方式配置版本號 及版本名等信息
3、通過文件方式配置簽名文件
4、根據不同渠道動態修改程序名稱和包名
5、根據不同渠道生成apk文件名稱及自定義文件輸出路徑
6、根據不同渠道定制專屬頁面
在實現任務之前 先要說幾個基礎知識:
Gradle中聲明變量有三種方式 一種是 通過def關鍵字 如 def a =1 ,這種聲明只能在聲明所在的方法中使用相當於臨時變量,原因後面會詳細說下,另一種是 ext關鍵字 如ext.a = 1,這種方式是可以在外部聲明在其中方法中使用的, 類似於我們成員變量,另外還有就是 直接聲明 a =1,這種方式也可以在外部聲明在其中方法中使用,但不能在文件外部調用,其實還有一種方式 和ext 效果一樣,
apply plugin: 'com.android.application' // 默認版本號 ext.appVersionCode = 1 // 默認版本名z ext.appVersionName = "1.0" // 默認apk輸出路徑 ext.appReleaseDir = "../apks" // 默認正式包後綴名 ext.appSuffixName = "_release.apk"
// 也可以向下面這種方式聲明變量 ext{ a =1 b = 2 } //定義一個方法 獲取當前日期 def getPackageTime() {
//gradle中創建對象 也像java中一樣 通過new 關鍵字實現 def date = new Date() def formattedDate = date.format('yyyy_MM_dd_HHmm') return formattedDate } // 加載版本信息配置文件方法 def loadProperties() { //將我們的版本號等信息配置在了local.properties 文件中,這裡的file() 是一個方法,返回一個File對象
//Properties 是一種數據類型,其實是就是繼承自hashtable , 可以解析.properties文件,並以鍵值對方式存儲起來 //public class Properties extends Hashtable def proFile = file("../local.properties") Properties pro = new Properties() proFile.withInputStream { stream-> pro.load(stream) }
//為上面定義的變量賦值 appReleaseDir = pro.appReleaseDir appVersionCode = Integer.valueOf(pro.appVersionCode) appVersionName = pro.appVersionName appSuffixName = pro.appSuffixName } // 調用方法 加載版本信息 loadProperties() android { compileSdkVersion 24 buildToolsVersion "24.0.0" defaultConfig { applicationId "com.gqs.demo" minSdkVersion 14 targetSdkVersion 24 versionCode appVersionCode versionName appVersionName testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" }
// 到這裡就完成了 任務 2
//signingConfigs 是對簽名文件的配置 signingConfigs { debug { } release { def Properties localProps = new Properties()
//signature.properties 是配置簽名信息的配置文件 後面會貼出來 localProps.load(new FileInputStream(file('../signature.properties'))) storeFile file(localProps["STORE_FILE"]) keyAlias localProps["KEY_ALIAS"] storePassword localProps["STORE_PASSWORD"] keyPassword localProps["KEY_PASSWORD"] } }
// 到這裡就完成了 任務 3 通過文件方式配置簽名文件//buildTypes 對不同的打包類型 進行配置
//定義apk的輸出路徑 applicationVariants.all { variant -> variant.outputs.each { output -> //開始輸出,自定義輸出路徑 output.outputFile = new File(appReleaseDir + getPackageTime() +//獲取當前日期 "_v" + appVersionName + variant.productFlavors[0].name +//每一個渠道的名稱 appSuffixName) //appSuffixName 是我們聲明的文件後綴 } } // 到這裡 就實現了 任務 5 根據不同渠道生成apk文件名稱及自定義文件輸出路徑} }
//productFlavors 就是實現不同渠道打包了 productFlavors {
//對每個渠道 設定特定的包名 也就是applicationId rainbow{ // 都使用默認設置 } xiaomi { //設置特定渠道的包名 applicationId "com.rainbow.xiaomi" } m360 { applicationId "com.rainbow.qihu" } productFlavors.all { flavor -> //動態設置不同渠道的app name // AndroidManifest文件中 android:label="${APP_NAME}" //使用渠道名稱替換 APP_NAME,使每個渠道都有自己的 app名稱flavor.manifestPlaceholders = [APP_NAME: name]
下面是 signature.properties
STORE_FILE=../your key STORE_PASSWORD=*** KEY_ALIAS=*** KEY_PASSWORD=****=========================== local.properties
sdk.dir=/Applications/android_tools/android-sdk-macosx #=====以下是自己定義的內容===== # 打包的輸出路徑 appReleaseDir=./apks/ # APP版本號,用來升級使用 appVersionCode=2 # APP版本名稱,最終打包使用 appVersionName=1.0.0.2 # app正式版包名後綴 appSuffixName=_release.apk最後 實現 任務 6根據不同渠道定制專屬頁面 只要 在我們的 src文件夾下 創建和渠道相同的文件夾 可以了 ,裡面放入我們要修改的布局文件或 values中的文件。 其實默認 我們用的都是 src下 main中的文件 ,如果我們創建了和渠道名稱相同的文件夾 ,gradle 打包的時候 就會從對應到文件夾中取數據了。 不如 我替換了 首頁的布局 ,最後就生成了三個不同的頁面 以上就是所有了,總之 Gradle 是非常強大的,只要你想 ,可以實現你各種需求,當然對於android 開發終歸只是輔助工具,不必理解的過於深入,但是熟練掌握基本的使用是必須的,這可以大大的提高我們到開發效率。
Servlet在不實現SingleThreadModel的情況下運行時是以單個實例模式,如下圖,這種情況下,Wrapper容器只會通過反射實例化一個Servlet對象,對
眾所周知,當需要文字進入走馬燈狀態的時候,需要設置屬性 android:ellipsize="marquee" 但是有時候並不能啟
SlidingMenu簡介: SlidingMenu的是一種比較新的設置界面或配置界面效果,在主界面左滑或者右滑出現設置界面,能方便的進行各種操作.目前有大量的應用都在使
今天再來介紹該作者的另一個開源項目circular-progress-button,效果更酷炫。項目地址:https://github.com/dmytrodanylyk