知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們在追求其視覺表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏壧峁┍憬莸闹С郑?
Android平臺Java代碼的條件編譯問題
發(fā)表時(shí)間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):101
在代碼的開辟過程中,不管是C/C++也好,Java也罷,都要面對在平臺移植的問題, 所以弗成避免的要推敲前提編譯的問題。 在C/C++代碼的開辟中,前提編譯的實(shí)現(xiàn)很輕易實(shí)現(xiàn),可以分成二種:一種是在單個(gè)代碼文件中經(jīng)由過程 #ifdef ... #endif 或者 #if ... #endif 的方法選擇性編譯文件中的代碼,另一種是在Makefile中經(jīng)由過程宏斷定來選擇性編譯某個(gè)文件。在Java代碼的開辟中,實(shí)現(xiàn)前提編譯則沒有直接對應(yīng)的辦法,然則仍然可以采取變通的辦法來實(shí)現(xiàn)前提編譯。
對于單個(gè)文件內(nèi)的的代碼的前提編譯,可以應(yīng)用Java代碼的優(yōu)化功能來實(shí)現(xiàn):
這里,因?yàn)镈EBUG是一個(gè)final變量,相當(dāng)于C/C++里的CONST變量,
所以Java編譯器在編譯的時(shí)刻會對代碼進(jìn)行優(yōu)化,當(dāng)DEBUG為false時(shí),就不會把if瑯綾擎的代碼編譯進(jìn)去。
然則這種辦法有個(gè)缺點(diǎn),就是不克不及實(shí)現(xiàn)對函數(shù)的前提編譯,這個(gè)時(shí)刻,Java的開辟人員可能就要愛慕C#的開辟人員了,因?yàn)樵贑#里可以像C/C++一樣實(shí)現(xiàn)前提編譯的功能。
下面重點(diǎn)來講下Android的Java代碼的開辟中若何實(shí)現(xiàn)選擇性編譯某些Java代碼文件。
在Android.mk中,有一行腳本大年夜家應(yīng)當(dāng)異常熟悉:
這條代碼的意思是大年夜src目次中查找所有的java文件,并保存到LOCAL_SRC_FILES
所以我們可以選擇性的把平臺相干的代碼加到LOCAL_SRC_FILES中。
辦法如下:
建立如下的目次構(gòu)造:
│ Android.mk
│
└─platform
│ Android.mk
│
├─bb
│ │ Android.mk
│ │
│ └─src
└─aa
│ Android.mk
│
└─src
platform/Android.mk中的內(nèi)容如下:
這里的LOCAL_PATH為在根目次的Android.mk中定義的LOCAL_PATH
履行時(shí)會包含platform子目次下的所有Android.mk
在platform目次下放的即為平臺相干的java代碼
platform/aa目次下的Android.mk內(nèi)容如下:
platform/bb目次下的Android.mk內(nèi)容如下:
platform下的平臺相干子目次Android.mk文件會斷定平臺是否相符請求,如不雅相符請求就會把子目次賦值給PLATFORM_DIR變量。
來看根目次下的Android.mk的內(nèi)容如下:
標(biāo)紅的第一行代碼把platform/Android.mk包含進(jìn)來,履行的腳本會根據(jù)平臺定義PLATFORM_DIR變量。第二行代碼即為把平臺相干的src目次下的所有java代碼包含進(jìn)來.
如許,就實(shí)現(xiàn)了編譯不合文件的java代碼了。
實(shí)現(xiàn)前提編譯還有一種辦法,就是把平臺相干的代碼編譯成static Java庫,
辦法是用
include $(BUILD_STATIC_JAVA_LIBRARY)代替include $(BUILD_JAVA_LIBRARY)
include $(BUILD_JAVA_LIBRARY)會直接編譯出jar包。而include $(BUILD_STATIC_JAVA_LIBRARY)固然也會生成jar包,
然則在被其它apk的編譯時(shí),如不雅經(jīng)由過程LOCAL_STATIC_JAVA_LIBRARIES把這個(gè)庫包含進(jìn)來,如許也會把代碼靜態(tài)編譯進(jìn)apk,而不會依附于額外的jar包。
然則這種辦法明顯更復(fù)雜,有興趣可以試下。
對于單個(gè)文件內(nèi)的的代碼的前提編譯,可以應(yīng)用Java代碼的優(yōu)化功能來實(shí)現(xiàn):
private final boolean DEBUG = false; if (DEBUG) { Log.i("TEST","hello,world"); }
這里,因?yàn)镈EBUG是一個(gè)final變量,相當(dāng)于C/C++里的CONST變量,
所以Java編譯器在編譯的時(shí)刻會對代碼進(jìn)行優(yōu)化,當(dāng)DEBUG為false時(shí),就不會把if瑯綾擎的代碼編譯進(jìn)去。
然則這種辦法有個(gè)缺點(diǎn),就是不克不及實(shí)現(xiàn)對函數(shù)的前提編譯,這個(gè)時(shí)刻,Java的開辟人員可能就要愛慕C#的開辟人員了,因?yàn)樵贑#里可以像C/C++一樣實(shí)現(xiàn)前提編譯的功能。
下面重點(diǎn)來講下Android的Java代碼的開辟中若何實(shí)現(xiàn)選擇性編譯某些Java代碼文件。
在Android.mk中,有一行腳本大年夜家應(yīng)當(dāng)異常熟悉:
LOCAL_SRC_FILES := $(call all-java-files-under, src)
這條代碼的意思是大年夜src目次中查找所有的java文件,并保存到LOCAL_SRC_FILES
所以我們可以選擇性的把平臺相干的代碼加到LOCAL_SRC_FILES中。
辦法如下:
建立如下的目次構(gòu)造:
│ Android.mk
│
└─platform
│ Android.mk
│
├─bb
│ │ Android.mk
│ │
│ └─src
└─aa
│ Android.mk
│
└─src
platform/Android.mk中的內(nèi)容如下:
include $(call all-makefiles-under, $(LOCAL_PATH)/platform)
這里的LOCAL_PATH為在根目次的Android.mk中定義的LOCAL_PATH
履行時(shí)會包含platform子目次下的所有Android.mk
在platform目次下放的即為平臺相干的java代碼
platform/aa目次下的Android.mk內(nèi)容如下:
ifeq ($(TARGET_PRODUCT),aa) PLATFORM_DIR := aa Endif
platform/bb目次下的Android.mk內(nèi)容如下:
ifeq ($(TARGET_PRODUCT),bb) PLATFORM_DIR := bb endif
platform下的平臺相干子目次Android.mk文件會斷定平臺是否相符請求,如不雅相符請求就會把子目次賦值給PLATFORM_DIR變量。
來看根目次下的Android.mk的內(nèi)容如下:
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) ...
標(biāo)紅的第一行代碼把platform/Android.mk包含進(jìn)來,履行的腳本會根據(jù)平臺定義PLATFORM_DIR變量。第二行代碼即為把平臺相干的src目次下的所有java代碼包含進(jìn)來.
如許,就實(shí)現(xiàn)了編譯不合文件的java代碼了。
實(shí)現(xiàn)前提編譯還有一種辦法,就是把平臺相干的代碼編譯成static Java庫,
辦法是用
include $(BUILD_STATIC_JAVA_LIBRARY)代替include $(BUILD_JAVA_LIBRARY)
include $(BUILD_JAVA_LIBRARY)會直接編譯出jar包。而include $(BUILD_STATIC_JAVA_LIBRARY)固然也會生成jar包,
然則在被其它apk的編譯時(shí),如不雅經(jīng)由過程LOCAL_STATIC_JAVA_LIBRARIES把這個(gè)庫包含進(jìn)來,如許也會把代碼靜態(tài)編譯進(jìn)apk,而不會依附于額外的jar包。
然則這種辦法明顯更復(fù)雜,有興趣可以試下。
相關(guān)案例查看更多
相關(guān)閱讀
- 跳轉(zhuǎn)小程序
- 小程序開發(fā)費(fèi)用
- 網(wǎng)站建設(shè)列表網(wǎng)
- 報(bào)廢車拆解軟件
- 云南網(wǎng)站建設(shè)
- 企業(yè)網(wǎng)站
- 云南網(wǎng)站建設(shè)哪家強(qiáng)
- 大理網(wǎng)站建設(shè)公司
- 專業(yè)網(wǎng)站建設(shè)公司
- 云南軟件公司
- 英文網(wǎng)站建設(shè)公司
- 關(guān)鍵詞快速排名
- 區(qū)塊鏈
- 云南網(wǎng)站建設(shè)首選公司
- 小程序開發(fā)聯(lián)系方式
- 小程序生成海報(bào)
- 小程序分銷商城
- web開發(fā)技術(shù)
- 重慶網(wǎng)站建設(shè)公司
- 二叉樹
- 云南衛(wèi)視小程序
- typescript
- 曲靖小程序開發(fā)
- 小程序表單
- 大理小程序開發(fā)
- 百度自然排名
- 云南小程序開發(fā)制作
- 昆明小程序公司
- 網(wǎng)站建設(shè)服務(wù)公司
- web服務(wù)