Android工程常用配置和開發技巧

安卓開發高階技術分享發表於2019-01-17

Android工程經常需要做一些基本設定,如混淆、多版本、申請許可權等,在這裡做一下彙總,以便查閱。

目錄

  • Android Studio中直接執行Java的main函式
  • Android Studio的快捷程式碼(如psvm)
  • Activity樣式
  • MultiDex
  • 混淆配置
  • AIDL介面
  • 打包APK自動改名
  • 請求許可權
  • 資料庫
  • 多版本及開發測試
  • 在debug時使用正式簽名
  • 一些好用的外掛
  • 清理空間
  • 自定義屬性
  • 一些有趣的小問題

Android Studio中直接執行Java的main函式

很多時候,我們只想驗證某些純Java的API,或驗證某些語言特性,在Android端執行這種程式碼需要經歷漫長的編譯-安裝-執行的過程,太慢,繁瑣,我們可以在AndroidStudio中直接執行純Java的main函式(不能含有Android的API),有兩種方法可以做到。

1.在Android工程中即可執行

可以直接執行一個有main函式的Java檔案。

其實只要新建一個Java檔案,然後遮蔽頂部的package即可:

 

 

注意只能處理純Java類,雖然可以呼叫Android的各種類如Activity,但是執行時會報錯,因為缺少各種環境。

另外,這種用法有個缺陷:有點慢,會走gradle編譯(permission:assemble debug),不過比編譯App要好多了。

2.在Java Library中執行

這種做法稍微複雜,但可以執行一整個Module模組。

具體需要先新建一個Java libaray的Module。

選擇Java Library

設定Module的執行方式

新增Application

 

然後配置執行方式去執行這個Module

 

配置時注意兩點:

1.選好Main class,一直選到class檔案

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

最後就可以像執行App那樣去執行它了

執行即可

這種執行方式速度較快,而且是以Module為單位執行的,可以實現一些複雜的邏輯。

 

參考:android studio編寫執行java main的三種方法(親測)

Android Studio的快捷程式碼(如psvm)

Android Studio脫胎於IntelliJ IDEA,後者支援通過特定字母組合打出特定程式碼段,大大加快我們寫Bug(誤)的速度,例如:

psvm可以輔助打出main函式:

 

sout可以輔助打出print函式

 

這些可以在setting中通過live templates配置

 

 

Activity樣式

Activity可以配置很多樣式,例如可以隱藏頂部狀態列,不顯示頂部狀態列即為全屏,有兩種設定方式:

1.在style.xml中定義一個樣式,並在manifest檔案中使用(針對整個app)。

在manifest中設定theme

 

2.在activity程式碼中設定屬性(僅針對單個activity)。

 

MultiDex

App打包的dex有函式數量上限,app越做越大,就很容易超限,需要配置為multidex,在打包時把一個dex拆分為多個,規避數量上限問題。

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

在gradle中啟用multidex

 

如果你的Application已經繼承了其他的Applicatioin,你可以在你的Applicatioin裡override一下attachBaseContext(),呼叫MultiDex.install(this)來支援multidex。

 

(其實在Android裡,很多情況下都需要你extend其他Application,這就限制了我們自己對Application的擴充套件方式,如果我們想自己抽象一些Application的行為,最好是使用介面和依賴注入方式去實現,這樣耦合度低,容易擴充套件應用)

 

混淆

apk打包時都需要混淆,這可以防止別人根據你的apk安裝包逆向讀懂你的程式碼,注意是讀懂,他還是能讀到程式碼的,但是裡面的變數和類名都會變成a、b、c這樣毫無意義的東西。

使用混淆的配置如下:

開啟專案對應的proguard檔案

制定混淆策略,說明哪些類不混淆

 

AIDL

AIDL跨程式通訊是app間呼叫的手段,主要是通過引用介面和bind到serviceconnection實現的。

寫一個serviceconnection去bind目標aidl

用intent去bindservice,需要傳入aidl提供方約定的名稱

 

然後就可以通過serviceconnection去呼叫aidl介面中提供的函式了

打包APK自動改名

我們提交apk時,需要給apk檔案改名字,加上版本號,生成日期等,以便溝通和管理,這個工作可以在gradle裡配置一下,自動完成。

 

請求許可權

Android把許可權分的很細,需要什麼都需要在manifest檔案中去配置

 

但是Android現在對許可權管理越來越嚴格了,很多許可權不只需要manifest中配置,還需要使用者開啟app時手動確認,這需要在程式碼中動態檢查和申請許可權。

 

不止要申請許可權,因為使用者可能拒絕申請,所以還需要監聽,在提出申請的Activity中,覆寫指定函式,去監聽使用者的處理結果。

處理許可權申請的結果

 

資料庫

Android中有很多資料庫可用,例如原始的SQLite,能自動生成資料庫的GreenDao,最近很火效能不錯的Realm等。

這裡先記錄一下greendao的應用,首先在gradle中新增引用並配置生成策略,然後用註解的方式編寫資料表的類檔案,寫完後build一下工程,greendao就會自動生成資料庫相關檔案

在gradle中設定相關策略

註解編寫資料表的類檔案

編譯專案後,自動生成資料庫相關檔案

 

多版本及開發測試

AS支援多版本釋出,可以同時生成多個不同渠道的apk,不過速度不是很快。

關於多渠道打包,可以參考之前發的文章《Gradle多渠道打包的原理、實踐與輔助開發》

個人更喜歡用多版本來方便開發,在mock版本中模擬各種資料,測試業務場景,同時不對prod正式版造成任何影響。

配置過程如下:

 

(多版本還可以幫助加速除錯,你要為不同的版本配置不同的minSdkVersion,例如在開發的mock裡設定minSdkVersion=21,這樣在執行mock版本時編譯速度更快)

在build variants中,切換版本進行編輯除錯

 

搭好了多版本開發的基本架子,接下來就可以用多版本去輔助開發,例如,在mock開發版本中增加一個功能,即啟動時清空資料庫,同時prod正式版中沒有這個特性。

 

可以在所有版本中增加一個類,啟動時呼叫這個類的函式。

 

這個函式僅在mock版本中實現,在prod版本中,只是一個空函式,這樣既能實現mock版本的特殊功能,又不會干擾到prod版本,最重要的是,釋出前不需要改程式碼。

在debug時使用正式簽名

按照一般的工程慣例,AS在開發時使用一個臨時的apk簽名,在release時使用另一個正式的簽名,這樣可以很好地把開發和釋出區分開,也能很好地保護app產品。

但是,在實際開發過程中,經常需要在debug時會使用正式簽名,例如,聯調第三方庫,或者在已經安裝了正式版的裝置上除錯app,這時如果使用臨時apk簽名的話,簽名會被拒絕,無法除錯。

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

 

注意,storefile這個引數裡指向的路徑,需要放一個正式簽名的jks檔案。

在buildTypes下,分佈為release和debug設定使用的簽名

 

這樣,在debug時也可以使用正式的apk簽名,可以更方便地去除錯了。

一定注意,在上線的時候要刪除掉這個簽名檔案,並且註釋掉這段話!

一些好用的外掛

1.GsonFormat 在AS上使用

可以方便地把json字串對映為對應的Java資料物件

2.JSONView 在Chrome上使用

json字串結構化顯示

3.Octotree 在Chrome上使用

在github網站上能像在IDE一樣檢視原始碼

4.Postman 在Chrome上使用

監聽和發起網路請求

5.Advertising Terminator 在Chrome上使用

遮蔽廣告

6.Click&Clean 在Chrome上使用

分類查詢和清理快取

更多外掛見:吐血推薦珍藏的 Chrome 外掛

清理空間

Android Studio長期執行下來,很容易積累起十多個G的垃圾資料,而且是在C盤,清理方法如下:

開啟C:\Users\{你的使用者}\AppData\Local\Temp

清空

實際上,C:\Users\使用者名稱\AppData裡面一般有三個資料夾,分別是Local,LocalLow,Roaming,簡單地來說,都是用來存放軟體的配置檔案和臨時檔案的,裡面有很多以軟體名稱或軟體公司命名的資料夾,理論上都可以刪除。

程式碼檢查

Android Studio提供了不錯的Analyze工具,可以從程式碼級別自動幫你排查冗餘、洩漏、SDK版本相容等問題,平時可以多執行一下Analyze->Inspect Code

自定義屬性

Android允許自定義控制元件屬性,關鍵字declare-styleable,需要增加res/mystyle.xml檔案,屬性內容如下:

 

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

如果某個attr是需要選擇一個資料填入的,如 android:gravity="top",還需要定義flag <flag name="oldman"value="60" />

declare-styleable中的name是為自定義控制元件的程式碼準備的,程式碼根據這個名字找到自定義屬性:

 

在xml檔案中引用時,需要寫一個xml的名稱空間,用來引用自定義的屬性:

 

然後,在下面的控制元件中,就可以根據名稱空間levideoview來配置自定義引數了。

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

一些有趣的小問題

·關於MAC中找不到SDK資料夾的問題

需要在Users/使用者名稱/ 這個資料夾下,右鍵,“檢視顯示選項”,勾選“顯示資源庫資料夾”,這樣就可以看到使用者目錄下的Library資料夾,SDK的路徑就在Library/Android/SDK中

檢視資原始檔夾

·MAC中使用adb的問題

Mac裝完AS後,不能直接使用adb,會報無效命令,需要步驟如下

1.開啟終端,如下命令:

yourMacBook-Pro:~ you$ echo $HOME

/Users/you

yourMacBook-Pro:~ you$ touch .bash_profile

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

開啟bash檔案

2.bash檔案預設為空,在檔案中填寫你的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了

·關於MAC中配置API Source的問題

預設情況下,檢視Android API部分的原始碼,只能看到函式的引數和範圍,看不到程式碼細節,需要配置API Source原始碼。

最簡單的做法是,在彈出的提示框中,選擇download:

下載API原始碼

然後關閉AS再重新開啟即可。

·關於R中的String換行問題

1.對齊問題

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

不過,我們會發現,為了閱讀方便,我們更習慣在string.xml中這樣定義:

XXX\n

YYY

乍看起來沒有問題,但如果你把這樣的String輸出到介面上,你會發現,這兩行

沒對齊!

第二行YYY前面多了半個空字元。

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

XXX

\nYYY

這次對齊了!實際上,你把TextView的邊框畫出來,做個對比,就會發現,手動換行產生的那個空字元,換到了XXX的末尾,只不過平時看不出來罷了

2.\n變\\n問題

前後臺互動時、用Intent傳資料時,經常會發現\n被轉義成了\\n,而且是各種環境自動轉的。

所以,在收到傳送來的\n時,先檢查一下有沒有\\n是一種什麼行為?

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

·編譯時在style裡應用了Theme.AppCompat.Light.DarkActionBar,出現No resource found that matches the given name的問題

因為這個主題實在appcomat v7裡引用的,如果你的app版本較低(最低相容版本),就需要顯式地引用appcompat v7,在gradle裡新增compile'com.android.support:appcompat-v7:23.4.0'

即可解決問題



 

相關文章