最近完成的AndroidStudio項目實現思路及應用技術


 

主要內容:

  • Android Studio的介紹
  • AS中個Gradle及Groovy介紹
  • AS中的依賴管理
  • Maven以及Nexus私庫管理依賴
  • Gradle對變種代碼的管理以及多渠道打包
  • eclipse工程遷移至AS
  • AS配置NDK工程
  • AS的優化配置

1. Android Studio的介紹

1.1 簡介

Android Studio 是基於 IntelliJ IDEA 的官方 Android 應用開發集成開發環境 (IDE)。 除了 IntelliJ 強大的代碼編輯器和開發者工具,Android Studio 提供了更多可提高 Android 應用構建效率的功能 
- 基於 Gradle 的靈活構建系統 
- 快速且功能豐富的模擬器(包括視圖預覽) 
- 可針對所有 Android 設備進行開發的統一環境 
- Instant Run,可將變更推送到正在運行的應用,無需構建新的 APK 
- 可幫助您構建常用應用功能和導入示例代碼的代碼模板和 GitHub 集成 
- 豐富的測試工具和框架 
- 可捕捉性能、易用性、版本兼容性以及其他問題的 Lint 工具 
- C++ 和 NDK 支持

Android Studio 一個在IDEA(IntelliJ IDEA)基礎上開發的針對Android平台的專用開發工具,用來代替Eclipse以及其他平台的的IDE,同時又提供了一系列統一且高效的工程構建工具降低了APP開發難度,提高開發效率

1.2 Android Studio 與 ADT的比較

區別 ADT Android Studio
平台 依附於Eclipse的Android開發插件 Android開發專用的官方統一平台
編譯系統 基於Ant的編譯系統 基於Gradle的編譯系統
功能開發 針對Java開發的提示 更加智能和方便,視覺更加美觀
視圖布局 UI預覽非實時 實時UI預覽
目錄結構 基於功能邏輯的工程目錄區分工作空間 以構建(build)、代碼邏輯(src)等划分工程目錄,只有project和Modules
調試 \ 5.0以上的 instance run
NDK開發 NDK問題多 更方便的進行NDK開發以及斷點調試

穩定后的Android Studio 在SDK以及工具插件的下載上有很大提升,不需要進行FQ就可以進行更新,今年專門針對中國開發者的網站也上線,可以方便的獲取到Android以及Android Studio的資料(Google 開發者

2. AS中個Gradle及Groovy介紹

2.1 為什么使用Gradle

在ADT時代,eclipse的Android的構建時基於Ant的,在Android Studio 中使用的新的構建工具Gradle。Ant中是通過xml定義控制流程的,閱讀和書寫不方便

Ant/Maven -> Gradle

Apk打包流程:

image <ignore_js_op>

 

Gradle使用了Groovy語言來描述依賴和控制流程,同時繼承Ant的流程控制和Maven的依賴管理。使用的Groovy語言是一種運行與JVM的腳本語言,和kotlin類似.

2.3 Gradle項目的結構

<ignore_js_op>


項目中是Project和Module來組織的,一個Project中包含了一個或多個Module。Project中會有一個build.gradle文件,同時包含了一個setting.gralde文件,而Module中只會包含一個gradle.build文件。 
- setting.gradle: 管理多個Module的情況,定義哪些Module需要加入Project編譯過程 
- build.gradle: 具體控制編譯的流程和項目的依賴以及配置。如果是Project中頂層的build.gradle其中的配置則是全局的,Module中的build.gradle會覆蓋頂層的配置

 

build.gradle中的一些配置: 
- 頂層build.gradle 中的buildscript:表示配置編譯工具的引用路徑(版本) 
- 頂層build.gradle allproject:在這個閉包中的配置表示所有的Project對象中都會應用到,但會被子模塊覆蓋 
- 模塊中的build.gradle 
- apply plugin : gradle插件需要配置為那種類型(’com.android.application’或’com.android.library’) 
- android :plugin中提供的關於工程運行的Android環境的配置 
- buildTypes :編譯類型 
- productFlavors : 產品風格 
- dependencies : 依賴配置

2.4 Task

在Gradle中代表構建過程中的一系列操作,一個Task中包含了多個Action,Action之間有順序關系。Task執行構建過程中的特定步驟,它們之間相互依賴就會按順序執行,沒有依賴的會先被執行。

定義一個Task:

<ignore_js_op>


Task中附加Action:

 

<ignore_js_op>

 

四個基本的 task

Android 繼承他們分別進行了自己的實現:

  • assemble:對所有的 buildType 生成 apk 包。
  • clean:移除所有的編譯輸出文件,比如apk
  • check:執行lint檢測編譯。
  • build:同時執行assemble和check命令

<ignore_js_op>

 

在AS中的Gradle project視圖中可以看到當前Project中的所有Task,這里我們可以全部執行也可以指定Task執行

由於Gradle使用的是Groovy語言來描述編譯過程的,而Groovy支持Java的腳本語言,所有以上的配置都可以找到對應的Java描述。同時Groovy的閉包和簡單的定義方式使得Groovy可以作為Java的一種替代,在能夠使用Java的地方就可以使用Groovy 
科關於Groovy的參考)

2.5 Groovy

>

是用於Java虛擬機的一種敏捷的動態語言,它是一種成熟的面向對象編程語言,既可以用於面向對象編程,又可以用作純粹的> > 腳本語言。使用該種語言不必編寫過多的代碼,同時又具有閉包和動態語言中的其他特性。

閉包的概念:

由 { } 封閉的結構,可以理解為內部類,同時閉包支持lambda的表達形式,所以可以將代碼做到很簡化閱讀清晰,同時更像一個配置

舉例:


// 之前寫法
def double(def num) {
num * num
}
// 使用lambda表達式
def double = { num ->
2*num
}
// 簡化(只有一個參數的情況),it會默認替代這個參數,同時最后一行表示當前的返回值
{it*it}

在Gradle文件中的體現:

apply plugin: 'com.android.application'

dependencies {
compile files('libs/commons-io-2.4.jar')
}

完整表達:

// 提交一個map集合,里面只有一個對象
project.apply([plugin:'com.android.application'])

project.dependencies({
Dependency function">add('compile files', 'libs/commons-io-2.4.jar');
})

Groovy參考

64K問題

64K問題(65536問題) 
Delvik虛擬機指令集使用了16位寄存器來存儲方法數量,在較大工程中方法數量會超過65536,導致無法保存。 
但是在Android 5.0系統以上使用了Android Run Time新的虛擬機,所以在5.0以上系統不會出現64k問題 
目前的解決方案 
- 開啟ProGuard中的清除無用方法的配置 
- 使用 Multidex Support Library 進行分包處理(AndroidSutdio自身使用這樣的機制)

Multidex資料

3. AS中的依賴管理

在Android工程中或者其他工程中,工程之間相互引用是很常見的。Java工程里在Ant時代是通過jar包的方式進行引用的,如果被引用的工程發生改變就必須重新給出一份jar到其他引用的工程,為此后面出現的Maven倉庫通過遠程引用的方式不在本地使用jar包,而是通過arr方式將引用存放於網絡,解決了jar不同步的問題。但是Maven的優勢在於管理依賴,而Ant的優勢在於控制構建過程,Gradle的出現同時利用了兩者的優勢,基於Groovy腳本語言同時又可以支持Maven倉庫的的引用。

4. Maven以及Nexus私庫管理依賴

在Gradle中編譯方式有三種類型 
1. Compile 編譯到apk 中 
2. provider 只引用不編譯到apk中 
3. apk 以apk方式引用

<ignore_js_op>

 

又有工程引用、arr引用、jar引用、Maven倉庫、本地.so庫引用等引用方式

// 引用.so庫,默認是在src/main/jniLibs下
android{
sourceSets.main{
jniLbs.srcDir('/libs')
}
}
dependencies{
compile library //引用項目時,項目要是 以'com.android.library'配置的模塊
compile file
compile '組織group:庫名稱目:artifact:版本version' 通過Maven倉庫引用
compile(name: 'FileSelector-release', ext: 'aar') // 單個項目文件
}
    // 多個arr項目時
repositories{
flatDir{
dirs'arrs' // 在項目中建立arrs文件夾存放arrs項目
}

}

如果是引用私庫則需要配置倉庫位置

    repositories {
jcenter()
maven {
// 自己的Maven私庫
url "http://192.168.8.110:8081/repository/maven-public/"
}

}

5. Gradle對變種代碼的管理以及多渠道打包

App的開發避免不了需要將App打包成Apk文件發布到應用市場,再單一的應用分發的市場中,如IOS只有一個應用分發市場的情況下只用一個發布一個Apk包就可以了,但是在Android平台上各類分發市場以及定義的渠道都會需要有一個Apk包,甚至風格和內容會有大的區別。為了解決這個問題Gradle中內置了BuildType以及productFlavor,甚至自己通過Groovy來批量定義配置

5.1 Build Variant 變種

<ignore_js_op>

 

  • BuildType 
    BuildType是Gradle中表示構建類型的類,其中定義了構建過程中的各種配置,例如 minifyEnabled(開啟混淆),proguardFiles(混淆配置),signingConfig(簽名配置)

  • productFlavor 
    productFlavor表示產品的風格,更加具體到了構建的配置了,通過和BuildType進行組合形成了不同的Apk包

  • resValue 會定義到generated.xml以字符串資源的形式保存

// 自動生成string資源
resValue 'string', 'style', 'free'

會自動生成generated資源文件 
<ignore_js_op>

 

  • buildConfigField會定義到BuildConfig的java類文件中
//這里添加的類型是在Java文件中的,需要表示成java
buildConfigField 'String','build_style',"\"free\""

自動生成的buildConfig.java

<ignore_js_op>

 

  • 通過manifestPlaceholders 替換Manifest中Meta-Data標志位方式
manifestPlaceholders = ['meta_data_type':"free"]

<ignore_js_op>

 

5.2 批量打渠道包

App在發布前一般要打特別多的渠道,同時需要按照約定的規則保存到指定位置給后台批量發布到對應應用市場,所以在這種情況下使用自動化工具進行批量生產Apk是必不可少的。

<ignore_js_op>

 

上面說的BuildType和productFlavor可實現多風格的Apk,但是如果單獨進行配置是無法達到成百的渠道的需求的。所以最好的解決辦法是利用Groovy控制不同風格的構建。

實現的思路: 
過去在使用Ant情況下將渠道id配置在Manifest文件中的meta-data標簽下,通過判斷渠道id來做區分,因為Manifest文件不會在構建Apk時被編譯為.class文件。現在的思路類似,不同的是使用Gradle可以將這樣的配置存放到字符資源文件,甚至Gradle自動生成的BuildConfig配置文件中,使得可以向Java一樣讀取這個屬性。

源碼的apk">5.3 打不同源碼的Apk

在Android工程開發中比較容易出現這樣的情況,同樣一個App但是在源碼上需要區分不同的版本,例如一個是免費版,一個是付費版,框架相同,但是針對不同的版本同一界面有不同的功能,甚至連App的都需要可以同時安裝。這種情況在過去需要做復雜的判斷,甚至需要重新復制一個工程專門針對版本來修改代碼,造成維護困難。在Gradle中使用buildFlavor將源碼按照風格配置編譯的源碼就可以實現,

<ignore_js_op>

 

5.3.1 配置過程

  1. 在Build Flavor中配置 free 和 pay兩種風格(BuildFlavor中默認有main的風格)
  2. 在src文件夾下雨main同級建立相同目錄結構的包,放入有區別的類文件

多風格apk打包中的不同風格源碼的類不能重復,而資源中可以重復到元素一級 
使用productFlavor,源碼在不同風格中與mian中類名不沖突,但不同風格中的類可相同,且可替換(多版本不同代碼)

Gradle構建多源碼工程

6. eclipse工程遷移至AS

過去通過ADT——在Eclipse上的Android開發工具插件創建的工程是按照Java工程的方式建立的目錄結構,如果需要遷移到AS上時有兩種方式,1.使用AS直接導入,結構目錄轉換為AS結構;2.使用Eclipse到處為Gradle工程,再使用AS導入進一步配置。一般情況開發需要在轉換以后同時兼容到Eclipse,所以使用第二種方式進行遷移。

在AS中工程默認是以Gradle工程方式識別源碼文件和資源文件,如果導入Eclipse工程,這需要重新配置源碼文件和資源文件的文件位置。

<ignore_js_op>

 

在sourcesets中添加對應BuildFlavor類型的源碼和資源等文件集合的位置

7. AS配置NDK工程

Android上的NKD工程再AS中的支持比Eclipse要完整,Gradle有簡便的配置方式就可以集成NDK工程

注意:第一次導入工程的時候AS會以默認的gradle版本來首次構建工程,但是很多情況下是舊版本構建,所以通過指定AS的Gradle版本為最新版再次編譯則會比較順利。

  1. 指定NDK(NDK版本最好用最用最新的)
  2. 配置NDK插件

使用AS開發NDK的一個優勢是可以直接通過AS進行C或C++代碼調試(需要LLDB插件)

<ignore_js_op>

 

相關方法:

ndk {
// 輸出模塊的名稱
moduleName "libmbengine"
abiFilters "armeabi-v7a"
}
jniLibs.srcDir "/libs"
externalNativeBuild {
ndkBuild {
path file("/Android.mk")
}
}

8. AS的優化配置

AS上的Gradle到目前為止已經做了很大的優化,但是在編譯工程的時候還是會比較緩慢,但進行適當的配置可以加快構建的過程,充分利用機器的性能。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



java應用技術 1(2) java應用技術 2(3) 鈎子應用技術 JavaBean編程應用技術 混合應用技術選型 視訊應用技術分析 Android之MaterialDesign應用技術 QLineEdit的應用技術整理 JavaBean編程應用技術 LDAP應用技術簡述
 
粤ICP备14056181号  © 2014-2020 ITdaan.com