Android平台Java代碼的條件編譯問題

來源:互聯網
上載者:User

標籤:android   java   條件編譯   

 在代碼的開發過程中,不管是C/C++也好,Java也罷,都要面對在平台移植的問題, 所以不可避免的要考慮條件編譯的問題。 在C/C++代碼的開發中,條件編譯的實現很容易實現,可以分成二種:一種是在單個代碼檔案中通過 #ifdef ... #endif 或者 #if ... #endif 的方式選擇性編譯檔案中的代碼,另一種是在Makefile中通過宏判斷來選擇性編譯某個檔案。在Java代碼的開發中,實現條件編譯則沒有直接對應的方法,但是仍然可以採用變通的方法來實現條件編譯。
 
對於單個檔案內的的代碼的條件編譯,可以利用Java代碼的最佳化功能來實現:


  private final boolean DEBUG = false;  if (DEBUG) {     Log.i("TEST","hello,world");  }

這裡,因為DEBUG是一個final變數,相當於C/C++裡的CONST變數,
所以Java編譯器在編譯的時候會對代碼進行最佳化,當DEBUG為false時,就不會把if裡面的代碼編譯進去。
但是這種方法有個缺陷,就是不能實現對函數的條件編譯,這個時候,Java的開發人員可能就要羨慕C#的開發人員了,因為在C#裡可以像C/C++一樣實現條件編譯的功能。
 
下面重點來講下Android的Java代碼的開發中如何?選擇性編譯某些Java代碼檔案。
 
在Android.mk中,有一行指令碼大家應該非常熟悉:

LOCAL_SRC_FILES := $(call all-java-files-under, src)

這條代碼的意思是從src目錄中尋找所有的java檔案,並儲存到LOCAL_SRC_FILES 

 
所以我們可以選擇性的把平台相關的代碼加到LOCAL_SRC_FILES中。
 
方法如下:
建立如下的目錄結構:


│  Android.mk

│
└─platform
    │  Android.mk
    │
    ├─bb
    │  │  Android.mk
    │  │
    │  └─src
    └─aa
        │  Android.mk
        │

        └─src


platform/Android.mk中的內容如下:


include $(call all-makefiles-under, $(LOCAL_PATH)/platform)


這裡的LOCAL_PATH為在根目錄的Android.mk中定義的LOCAL_PATH

執行時會包含platform子目錄下的所有Android.mk
在platform目錄下放的即為平台相關的java代碼
 
platform/aa目錄下的Android.mk內容如下:
ifeq ($(TARGET_PRODUCT),aa) PLATFORM_DIR := aa Endif
 
platform/bb目錄下的Android.mk內容如下:
ifeq ($(TARGET_PRODUCT),bb) PLATFORM_DIR := bb endif

 
platform下的平台相關子目錄Android.mk檔案會判斷平台是否符合要求,如果符合要求就會把子目錄賦值給PLATFORM_DIR變數。
 
來看根目錄下的Android.mk的內容如下:

LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) ... LOCAL_SRC_FILES := $(call all-java-files-under, src) include $(LOCAL_PATH)/platform/Android.mk LOCAL_SRC_FILES += $(call all-java-files-under, platform/$(MTA_PLATFORM_DIR)/src) ...

標紅的第一行代碼把platform/Android.mk包含進來,執行的指令碼會根據平台定義PLATFORM_DIR變數。第二行代碼即為把平台相關的src目錄下的所有java程式碼封裝含進來.

 

這樣,就實現了編譯不同檔案的java代碼了。


 
實現條件編譯還有一種方法,就是把平台相關的代碼編譯成static Java庫,

方法是用

include $(BUILD_STATIC_JAVA_LIBRARY)代替include $(BUILD_JAVA_LIBRARY)

include $(BUILD_JAVA_LIBRARY)會直接編譯出jar包。而include $(BUILD_STATIC_JAVA_LIBRARY)雖然也會產生jar包,
但是在被其它apk的編譯時間,如果通過LOCAL_STATIC_JAVA_LIBRARIES把這個庫包含進來,這樣也會把代碼靜態編譯進apk,而不會依賴於額外的jar包。
但是這種方法明顯更複雜,有興趣可以試下。
 

Android平台Java代碼的條件編譯問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.