android库项目管理,一个android工程代码多个差异化项目管理方法探讨
一個android工程代碼多個差異化項目管理方法探討
核心提示:
1、工程代碼中盡量不要使用產(chǎn)品名稱、設(shè)備名稱之類的東西來區(qū)分,盡量以功能名稱來區(qū)分,在工程獨立的配置文件中再去配置這個文件;
2、在c/C++代碼里可以在Android.mk文件中傳進(jìn)去一下宏,用宏來區(qū)分代碼,這個宏就是功能的代名詞,宏的名稱盡量達(dá)意一些;
3、在java代碼中盡量使用系統(tǒng)的property來做區(qū)分,設(shè)置系統(tǒng)屬性來解決;
4、?UI顯示定制的XML文件,無法做到兼容的話,就把文件拷貝到每個產(chǎn)品的device目錄下,在編譯的時候拷貝過去覆蓋;
5、在底層代碼中,kernel中本來就有一個config文件,這個可以增加配置選擇,每個項目反正都有自己的config文件,代碼里還是盡量不要用產(chǎn)品名稱之類來區(qū)分;
6、?把硬件差異化配置盡量放到system_config1.fex里面去配置,全志把這一點發(fā)揮到極致了;
/*****************************************************************************************************/聲明:本博內(nèi)容均由http://blog.csdn.net/sundesheng125原創(chuàng),轉(zhuǎn)載請注明出處,謝謝!/*****************************************************************************************************/
在項目開發(fā)中,我們經(jīng)常遇到在一套代碼里要做多個產(chǎn)品,而每個產(chǎn)品或多或少都有一些功能不一樣,有些硬件配置不一樣,客戶需求不一樣,國內(nèi)國外版本定制不一樣、語言不一樣,導(dǎo)致我們不得不在工程代碼里去做差異化處理。在android項目開發(fā)中,從系統(tǒng)架構(gòu)上也考慮一些這方面的需求,一般在device頂層目錄下,針對每一個產(chǎn)品都有一個目錄用來存放只跟自己相關(guān)的東西,筆者以全志平臺為例,自己的產(chǎn)品為EW1021。
在devicesoftwinnercrane-EW1021-A目錄中就存放了一些跟這個產(chǎn)品相關(guān)的東西,比如init.sun4i.rc里面就可以加載自己產(chǎn)品需要的驅(qū)動ko文件,啟動自己需要的service;在crane_xxx.mk文件中也可以存放一些自己需要加載到系統(tǒng)中的資源文件,比如預(yù)裝的音視頻小文件、圖片等,在這里面也可以設(shè)置好自己需要的語言設(shè)置,比如定制成英語為默認(rèn)語言還是中文簡體為系統(tǒng)默認(rèn)語言,這些在設(shè)置property就可以搞定。
筆者以一個實際例子來做一下介紹,筆者做的是車載互動娛樂系統(tǒng),就以里面的通道設(shè)置來學(xué)習(xí)一下我的做法。在實際產(chǎn)品中,存在幾種音頻輸出的可能,從喇叭出,從耳機(jī)出,從FM發(fā)射出,從紅外出,還可以從線性出,強(qiáng)調(diào)一下線性輸出一般輸出到功放音響,比如原廠帶的音響,可以獲得高品質(zhì)的聽覺效果。有一個A項目這5種輸出都有,B項目沒有喇叭,從耳機(jī)出,從FM發(fā)射出,從紅外出,還可以從線性出,而C項目只有從耳機(jī)出,從FM發(fā)射出,還可以從線性出。從這個要求上來說,我們知道在UI顯示上肯定是完全不一樣的,這就要求我們把ui顯示的XML放到各個產(chǎn)品的device目錄下,編譯的時候拷貝過來,這就解決了UI的控制問題。然而,ABC項目三個客戶要求默認(rèn)的輸出通道又不一樣,A默認(rèn)喇叭,B默認(rèn)紅外,C默認(rèn)線性,這怎么解決呢?總不能再代碼的處理中用ABC的名稱來區(qū)分吧!那樣后面再增加一個項目就比較麻煩了。筆者想到的就是增加一個系統(tǒng)屬性,這個屬性就用來配置系統(tǒng)默認(rèn)的音頻通道值。比如:PRODUCT_PROPERTY_OVERRIDES += persist.sys.usb.config=mass_storage,adb persist.service.adb.enable=1 persist.sys.timezone=Asia/Shanghai persist.sys.language=zh persist.sys.country=CN ro.sf.lcd_density=120 ro.property.tabletUI=true ro.product.firmware=1.5 ro.product.def_audio_out_val=3 ro.product.need_ctl_audioin_vol=1 sys.sdcardmounted=0
增加的ro.product.def_audio_out_val可以配置不同的值,這個值可以按約定的表示方法來確定,比如0代表喇叭,1代表耳機(jī),2代表FM發(fā)射,以此類推。利用系統(tǒng)屬性確實能解決很多問題。
除了系統(tǒng)屬性,在android代碼中還有一個利器就是利用功能宏配置。比如有一個應(yīng)用是CSIIN的應(yīng)用,這個應(yīng)用是用來解決視頻輸出鮮果的問題,但是有些客戶要求做低成本的,就不需要這個硬件,當(dāng)然這個應(yīng)用也就沒有用了,但是在Android.mk文件中用產(chǎn)品名稱來區(qū)分也不好,筆者自己增加了一個配置宏就可以很好的解決這個問題配置為:
#csi apk
SW_BOARD_CSI_IN_APK := true
而在Android.mk中就可以這樣寫了,如下:ifeq ($(SW_BOARD_CSI_IN_APK), true)LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optional engLOCAL_SRC_FILES := $(call all-subdir-java-files)LOCAL_PACKAGE_NAME := CSIINLOCAL_CERTIFICATE := platformLOCAL_OVERRIDES_PACKAGES := Homeinclude $(BUILD_PACKAGE)endif
當(dāng)然還有很多在hardware層需要做區(qū)分的,比如不同的屏,系統(tǒng)設(shè)置整體效果的亮度、對比度、色飽和度這些都不一樣,那我們可以利用產(chǎn)品名稱來區(qū)分,但是筆者建議還是以屏來區(qū)分,這樣更有代表性,這樣就不需要很長的一串宏來區(qū)分,比如筆者開始用產(chǎn)品名稱來隔開的,這樣做起來,確實也能解決問題,但是不利于維護(hù),特別是產(chǎn)品成型的時候,稍微改一改又要做給另外一個客戶的時候,每個地方都需要改,而如果利于屏來區(qū)分,就可以再配置里面搞定比如:
#10 inch project
SW_BOARD_LCD_1280_800_10INCH := true
代碼里就輕松了。在Android.mk可以寫一個
+ifeq?($(SW_BOARD_LCD_1280_800_10INCH),?true)
+LOCAL_CFLAGS?+=?-DLCD_1280_800_10INCH
+endif
下面看一下,兩者在代碼中修改對比:
-#if defined(crane_ew1021) || defined(crane_EW1021_A) || defined(crane_ew1021tsd)|| defined(crane_PD1099_A)? ||
-defined(crane_PD1099_C) || defined(crane_EVBJEAVOX) || defined(crane_EW1021H_A) || defined(crane_EW1021H_C) || defined(crane_EW1023_Cemmc)
+/*10 Inch product board*/
+#ifdef LCD_1280_800_10INCH
LOGD("Workaround call: display_getsaturation()
");
display_getsaturation(dev, 0);
display_getsaturation(dev, 1);
@@ -1664,8 +1664,8 @@ static int display_setmode(struct display_device_t *dev,int mode,struct display_???????? ctx->valid_width[0]??? = display_getvalidwidth(ctx,0,para->d0type,para->d0format);???????? ctx->valid_height[0]?? = display_getvalidheight(ctx,0,para->d0type,para->d0format);
-#if defined(crane_ew1021) || defined(crane_EW1021_A) || defined(crane_ew1021tsd)|| defined(crane_PD1099_A)? ||
-defined(crane_PD1099_C) || defined(crane_EVBJEAVOX) || defined(crane_EW1021H_A) || defined(crane_EW1021H_C) || defined(crane_EW1023_Cemmc)
+/*10 Inch product board*/
+#ifdef LCD_1280_800_10INCH
ctx->width[1] = 1280;//display_getwidth(ctx,1,para->d1type,para->d1format);???????? ctx->height[1] =720;// display_getheight(ctx,1,para->d1type,para->d1format); #else //E92021年05月25日2
這樣一對比,一看就知道了用屏的宏來隔開差異化代碼比用產(chǎn)品名稱來隔開要好很多,這樣增加項目的時候就不修改這里面的代碼,只要在device下面的目錄下增加一個宏配置就好了。
筆者結(jié)合多年的實踐經(jīng)驗認(rèn)為工程代碼里越少出現(xiàn)產(chǎn)品名稱來區(qū)分功能差異化、配置差異化最好,擴(kuò)展項目的時候最方便省事,也利于維護(hù)。
總結(jié)
以上是生活随笔為你收集整理的android库项目管理,一个android工程代码多个差异化项目管理方法探讨的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 增强a和增强c有什么区别
- 下一篇: 格力分红36亿怎么回事 公司股东的净利润