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即可:
注意只能處理純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。
然后配置運(yùn)行方式去運(yùn)行這個(gè)Module
配置時(shí)注意兩點(diǎn):
1.選好Main class,一直選到class文件
2.在Use classpath of module中,選擇lib
最后就可以像運(yùn)行App那樣去運(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ù):
sout可以輔助打出print函數(shù)
這些可以在setting中通過(guò)live templates配置
Activity樣式
Activity可以配置很多樣式,例如可以隱藏頂部狀態(tài)欄,不顯示頂部狀態(tài)欄即為全屏,有兩種設(shè)置方式:
1.在style.xml中定義一個(gè)樣式,并在manifest文件中使用(針對(duì)整個(gè)app)。
2.在activity代碼中設(shè)置屬性(僅針對(duì)單個(gè)activity)。
MultiDex
App打包的dex有函數(shù)數(shù)量上限,app越做越大,就很容易超限,需要配置為multidex,在打包時(shí)把一個(gè)dex拆分為多個(gè),規(guī)避數(shù)量上限問(wèn)題。
google官方給出了配置方式,需要在gradle中引入multidex,并讓app繼承multidexapplilcation。
如果你的Application已經(jīng)繼承了其他的Applicatioin,你可以在你的Applicatioin里override一下attachBaseContext(),調(diào)用MultiDex.install(this)來(lái)支持multidex。
(其實(shí)在Android里,很多情況下都需要你extend其他Application,這就限制了我們自己對(duì)Application的擴(kuò)展方式,如果我們想自己抽象一些Application的行為,最好是使用接口和依賴注入方式去實(shí)現(xiàn),這樣耦合度低,容易擴(kuò)展應(yīng)用)
混淆
apk打包時(shí)都需要混淆,這可以防止別人根據(jù)你的apk安裝包逆向讀懂你的代碼,注意是讀懂,他還是能讀到代碼的,但是里面的變量和類名都會(huì)變成a、b、c這樣毫無(wú)意義的東西。
使用混淆的配置如下:
AIDL
AIDL跨進(jìn)程通信是app間調(diào)用的手段,主要是通過(guò)引用接口和bind到serviceconnection實(shí)現(xiàn)的。
然后就可以通過(guò)serviceconnection去調(diào)用aidl接口中提供的函數(shù)了
打包APK自動(dòng)改名
我們提交apk時(shí),需要給apk文件改名字,加上版本號(hào),生成日期等,以便溝通和管理,這個(gè)工作可以在gradle里配置一下,自動(dòng)完成。
請(qǐng)求權(quán)限
Android把權(quán)限分的很細(xì),需要什么都需要在manifest文件中去配置
但是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)限。
不止要申請(qǐng)權(quán)限,因?yàn)橛脩艨赡芫芙^申請(qǐng),所以還需要監(jiān)聽(tīng),在提出申請(qǐng)的Activity中,覆寫(xiě)指定函數(shù),去監(jiān)聽(tī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)文件
多版本及開(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ò)程如下:
(多版本還可以幫助加速調(diào)試,你要為不同的版本配置不同的minSdkVersion,例如在開(kāi)發(fā)的mock里設(shè)置minSdkVersion=21,這樣在運(yùn)行mock版本時(shí)編譯速度更快)
搭好了多版本開(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è)類,啟動(dòng)時(shí)調(diào)用這個(gè)類的函數(shù)。
這個(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í)使用正式簽名,具體方法如下:
注意,storefile這個(gè)參數(shù)里指向的路徑,需要放一個(gè)正式簽名的jks文件。
這樣,在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)引用自定義的屬性:
然后,在下面的控件中,就可以根據(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:
然后關(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)題