国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android Studio Gradle打包實(shí)踐之多渠道+版本號(hào)管理

2019-11-09 18:29:36
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

上次介紹了 Android Studio的安裝、配置和基本使用 。這次講一下Android Studio用到的打包工具Gradle。 Gradle 是一種構(gòu)建項(xiàng)目的框架,兼容Maven、Ant,為java項(xiàng)目提供了很多插件去實(shí)現(xiàn)打包功能。廢話不多說(shuō),下面直接進(jìn)入實(shí)戰(zhàn)。當(dāng)我寫(xiě)這篇博客的時(shí)候,Android Studio的版本已經(jīng)更新到了 1.4 ,比上一篇博客的版本又更新了。

Android Studio工程build.gradle腳本介紹

在進(jìn)行多渠道打包之前,先介紹一下Android Studio工程中的gradle腳本長(zhǎng)什么樣。打開(kāi)Android Studio,新建一個(gè)PRoject,這里我給它命名為Hello Gradle,一路點(diǎn)擊下一步,最后Android Studio自動(dòng)為我們建立的如下圖的這個(gè)工程。 這里寫(xiě)圖片描述

按照上篇博客中介紹的,我們推薦大家采用Android結(jié)構(gòu)的視圖來(lái)查看項(xiàng)目結(jié)構(gòu)。展開(kāi)Gradle Scripts我們可以看到里面有兩個(gè) build.gradle 文件和一個(gè) settings.gradle 文件。其中的 build.gradle(Project: HelloGradle) 文件是我們整個(gè)工程的build文件,而 build.gradle(Module: app) 文件是我們工程下的一個(gè)Module的build文件。前面我們就說(shuō)過(guò)Android Studio采用單工程多Module結(jié)構(gòu),一個(gè)工程可以理解為Eclipse下的一個(gè)Workspace,一個(gè)Module可以理解為Eclipse下的Project。當(dāng)我們用Android Studio建立一個(gè)默認(rèn)的工程時(shí),它自動(dòng)為我們建立了一個(gè)名字為 app 默認(rèn)的Module。

所以我們可以知道,一個(gè)Android Studio工程會(huì)有一個(gè) 工程級(jí)別的build.gradle 文件,同時(shí)有N個(gè)Module,就還會(huì)有N個(gè) Module級(jí)別的build.gradle 文件。

工程目錄下的build.gradle(Project: HelloGradle)文件

接著我們先看下這個(gè)工程級(jí)別的build.gradle文件。

// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.3.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }}allprojects { repositories { jcenter() }}task clean(type: Delete) { delete rootProject.buildDir}12345678910111213141516171819202122231234567891011121314151617181920212223

這個(gè)文件里的buildscript閉包中為我們定義了工程用到的repository地址,默認(rèn)為我們加上了jcenter,并添加了版本號(hào)為1.3.0的Android Gradle插件。關(guān)于閉包,由于gradle是基于Groovy語(yǔ)言編寫(xiě)的,而閉包是里面的一個(gè)概念,可以理解為最小的代碼執(zhí)行塊。關(guān)于jcenter,可以理解為一個(gè)兼容Maven中央倉(cāng)庫(kù)的東西,是Google為Android建立的。

最下面還有一個(gè)task clean, task 是gradle腳本中用到最多的東西了。Gradle實(shí)際上是一個(gè)容器,實(shí)現(xiàn)真正的功能的都是Gradle的插件Plugin,而Plugin中又定義了各式各樣的Task,這一個(gè)個(gè)的Task是執(zhí)行任務(wù)的基本單元。 這里一看就知道是一個(gè)delete類型的task,意思是在我們執(zhí)行打包腳本前做一個(gè)清理工作,把項(xiàng)目輸出文件夾中的文件先全部清理干凈。

Module目錄下的build.gradle(Module: app)文件

接著看app Module下的build.gradle文件。

apply plugin: 'com.android.application'11

第一行 apply plugin: ‘com.android.application’ :指的是在這個(gè)腳本中應(yīng)用 Android Application 插件。前面我們說(shuō)到了Gradle中真正起作用的是插件,每個(gè)插件中可以定義各種各樣的Task,當(dāng)然還可以有一些Property屬性,如果你以前是用Ant打包的,那么對(duì)屬性一定不會(huì)陌生吧。

android { compileSdkVersion 22 buildToolsVersion "23.0.1" defaultConfig { applicationId "com.nought.hellogradle" minSdkVersion 14 targetSdkVersion 22 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}123456789101112131415161718123456789101112131415161718

接著看android閉包,里面首先定義了我們這個(gè)Module使用的 compileSdkVersion 和 buildToolsVersion ,這兩個(gè)屬性大家肯定知道,一個(gè)是用來(lái)編譯代碼的sdk版本,一個(gè)是用來(lái)打包apk的build-tools版本。

再看里面的defaultConfig,又定義了幾個(gè)屬性。依次有 applicationId ,代表著你的包名,以前我們都是在AndroidManifest.xml文件中通過(guò)package=”com.nought.hellogradle” 指定應(yīng)用程序的包名,現(xiàn)在我們可以在gradle打包腳本中指定它,后面你會(huì)發(fā)現(xiàn)我們結(jié)合 buildTypes 和productFlavors ,還可以動(dòng)態(tài)的改變它,有點(diǎn)神奇了吧! minSdkVersion 指的是你的應(yīng)用程序兼容的最低Android系統(tǒng)版本; targetSdkVersion 指的是你的應(yīng)用程序希望運(yùn)行的Android系統(tǒng)版本; versionCode 是你的代碼構(gòu)建編號(hào),一般我們每打一次包就將它增加1; versionName 則是你對(duì)外發(fā)布時(shí),用戶看到的應(yīng)用程序版本號(hào),一般我們都用“點(diǎn)分三個(gè)數(shù)字”來(lái)命名,例如 1.0.0 。

接著看下 buildTypes ,這里面默認(rèn)只定義了 release 類型,其實(shí)還可以定 debug 類型以及你自己定義的例如 internal 國(guó)內(nèi)類型、 external 國(guó)外類型等等。以前在每一個(gè)type中,可以分別配置不同的選項(xiàng),例如可以 配置不同的包名、是否混淆 等等,目前的默認(rèn)release類型中配置了混淆文件,minifyEnabled false 指的是不混淆代碼,下面這行

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'11

指定的是你的混淆配置文件。這里就不詳細(xì)介紹了,馬上我們就會(huì)看一下多渠道打包,實(shí)踐一下大家就清楚了。

dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:22.2.1' compile 'com.android.support:design:22.2.1'}123456123456

最后,我們看dependencies閉包,這里指的是我們的工程依賴的庫(kù),以往在Eclipse中開(kāi)發(fā),我們常常通過(guò)jar包,以及添加library的形式來(lái)添加依賴,現(xiàn)在方便了,在gradle腳本里,一行代碼通通搞定!真是簡(jiǎn)單啊!dependencies閉包下,有幾種基本的語(yǔ)法。

1: compile fileTree(dir: 'libs', include: ['*.jar']) ,指的是依賴libs下面所有的jar包,你還可以指定具體的每一個(gè)jar包,而不是采用 *.jar 通配符匹配的方式,例如 compile files('libs/文件名.jar') ;2: compile 'com.android.support:appcompat-v7:22.2.1' ,這種語(yǔ)法是通過(guò)包名:工程名:版本號(hào)的形式來(lái)依賴的,3: testCompile 'junit:junit:4.12' ,指的是測(cè)試時(shí)才會(huì)用到的依賴,這里一看就知道是指做單元測(cè)試時(shí)依賴junit。1234512345

好了,上面介紹了Android Studio默認(rèn)生成的基本的Gradle打包腳本的結(jié)構(gòu)。下面我們?cè)趯?shí)踐中學(xué)習(xí),怎么修改這個(gè)腳本,來(lái)實(shí)現(xiàn)自己的各種需求,例如多渠道自動(dòng)化打包等等。

多渠道打包實(shí)踐

多渠道指的是你的應(yīng)用程序可以發(fā)布到不同的應(yīng)用市場(chǎng),被不同的用戶從各個(gè)市場(chǎng)下載以后,你可以監(jiān)測(cè)到每一個(gè)用戶安裝的這個(gè)應(yīng)用程序是來(lái)自哪個(gè)市場(chǎng)的。實(shí)現(xiàn)的方法有很多,主要是通過(guò)在安裝包中的放置一個(gè)標(biāo)志位來(lái)區(qū)分不同的渠道包。

多渠道打包實(shí)現(xiàn)思路

思路1:AndroidManifest.xml占位符與productFlavor結(jié)合 比較常見(jiàn)的友盟移動(dòng)統(tǒng)計(jì)sdk中使用的方案,這種方案是 通過(guò) build.gradle 腳本中的 productFlavor 來(lái)實(shí)現(xiàn)的。首先在AndroidManifest.xml文件的 application 標(biāo)簽里指定一個(gè) meta-data ,然后Umeng SDK會(huì)讀取這個(gè)標(biāo)簽中value傳到Umeng的后臺(tái),這樣就可以讓開(kāi)發(fā)者監(jiān)測(cè)到自己的應(yīng)用程序渠道分布情況了。

<meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL}"></meta-data>11

其實(shí)元素可以作為子元素,被包含在activityapplicationservicereceiver標(biāo)簽中,但是不同位置下的meta-data讀取方法不一樣,現(xiàn)在以application中放置占位符為例實(shí)踐。

思路2:一次打包,動(dòng)態(tài)替換渠道標(biāo)識(shí)符

在 美團(tuán)的技術(shù)博客 上還分享過(guò) 另外一種實(shí)現(xiàn)思路 :就是在打包完一個(gè)apk之后,再拆包替換掉其中一個(gè)用來(lái)標(biāo)識(shí)渠道市場(chǎng)的文件。這種思路和官方的 buildTypes + productFlavor 方式有所不同。因?yàn)檫@種思路只需要執(zhí)行一次打包任務(wù),剩下的操作是拆開(kāi)apk(實(shí)際上也是一種zip包),替換文件。可想而知這種速度比較快,如果你有很多個(gè)渠道包要打的話,這種思路能提高很多速度,據(jù)說(shuō)100個(gè)渠道包大概只要2分鐘。而普通的 buildTypes + productFlavor 方式,我打了4個(gè)渠道包也花費(fèi)了幾十秒。可見(jiàn)如果有很多渠道包要出,建議采用美團(tuán)的這種思路。

多渠道打包實(shí)現(xiàn)步驟

1. 在AndroidManifest.xml的 application 標(biāo)簽下定義UMENG_CHANNEL占位符。

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.nought.hellogradle" > <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/APPTheme" > <meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL}"></meta-data> <activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>12345678910111213141516171819202122232425261234567891011121314151617181920212223242526

2. 修改app Module的build.gradle腳本,在 android 閉包中添加 productFlavors 屬性,配置替換占位符的渠道標(biāo)識(shí)。

apply plugin: 'com.android.application'android { compileSdkVersion 22 buildToolsVersion "23.0.1" defaultConfig { applicationId "com.nought.hellogradle" minSdkVersion 14 targetSdkVersion 22 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } productFlavors { GooglePlay { manifestPlaceholders = [UMENG_CHANNEL: "GooglePlay"] } Baidu { manifestPlaceholders = [UMENG_CHANNEL: "Baidu"] } Wandoujia { manifestPlaceholders = [UMENG_CHANNEL: "Wandoujia"] } Xiaomi { manifestPlaceholders = [UMENG_CHANNEL: "Xiaomi"] } }}dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:22.2.1' compile 'com.android.support:design:22.2.1'}12345678910111213141516171819202122232425262728293031323334353637383940411234567891011121314151617181920212223242526272829303132333435363738394041

3. 打開(kāi)Android Studio自帶的命令行工具,運(yùn)行 gradle build 命令,就可以在 app/build/outputs/apk/ 目錄下看到生成渠道包apk文件。注意:輸出的apk文件是在app Module下的build目錄中,不是工程根目錄下的build目錄。

這里寫(xiě)圖片描述

我們可以看到在 app/build/outputs/apk/ 中,生成的帶有渠道標(biāo)識(shí)的apk文件有12個(gè),這時(shí)因?yàn)?nbsp;buildTypes 與 productFlavors 兩兩組合,2*4=8,Android Studio默認(rèn)必須有 release 和 debug 這兩種Type。此外,由于buildTypes中還可以定義 zipAlignEnabled true ,意思是混淆后的zip優(yōu)化,該值默認(rèn)為true,因此每個(gè)渠道還多了一個(gè) app-渠道標(biāo)識(shí)-debug-unaligned.apk 文件。

小結(jié):

運(yùn)行 gradle build 命令時(shí),終端里會(huì)顯示當(dāng)前正在執(zhí)行的task,里面有很多我們熟悉的任務(wù),例如dex、javaCompile這些。前面我們說(shuō)過(guò),gradle腳本會(huì)以鉤子的形式,執(zhí)行一系列的tasks,最終構(gòu)建出我們所需要的程序安裝包。感興趣的同學(xué)可以執(zhí)行一下 gradle tasks 命令,這個(gè)命令可以查看當(dāng)前工程下所有的tasks,后面我也將結(jié)合這些tasks,實(shí)踐一下jar包的構(gòu)建。

這里寫(xiě)圖片描述

PS:渠道包修改包名

如果你想修改不同的渠道包的包名,可以在你的 productFlavors 指定不同的 applicationId 即可。在build.gradle文件中,輸入的時(shí)候你就發(fā)現(xiàn)自動(dòng)補(bǔ)全已經(jīng)提示你,還有很多其他的屬性可以配置了,感興趣的同學(xué)不妨試試。

PPS:渠道包改應(yīng)用名稱

如果你還想給不同的渠道指定不同的應(yīng)用名字,例如想要在Xiaomi市場(chǎng)上叫做 “HelloGradle-小米專供版” , 那么你可以新建app/src/Xiaomi/res/values/strings.xml 的文件,里面填寫(xiě) HelloGradle-小米專供版 ,這樣打包出來(lái)的小米渠道包,應(yīng)用程序的名稱就改變成 “HelloGradle-小米專供版” 了。

PPPS:?jiǎn)为?dú)打包某一個(gè)渠道

運(yùn)行 gradle build 會(huì)一次性打包出所有的渠道包,花費(fèi)的時(shí)間還是很長(zhǎng)的。如果只想打一個(gè)渠道的渠道包話應(yīng)該怎么做?以百度為例,可以在命令行中執(zhí)行 gradle assembleBaidu ,我是怎么找到 assembleBaidu 這個(gè)任務(wù)名字的?前面提到過(guò)的,運(yùn)行 gradle tasks ,你就會(huì)發(fā)現(xiàn)所有的tasks列表,找到build類的tasks,就看到了!其實(shí)Android Studio里面,這些全部都有界面操作的,大家看下代碼編輯窗口的右邊欄,是不是有一個(gè)Gradle的按鈕,點(diǎn)擊一下展開(kāi)它,然后點(diǎn)擊面板左上角的刷新按鈕,就可以將所有的tasks列出來(lái)了,和執(zhí)行命令行的效果是一樣的。定制化打包的需求還有很多,同學(xué)們可以自己嘗試嘗試,記得分享出來(lái)給大家啊!

這里寫(xiě)圖片描述

版本號(hào)管理實(shí)踐

版本號(hào)這個(gè)東西,在我出來(lái)實(shí)習(xí)的時(shí)候都還沒(méi)什么感覺(jué),直到不久前有一個(gè)需求,和后臺(tái)的同事合作一起實(shí)現(xiàn)一個(gè)新特性。客戶端這邊要求,只能在某一個(gè)版本以上,后臺(tái)才能返回特定的數(shù)據(jù),而舊版本沒(méi)有解析這些數(shù)據(jù)的功能。結(jié)果后臺(tái)的同事噴了客戶端同學(xué)一頓,說(shuō)客戶端這邊的版本號(hào)命名非常混亂,沒(méi)法按照這個(gè)客戶端的版本號(hào)來(lái)定邏輯,老板們也會(huì)拍掉這個(gè)方案。。。所以呢,我覺(jué)得科學(xué)地管理好版本號(hào),還是非常重要的!

為了簡(jiǎn)單起見(jiàn),這里先把上面的多渠道打包腳本改回原來(lái)默認(rèn)。一般版本號(hào)都會(huì)用 三個(gè)數(shù)字加兩個(gè)點(diǎn) 分開(kāi),例如 1.0.0 這樣的形式。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宁夏| 达州市| 繁昌县| 桂平市| 琼中| 长顺县| 牟定县| 博野县| 沾益县| 宁波市| 佳木斯市| 宝鸡市| 库伦旗| 南川市| 清河县| 塔河县| 临西县| 咸阳市| 南宁市| 重庆市| 桂阳县| 敦化市| 鄂温| 蓬莱市| 星座| 遵义县| 天津市| 太康县| 武穴市| 五莲县| 贵州省| 石屏县| 银川市| 云阳县| 嵊泗县| 疏附县| 新化县| 四川省| 贞丰县| 梁河县| 巴东县|