自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android Gradle從認(rèn)識(shí)到實(shí)踐

移動(dòng)開發(fā) Android
前一篇文章,對(duì)Gradle進(jìn)行了一個(gè)概述,同時(shí)對(duì)于Groovy語言進(jìn)行了簡單的介紹,有了之前的基礎(chǔ),現(xiàn)在就可以進(jìn)行更細(xì)致化的學(xué)習(xí),來學(xué)習(xí)一下在AndroidStudio中如何來配置我們的Build文件,來完成一些特定的功能,進(jìn)行自定義構(gòu)建。本文將先從各個(gè)gradle文件入手,分析各個(gè)文件中,我們可以進(jìn)行哪些配置,這些配置又可以起到什么作用,如何通過gradle來滿足對(duì)于構(gòu)建的自定義需求。

前言

前一篇文章,對(duì)Gradle進(jìn)行了一個(gè)概述,同時(shí)對(duì)于Groovy語言進(jìn)行了簡單的介紹,有了之前的基礎(chǔ),現(xiàn)在就可以進(jìn)行更細(xì)致化的學(xué)習(xí),來學(xué)習(xí)一下在AndroidStudio中如何來配置我們的Build文件,來完成一些特定的功能,進(jìn)行自定義構(gòu)建。本文將先從各個(gè)gradle文件入手,分析各個(gè)文件中,我們可以進(jìn)行哪些配置,這些配置又可以起到什么作用,如何通過gradle來滿足對(duì)于構(gòu)建的自定義需求。

AndroidStudio中Gradle文件  

 

我們新建一個(gè)Android項(xiàng)目,AndroidStudio會(huì)默認(rèn)為我們生成以下幾個(gè)文件,Project的構(gòu)建文件,Module的構(gòu)建文件,Project配置文件,混淆規(guī)則文件等,那么這些文件都具有什么功能,我們又可以進(jìn)行何種配置呢?

  • settings.gradle

include ':app'

新建的工程,默認(rèn)只有上述一條語句,用于指示 Gradle 在構(gòu)建應(yīng)用時(shí)應(yīng)將哪些模塊包括在內(nèi)。對(duì)大多數(shù)項(xiàng)目而言,該文件可能只有上述一條,但是當(dāng)我們項(xiàng)目中,引入了其它的功能module,或者業(yè)務(wù)邏輯module,就需要我們?cè)趇nclude語句中添加相應(yīng)的module。

  • build.gradle

build文件有兩個(gè),一個(gè)是針對(duì)我們的Module,一個(gè)是針對(duì)Project。

在Project中,默認(rèn)生成如下配置

  1. // Top-level build file where you can add configuration options common to all sub-projects/modules. 
  2.  
  3. buildscript { 
  4.     repositories { 
  5.         jcenter() 
  6.     } 
  7.     dependencies { 
  8.         classpath 'com.android.tools.build:gradle:2.2.3' 
  9.  
  10.         // NOTE: Do not place your application dependencies here; they belong in the individual module build.gradle files 
  11.     } 
  12.  

在Project的build文件中,我們可以來添加一些子module所共有的一些配置,而無需單獨(dú)在每一個(gè)子module中進(jìn)行配置??蛇M(jìn)行依賴倉庫是jcenter還是其它依賴倉庫等。在module中默認(rèn)生成的是對(duì)于我們的module自身構(gòu)建的時(shí)候進(jìn)行的一些配置選項(xiàng)。

  • gradle.properties

為gradle的配置文件,里面可以定義一些常量供build.gradle使用,如版本號(hào)等,當(dāng)隨著我們的業(yè)務(wù)增長,build文件也會(huì)變大,可維護(hù)性變差,當(dāng)我們想修改一些內(nèi)容的時(shí)候,需要逐個(gè)去找,但是,當(dāng)我們將其中的一些配置常量放置在一個(gè)單獨(dú)的文件中,相比之前,可維護(hù)性就有所提升。我們可以將構(gòu)建SDK版本等一些信息添加到該文件中。

  1. COMPILE_SDK_VERSION = 23BUILD_TOOLS_VERSION = 23.0.1VERSION_CODE = 1 

然后,我們就可以在build文件中進(jìn)行引用了。引用方式,直接通過變量名就可以。

配置構(gòu)建

  • 構(gòu)建類型

構(gòu)建類型定義 Gradle 在構(gòu)建和打包您的應(yīng)用時(shí)使用的某些屬性,通常針對(duì)開發(fā)生命周期的不同階段進(jìn)行配置。例如,調(diào)試構(gòu)建類型支持調(diào)試選項(xiàng),使用調(diào)試密鑰簽署 APK;而發(fā)布構(gòu)建類型則可壓縮、混淆 APK 以及使用發(fā)布密鑰簽署 APK 進(jìn)行分發(fā)。您必須至少定義一個(gè)構(gòu)建類型才能構(gòu)建應(yīng)用——Android Studio 默認(rèn)情況下會(huì)創(chuàng)建調(diào)試和發(fā)布構(gòu)建類型。要開始為應(yīng)用自定義打包設(shè)置,請(qǐng)學(xué)習(xí)如何配置構(gòu)建類型。

默認(rèn)構(gòu)建方式

  1. defaultConfig {        applicationId "com.chenjensen.gradlelearn" 
  2.         minSdkVersion 14 
  3.         targetSdkVersion 24 
  4.         versionCode 1 
  5.         versionName "1.0" 
  6.         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 

我們可以根據(jù)自己的需求,比如只針對(duì)發(fā)布的版本進(jìn)行混淆等操作,而對(duì)于debug版本不進(jìn)行,我們可以在buildType中進(jìn)行配置。

  1. buildTypes {        release {            minifyEnabled false 
  2.            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
  3.        }        debug { 
  4.             
  5.        } 
  6.   }  
  • 產(chǎn)品風(fēng)味

產(chǎn)品風(fēng)味代表您可以發(fā)布給用戶的不同應(yīng)用版本,例如免費(fèi)和付費(fèi)的應(yīng)用版本。您可以將產(chǎn)品風(fēng)味自定義為使用不同的代碼和資源,同時(shí)對(duì)所有應(yīng)用版本共有的部分加以共享和重復(fù)利用。產(chǎn)品風(fēng)味是可選項(xiàng),并且您必須手動(dòng)創(chuàng)建。我們可以在productFlavors {} 代碼塊中配置我們所需要的的設(shè)置。產(chǎn)品風(fēng)味支持與 defaultConfig 相同的屬性,這是因?yàn)?defaultConfig 實(shí)際上屬于 ProductFlavor 類。這意味著,您可以在 defaultConfig {} 代碼塊中提供所有風(fēng)味的基本配置,每種風(fēng)味均可替換任何默認(rèn)值,例如 applicationId。

ApplicationId用來作為我們的APK的包名,用來對(duì)于不同的包的區(qū)分,對(duì)于manifest中的package字段則是用來命名資源類的包名,***生成的 R 類文件位于該包下,如果其他包里面的代碼需要引用資源時(shí)可通過該路徑進(jìn)行調(diào)用。

例如

  1. productFlavors {        demo {            applicationId "com.example.myapp.demo" 
  2.             versionName "1.0-demo" 
  3.         } 
  4.         full {            applicationId "com.example.myapp.full" 
  5.             versionName "1.0-full" 
  6.         } 
  7.     }  

通過對(duì)于產(chǎn)品風(fēng)味的配置,我們可以針對(duì)不同的應(yīng)用市場(chǎng)發(fā)布不同的應(yīng)用包,針對(duì)不同的應(yīng)用包,我們可以進(jìn)行細(xì)致化到具體的SDK版本等的配置。采用的不同的應(yīng)用市場(chǎng)分發(fā),可以讓我們針對(duì)不同應(yīng)市場(chǎng)下發(fā)下的下載率的采集。

  • 依賴項(xiàng)

構(gòu)建系統(tǒng)管理來自您的本地文件系統(tǒng)以及來自遠(yuǎn)程存儲(chǔ)區(qū)的項(xiàng)目依賴項(xiàng)。這樣一來,您就不必手動(dòng)搜索、下載依賴項(xiàng)的二進(jìn)制文件包以及將它們復(fù)制到項(xiàng)目目錄內(nèi)。

Android中有三種添加依賴的方式

  1. //依賴我們本地的module 
  2. compile project(":mylibrary") //遠(yuǎn)程的二進(jìn)制依賴項(xiàng) 
  3. compile 'com.android.support:appcompat-v7:25.1.0' 
  4. //本地二進(jìn)制依賴方式,將檢測(cè)我們的本地的libs中的jar文件 
  5. compile fileTree(dir: 'libs', include: ['*.jar']) //javaTest依賴 
  6. testCompile 'junit:junit:4.12'     //AndroidTest依賴 
  7. androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'  

當(dāng)我們添加了一個(gè)依賴,該依賴還依賴了其它的依賴,而我們想把其中的一個(gè)依賴去掉,compile方法,可以接受一個(gè)閉包參數(shù),我們可以利用這個(gè)閉包來將其中的部分依賴剔出掉。

  1. androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
  2.         exclude group'com.android.support', module: 'support-annotations' 
  3.     })  

通過compile配置,Gradle 將此配置的依賴項(xiàng)添加到類路徑和應(yīng)用的 APK。除了compile配置,還有apk,provided。

  • apk

指定 Gradle 需要將其與應(yīng)用的 APK 一起打包的僅運(yùn)行時(shí)依賴項(xiàng)。您可以將此配置與 JAR 二進(jìn)制依賴項(xiàng)一起使用,而不能與其他庫模塊依賴項(xiàng)或 AAR 二進(jìn)制依賴項(xiàng)一起使用。

  • provided

指定 Gradle 不與應(yīng)用的 APK 一起打包的編譯時(shí)依賴項(xiàng)。如果運(yùn)行時(shí)無需此依賴項(xiàng),這將有助于縮減 APK 的大小。您可以將此配置與 JAR 二進(jìn)制依賴項(xiàng)一起使用,而不能與其他庫模塊依賴項(xiàng)或 AAR 二進(jìn)制依賴項(xiàng)一起使用。

  • 簽署

構(gòu)建系統(tǒng)可以在構(gòu)建配置中指定簽署設(shè)置,并可在構(gòu)建過程中自動(dòng)簽署您的 APK。構(gòu)建系統(tǒng)通過使用已知憑據(jù)的默認(rèn)密鑰和證書簽署調(diào)試版本,以避免在構(gòu)建時(shí)提示密碼。除非為此構(gòu)建顯式定義簽署配置,否則,構(gòu)建系統(tǒng)不會(huì)簽署發(fā)布版本。如果沒有發(fā)布密鑰,可以按簽署應(yīng)用中所述生成一個(gè)。由于調(diào)試證書通過構(gòu)建工具創(chuàng)建并且在設(shè)計(jì)上不安全,大多數(shù)應(yīng)用商店(包括 Google Play 商店)都不接受使用調(diào)試證書簽署要發(fā)布的 APK。

簽署的應(yīng)用

應(yīng)用升級(jí):當(dāng)系統(tǒng)安裝應(yīng)用的更新時(shí),它會(huì)比較新版本和現(xiàn)有版本中的證書。如果證書匹配,則系統(tǒng)允許更新。如果使用不同的證書簽署新版本,則必須為應(yīng)用分配另一個(gè)軟件包名稱 - 在此情況下,用戶將新版本作為全新應(yīng)用安裝。

應(yīng)用模塊化:Android 允許通過相同證書簽署的多個(gè) APK 在同一個(gè)進(jìn)程中運(yùn)行(如果應(yīng)用請(qǐng)求這樣),以便系統(tǒng)將它們視為單個(gè)應(yīng)用。通過此方式,可以在模塊中部署您的應(yīng)用,且用戶可以獨(dú)立更新每個(gè)模塊。

在您創(chuàng)建簽署配置時(shí),Android Studio 會(huì)以純文本形式將您的簽署信息添加到模塊的 build.gradle 文件中。如果是團(tuán)隊(duì)協(xié)作開發(fā)或者將您代碼開源,那么應(yīng)當(dāng)將此敏感信息從構(gòu)建文件中移出,以免被其他人輕易獲取。為此,創(chuàng)建一個(gè)單獨(dú)的屬性文件來存儲(chǔ)安全信息。然后在本地獲取外部文件的配置,然后在發(fā)布代碼的時(shí)候,保留我們的秘鑰配置文件。

  • 在項(xiàng)目的根目錄下創(chuàng)建一個(gè)名稱為 keystore.properties 的文件。
  1. storePassword=myStorePasswordkeyPassword=mykeyPasswordkeyAlias=myKeyAliasstoreFile=myStoreFileLocation 
  • 在模塊的 build.gradle 文件中,于 android {} 塊的前面添加用于加載 keystore.properties 文件的代碼
  1. def keystorePropertiesFile = rootProject.file("keystore.properties")// Initialize a new Properties() object called keystoreProperties.def keystoreProperties = new Properties()// Load your keystore.properties file into the keystoreProperties object.keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) 
  • 使用語法 keystoreProperties['屬性名稱'] 引用存儲(chǔ)在 keystoreProperties 中的屬性。修改模塊 build.gradle 文件的 signingConfigs 塊,以便使用此語法引用存儲(chǔ)在 keystoreProperties 中的簽署信息。
  1. android {    signingConfigs {        config {            keyAlias keystoreProperties['keyAlias'
  2.             keyPassword keystoreProperties['keyPassword'
  3.             storeFile file(keystoreProperties['storeFile']) 
  4.             storePassword keystoreProperties['storePassword'
  5.         } 
  6.     } 
  7.     ... 
  8.   }  
  • ProGuard

構(gòu)建系統(tǒng)讓您能夠?yàn)槊總€(gè)構(gòu)建變體指定不同的 ProGuard 規(guī)則文件。構(gòu)建系統(tǒng)可在構(gòu)建過程中運(yùn)行 ProGuard 對(duì)類進(jìn)行壓縮和混淆處理。代碼壓縮通過 ProGuard 提供,ProGuard 會(huì)檢測(cè)和移除封裝應(yīng)用中未使用的類、字段、方法和屬性,包括自帶代碼庫中的未使用項(xiàng)(這使其成為以變通方式解決 64k 引用限制的有用工具)。ProGuard 還可優(yōu)化字節(jié)碼,移除未使用的代碼指令,以及用短名稱混淆其余的類、字段和方法。混淆過的代碼可令您的 APK 難以被逆向工程。對(duì)于ProGuard更詳細(xì)的介紹可以參考之前關(guān)于項(xiàng)目構(gòu)建的文章。

開啟代碼壓縮

minifyEnabled true

啟用ProGuard規(guī)則

proguardFiles getDefaultProguardFile(‘proguard-android.txt'),

'proguard-rules.pro'

  1. getDefaultProguardFile(‘proguard-android.txt') 方法可從 Android SDK tools/proguard/ 文件夾獲取默認(rèn) ProGuard 設(shè)置。
  2. proguard-rules.pro 文件用于添加自定義 ProGuard 規(guī)則。默認(rèn)情況下,該文件位于模塊根目錄

每次執(zhí)行完成ProGuard之后,都會(huì)產(chǎn)生如下文件

  • dump.txtAPK 中所有類文件的內(nèi)部結(jié)構(gòu)。
  • mapping.txt提供原始與混淆過的類、方法和字段名稱之間的轉(zhuǎn)換。

seeds.txt

列出未進(jìn)行混淆的類和成員。

usage.txt

列出從 APK 移除的代碼。

這些文件保存在 <module-name>/build/outputs/mapping/release/。

對(duì)于其中一些類,我們不想對(duì)其進(jìn)行混淆的,需要我們?cè)赑roGuard 配置文件中添加一行 -keep 代碼。例如:

  1. -keep public class MyClass  
責(zé)任編輯:龐桂玉 來源: Android技術(shù)之家
相關(guān)推薦

2020-10-20 10:38:52

區(qū)塊鏈

2012-08-15 15:39:51

信息安全

2018-04-26 03:15:17

DevOps自動(dòng)化IT

2022-03-11 15:32:17

微信安卓應(yīng)用

2020-08-24 15:42:35

CIO軟件大眾汽車

2022-11-03 11:31:43

結(jié)構(gòu)分析法監(jiān)測(cè)

2021-01-26 05:13:12

錕斤拷String 二進(jìn)制

2017-04-10 13:43:34

AndroidGradleAS

2024-01-11 11:25:22

2024-07-03 10:09:29

2022-06-16 13:08:30

Combine響應(yīng)式編程訂閱

2022-03-04 09:28:29

代碼訪問者模式軟件開發(fā)

2021-02-05 09:00:00

開發(fā)IT事件管理

2011-05-07 14:05:30

投影屏幕投影機(jī)

2016-02-24 10:45:00

2017-02-27 08:37:01

2019-06-17 16:47:54

網(wǎng)絡(luò)協(xié)議DNS

2013-04-25 00:06:06

unity3D手機(jī)游戲引擎

2010-02-06 15:31:18

ibmdwAndroid

2009-07-22 14:55:16

ibmdwAndroid
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)