Android工程常用配置和開(kāi)發(fā)技巧

Android工程經(jīng)常需要做一些基本設(shè)置,如混淆、多版本、申請(qǐng)權(quán)限等,在這里做一下匯總,以便查閱。

目錄

Android Studio中直接運(yùn)行Java的main函數(shù)

Android Studio的快捷代碼(如psvm)

Activity樣式

MultiDex

混淆配置

AIDL接口

打包APK自動(dòng)改名

請(qǐng)求權(quán)限

數(shù)據(jù)庫(kù)

多版本及開(kāi)發(fā)測(cè)試

在debug時(shí)使用正式簽名

一些好用的插件

清理空間

自定義屬性

一些有趣的小問(wèn)題

Android Studio中直接運(yùn)行Java的main函數(shù)

很多時(shí)候,我們只想驗(yàn)證某些純Java的API,或驗(yàn)證某些語(yǔ)言特性,在Android端運(yùn)行這種代碼需要經(jīng)歷漫長(zhǎng)的編譯-安裝-運(yùn)行的過(guò)程,太慢,繁瑣,我們可以在AndroidStudio中直接運(yùn)行純Java的main函數(shù)(不能含有Android的API),有兩種方法可以做到。

1.在Android工程中即可運(yùn)行

可以直接運(yùn)行一個(gè)有main函數(shù)的Java文件。

其實(shí)只要新建一個(gè)Java文件,然后屏蔽頂部的package即可:

運(yùn)行main

注意只能處理純Java類,雖然可以調(diào)用Android的各種類如Activity,但是運(yùn)行時(shí)會(huì)報(bào)錯(cuò),因?yàn)槿鄙俑鞣N環(huán)境。

另外,這種用法有個(gè)缺陷:有點(diǎn)慢,會(huì)走gradle編譯(permission:assemble debug),不過(guò)比編譯App要好多了。

2.在Java Library中運(yùn)行

這種做法稍微復(fù)雜,但可以運(yùn)行一整個(gè)Module模塊。

具體需要先新建一個(gè)Java libaray的Module。

新建Module
選擇Java Library
設(shè)置Module的運(yùn)行方式
添加Application

然后配置運(yùn)行方式去運(yùn)行這個(gè)Module

配置Main class

配置時(shí)注意兩點(diǎn):

1.選好Main class,一直選到class文件

2.在Use classpath of module中,選擇lib

最后就可以像運(yùn)行App那樣去運(yùn)行它了

運(yùn)行即可

這種運(yùn)行方式速度較快,而且是以Module為單位運(yùn)行的,可以實(shí)現(xiàn)一些復(fù)雜的邏輯。


參考:android studio編寫(xiě)運(yùn)行java main的三種方法(親測(cè))

Android Studio的快捷代碼(如psvm)

Android Studio脫胎于IntelliJ IDEA,后者支持通過(guò)特定字母組合打出特定代碼段,大大加快我們寫(xiě)B(tài)ug(誤)的速度,例如:

psvm可以輔助打出main函數(shù):

psvm

sout可以輔助打出print函數(shù)

sout

這些可以在setting中通過(guò)live templates配置

配置live templates


Activity樣式

Activity可以配置很多樣式,例如可以隱藏頂部狀態(tài)欄,不顯示頂部狀態(tài)欄即為全屏,有兩種設(shè)置方式:

1.在style.xml中定義一個(gè)樣式,并在manifest文件中使用(針對(duì)整個(gè)app)。

定義全屏樣式
在manifest中設(shè)置theme

2.在activity代碼中設(shè)置屬性(僅針對(duì)單個(gè)activity)。

代碼設(shè)置全屏

MultiDex

App打包的dex有函數(shù)數(shù)量上限,app越做越大,就很容易超限,需要配置為multidex,在打包時(shí)把一個(gè)dex拆分為多個(gè),規(guī)避數(shù)量上限問(wèn)題。

google官方給出了配置方式,需要在gradle中引入multidex,并讓app繼承multidexapplilcation。

在gradle中引用multidex
在gradle中啟用multidex

如果你的Application已經(jīng)繼承了其他的Applicatioin,你可以在你的Applicatioin里override一下attachBaseContext(),調(diào)用MultiDex.install(this)來(lái)支持multidex。

繼承multidexapplication

(其實(shí)在Android里,很多情況下都需要你extend其他Application,這就限制了我們自己對(duì)Application的擴(kuò)展方式,如果我們想自己抽象一些Application的行為,最好是使用接口和依賴注入方式去實(shí)現(xiàn),這樣耦合度低,容易擴(kuò)展應(yīng)用)

在manifest文件中使用繼承的multidexapplication

混淆

apk打包時(shí)都需要混淆,這可以防止別人根據(jù)你的apk安裝包逆向讀懂你的代碼,注意是讀懂,他還是能讀到代碼的,但是里面的變量和類名都會(huì)變成a、b、c這樣毫無(wú)意義的東西。

使用混淆的配置如下:

在gradle中啟用混淆
打開(kāi)項(xiàng)目對(duì)應(yīng)的proguard文件
制定混淆策略,說(shuō)明哪些類不混淆

AIDL

AIDL跨進(jìn)程通信是app間調(diào)用的手段,主要是通過(guò)引用接口和bind到serviceconnection實(shí)現(xiàn)的。

引用對(duì)應(yīng)的接口文件及其package
寫(xiě)一個(gè)serviceconnection去bind目標(biāo)aidl
用intent去bindservice,需要傳入aidl提供方約定的名稱

然后就可以通過(guò)serviceconnection去調(diào)用aidl接口中提供的函數(shù)了

打包APK自動(dòng)改名

我們提交apk時(shí),需要給apk文件改名字,加上版本號(hào),生成日期等,以便溝通和管理,這個(gè)工作可以在gradle里配置一下,自動(dòng)完成。

打包apk時(shí)自動(dòng)帶上版本號(hào)和日期

請(qǐng)求權(quán)限

Android把權(quán)限分的很細(xì),需要什么都需要在manifest文件中去配置

配置權(quán)限

但是Android現(xiàn)在對(duì)權(quán)限管理越來(lái)越嚴(yán)格了,很多權(quán)限不只需要manifest中配置,還需要用戶打開(kāi)app時(shí)手動(dòng)確認(rèn),這需要在代碼中動(dòng)態(tài)檢查和申請(qǐng)權(quán)限。

動(dòng)態(tài)檢查和請(qǐng)求權(quán)限

不止要申請(qǐng)權(quán)限,因?yàn)橛脩艨赡芫芙^申請(qǐng),所以還需要監(jiān)聽(tīng),在提出申請(qǐng)的Activity中,覆寫(xiě)指定函數(shù),去監(jiān)聽(tīng)用戶的處理結(jié)果。

監(jiān)聽(tīng)用戶對(duì)權(quán)限申請(qǐng)的處理
處理權(quán)限申請(qǐng)的結(jié)果

數(shù)據(jù)庫(kù)

Android中有很多數(shù)據(jù)庫(kù)可用,例如原始的SQLite,能自動(dòng)生成數(shù)據(jù)庫(kù)的GreenDao,最近很火性能不錯(cuò)的Realm等。

這里先記錄一下greendao的應(yīng)用,首先在gradle中添加引用并配置生成策略,然后用注解的方式編寫(xiě)數(shù)據(jù)表的類文件,寫(xiě)完后build一下工程,greendao就會(huì)自動(dòng)生成數(shù)據(jù)庫(kù)相關(guān)文件

引用greendao
在gradle中設(shè)置相關(guān)策略
注解編寫(xiě)數(shù)據(jù)表的類文件
編譯項(xiàng)目后,自動(dòng)生成數(shù)據(jù)庫(kù)相關(guān)文件

多版本及開(kāi)發(fā)測(cè)試

AS支持多版本發(fā)布,可以同時(shí)生成多個(gè)不同渠道的apk,不過(guò)速度不是很快。

關(guān)于多渠道打包,可以參考《Gradle多渠道打包的原理、實(shí)踐與輔助開(kāi)發(fā)》

個(gè)人更喜歡用多版本來(lái)方便開(kāi)發(fā),在mock版本中模擬各種數(shù)據(jù),測(cè)試業(yè)務(wù)場(chǎng)景,同時(shí)不對(duì)prod正式版造成任何影響。

配置過(guò)程如下:

在gradle中定義多版本

(多版本還可以幫助加速調(diào)試,你要為不同的版本配置不同的minSdkVersion,例如在開(kāi)發(fā)的mock里設(shè)置minSdkVersion=21,這樣在運(yùn)行mock版本時(shí)編譯速度更快)

在project視圖下,為各版本編寫(xiě)不同的內(nèi)容
在build variants中,切換版本進(jìn)行編輯調(diào)試

搭好了多版本開(kāi)發(fā)的基本架子,接下來(lái)就可以用多版本去輔助開(kāi)發(fā),例如,在mock開(kāi)發(fā)版本中增加一個(gè)功能,即啟動(dòng)時(shí)清空數(shù)據(jù)庫(kù),同時(shí)prod正式版中沒(méi)有這個(gè)特性。

在所有版本中增加一個(gè)Mock專用的類

可以在所有版本中增加一個(gè)類,啟動(dòng)時(shí)調(diào)用這個(gè)類的函數(shù)。

調(diào)用mock類

這個(gè)函數(shù)僅在mock版本中實(shí)現(xiàn),在prod版本中,只是一個(gè)空函數(shù),這樣既能實(shí)現(xiàn)mock版本的特殊功能,又不會(huì)干擾到prod版本,最重要的是,發(fā)布前不需要改代碼。

在debug時(shí)使用正式簽名

按照一般的工程慣例,AS在開(kāi)發(fā)時(shí)使用一個(gè)臨時(shí)的apk簽名,在release時(shí)使用另一個(gè)正式的簽名,這樣可以很好地把開(kāi)發(fā)和發(fā)布區(qū)分開(kāi),也能很好地保護(hù)app產(chǎn)品。

但是,在實(shí)際開(kāi)發(fā)過(guò)程中,經(jīng)常需要在debug時(shí)會(huì)使用正式簽名,例如,聯(lián)調(diào)第三方庫(kù),或者在已經(jīng)安裝了正式版的設(shè)備上調(diào)試app,這時(shí)如果使用臨時(shí)apk簽名的話,簽名會(huì)被拒絕,無(wú)法調(diào)試。

這時(shí),我們可以通過(guò)gradle配置,在debug時(shí)使用正式簽名,具體方法如下:

在gradle里配置signingConfigs項(xiàng)

注意,storefile這個(gè)參數(shù)里指向的路徑,需要放一個(gè)正式簽名的jks文件。

在defaultConfig下,增加signingConfig項(xiàng)
在buildTypes下,分布為release和debug設(shè)置使用的簽名

這樣,在debug時(shí)也可以使用正式的apk簽名,可以更方便地去調(diào)試了。

一定注意,在上線的時(shí)候要?jiǎng)h除掉這個(gè)簽名文件,并且注釋掉這段話!

一些好用的插件

1.GsonFormat 在AS上使用

可以方便地把json字符串映射為對(duì)應(yīng)的Java數(shù)據(jù)對(duì)象

2.JSONView 在Chrome上使用

json字符串結(jié)構(gòu)化顯示

3.Octotree 在Chrome上使用

在github網(wǎng)站上能像在IDE一樣查看源碼

4.Postman 在Chrome上使用

監(jiān)聽(tīng)和發(fā)起網(wǎng)絡(luò)請(qǐng)求

5.Advertising Terminator 在Chrome上使用

屏蔽廣告

6.Click&Clean 在Chrome上使用

分類查找和清理緩存

更多插件見(jiàn):吐血推薦珍藏的 Chrome 插件

清理空間

Android Studio長(zhǎng)期運(yùn)行下來(lái),很容易積累起十多個(gè)G的垃圾數(shù)據(jù),而且是在C盤(pán),清理方法如下:

打開(kāi)C:\Users\{你的用戶}\AppData\Local\Temp

清空

實(shí)際上,C:\Users\用戶名\AppData里面一般有三個(gè)文件夾,分別是Local,LocalLow,Roaming,簡(jiǎn)單地來(lái)說(shuō),都是用來(lái)存放軟件的配置文件和臨時(shí)文件的,里面有很多以軟件名稱或軟件公司命名的文件夾,理論上都可以刪除。

代碼檢查

Android Studio提供了不錯(cuò)的Analyze工具,可以從代碼級(jí)別自動(dòng)幫你排查冗余、泄漏、SDK版本兼容等問(wèn)題,平時(shí)可以多運(yùn)行一下Analyze->Inspect Code

自定義屬性

Android允許自定義控件屬性,關(guān)鍵字declare-styleable,需要增加res/mystyle.xml文件,屬性內(nèi)容如下:

自定義屬性

formate可以允許多種類型,如 format = "reference|color",就是既允許填引用@drawable/xxx,又允許直接填顏色值#00FF00

如果某個(gè)attr是需要選擇一個(gè)數(shù)據(jù)填入的,如 android:gravity="top",還需要定義flag <flag name="oldman"value="60" />

declare-styleable中的name是為自定義控件的代碼準(zhǔn)備的,代碼根據(jù)這個(gè)名字找到自定義屬性:

代碼找到自定義的屬性值

在xml文件中引用時(shí),需要寫(xiě)一個(gè)xml的命名空間,用來(lái)引用自定義的屬性:

xml命名空間

然后,在下面的控件中,就可以根據(jù)命名空間levideoview來(lái)配置自定義參數(shù)了。

更多內(nèi)容可參考declare-styleable的使用(自定義控件) 以及declare-styleable中format詳解

一些有趣的小問(wèn)題

·關(guān)于MAC中找不到SDK文件夾的問(wèn)題

需要在Users/用戶名/ 這個(gè)文件夾下,右鍵,“查看顯示選項(xiàng)”,勾選“顯示資源庫(kù)文件夾”,這樣就可以看到用戶目錄下的Library文件夾,SDK的路徑就在Library/Android/SDK中

查看資源文件夾

·MAC中使用adb的問(wèn)題

Mac裝完AS后,不能直接使用adb,會(huì)報(bào)無(wú)效命令,需要步驟如下

1.打開(kāi)終端,如下命令:

yourMacBook-Pro:~ you$ echo $HOME

/Users/you

yourMacBook-Pro:~ you$ touch .bash_profile

yourMacBook-Pro:~ you$ open -e .bash_profile

打開(kāi)bash文件

2.bash文件默認(rèn)為空,在文件中填寫(xiě)你的Android SDK的tools地址,然后保存文件

export PATH=${PATH}:/Users/you/Library/Android/sdk/platform-tools:/Users/you/Library/Android/sdk/tools

3.回到終端,刷新bash

yourMacBook-Pro:~ you$ source .bash_profile

搞定,可以用adb了

·關(guān)于MAC中配置API Source的問(wèn)題

默認(rèn)情況下,查看Android API部分的源碼,只能看到函數(shù)的參數(shù)和范圍,看不到代碼細(xì)節(jié),需要配置API Source源碼。

最簡(jiǎn)單的做法是,在彈出的提示框中,選擇download:

下載API源碼

然后關(guān)閉AS再重新打開(kāi)即可。

·關(guān)于R中的String換行問(wèn)題

1.對(duì)齊問(wèn)題

我們知道,R中定義String換行,都要用\n,例如XXX\nYYY,就會(huì)把X和Y分成兩行去輸出

不過(guò),我們會(huì)發(fā)現(xiàn),為了閱讀方便,我們更習(xí)慣在string.xml中這樣定義:

XXX\n

YYY

乍看起來(lái)沒(méi)有問(wèn)題,但如果你把這樣的String輸出到界面上,你會(huì)發(fā)現(xiàn),這兩行

沒(méi)對(duì)齊!

第二行YYY前面多了半個(gè)空字符。

如果把\n放到第二行呢?

XXX

\nYYY

這次對(duì)齊了!實(shí)際上,你把TextView的邊框畫(huà)出來(lái),做個(gè)對(duì)比,就會(huì)發(fā)現(xiàn),手動(dòng)換行產(chǎn)生的那個(gè)空字符,換到了XXX的末尾,只不過(guò)平時(shí)看不出來(lái)罷了

2.\n變\\n問(wèn)題

前后臺(tái)交互時(shí)、用Intent傳數(shù)據(jù)時(shí),經(jīng)常會(huì)發(fā)現(xiàn)\n被轉(zhuǎn)義成了\\n,而且是各種環(huán)境自動(dòng)轉(zhuǎn)的。

所以,在收到傳送來(lái)的\n時(shí),先檢查一下有沒(méi)有\(zhòng)\n是一種什么行為?

是一種受慣了傷害,形成條件反射的行為啊。

·編譯時(shí)在style里應(yīng)用了Theme.AppCompat.Light.DarkActionBar,出現(xiàn)No resource found that matches the given name的問(wèn)題

因?yàn)檫@個(gè)主題實(shí)在appcomat v7里引用的,如果你的app版本較低(最低兼容版本),就需要顯式地引用appcompat v7,在gradle里添加compile'com.android.support:appcompat-v7:23.4.0'

即可解決問(wèn)題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容