天天看點

一個android工程代碼多個差異化項目管理方法探讨

一個android工程代碼多個差異化項目管理方法探讨

核心提示:

1、工程代碼中盡量不要使用産品名稱、裝置名稱之類的東西來區分,盡量以功能名稱來區分,在工程獨立的配置檔案中再去配置這個檔案;

2、在c/C++代碼裡可以在Android.mk檔案中傳進去一下宏,用宏來區分代碼,這個宏就是功能的代名詞,宏的名稱盡量達意一些;

3、在java代碼中盡量使用系統的property來做區分,設定系統屬性來解決;

4、 UI顯示定制的XML檔案,無法做到相容的話,就把檔案拷貝到每個産品的device目錄下,在編譯的時候拷貝過去覆寫;

5、在底層代碼中,kernel中本來就有一個config檔案,這個可以增加配置選擇,每個項目反正都有自己的config檔案,代碼裡還是盡量不要用産品名稱之類來區分;

6、 把硬體差異化配置盡量放到system_config1.fex裡面去配置,全志把這一點發揮到極緻了;

/*****************************************************************************************************/

聲明:本博内容均由http://blog.csdn.net/sundesheng125原創,轉載請注明出處,謝謝!

     在項目開發中,我們經常遇到在一套代碼裡要做多個産品,而每個産品或多或少都有一些功能不一樣,有些硬體配置不一樣,客戶需求不一樣,國内國外版本定制不一樣、語言不一樣,導緻我們不得不在工程代碼裡去做差異化處理。在android項目開發中,從系統架構上也考慮一些這方面的需求,一般在device頂層目錄下,針對每一個産品都有一個目錄用來存放隻跟自己相關的東西,筆者以全志平台為例,自己的産品為EW1021。

      在device\softwinner\crane-EW1021-A目錄中就存放了一些跟這個産品相關的東西,比如init.sun4i.rc裡面就可以加載自己産品需要的驅動ko檔案,啟動自己需要的service;在crane_xxx.mk檔案中也可以存放一些自己需要加載到系統中的資源檔案,比如預裝的音視訊小檔案、圖檔等,在這裡面也可以設定好自己需要的語言設定,比如定制成英語為預設語言還是中文簡體為系統預設語言,這些在設定property就可以搞定。

     筆者以一個實際例子來做一下介紹,筆者做的是車載互動娛樂系統,就以裡面的通道設定來學習一下我的做法。在實際産品中,存在幾種音頻輸出的可能,從喇叭出,從耳機出,從FM發射出,從紅外出,還可以從線性出,強調一下線性輸出一般輸出到功放音響,比如原廠帶的音響,可以獲得高品質的聽覺效果。有一個A項目這5種輸出都有,B項目沒有喇叭,從耳機出,從FM發射出,從紅外出,還可以從線性出,而C項目隻有從耳機出,從FM發射出,還可以從線性出。從這個要求上來說,我們知道在UI顯示上肯定是完全不一樣的,這就要求我們把ui顯示的XML放到各個産品的device目錄下,編譯的時候拷貝過來,這就解決了UI的控制問題。然而,ABC項目三個客戶要求預設的輸出通道又不一樣,A預設喇叭,B預設紅外,C預設線性,這怎麼解決呢?總不能再代碼的進行中用ABC的名稱來區分吧!那樣後面再增加一個項目就比較麻煩了。筆者想到的就是增加一個系統屬性,這個屬性就用來配置系統預設的音頻通道值。比如:

     增加的ro.product.def_audio_out_val可以配置不同的值,這個值可以按約定的表示方法來确定,比如0代表喇叭,1代表耳機,2代表FM發射,以此類推。利用系統屬性确實能解決很多問題。

    除了系統屬性,在android代碼中還有一個利器就是利用功能宏配置。比如有一個應用是CSIIN的應用,這個應用是用來解決視訊輸出鮮果的問題,但是有些客戶要求做低成本的,就不需要這個硬體,當然這個應用也就沒有用了,但是在Android.mk檔案中用産品名稱來區分也不好,筆者自己增加了一個配置宏就可以很好的解決這個問題配置為:

#csi apk

SW_BOARD_CSI_IN_APK := true

而在Android.mk中就可以這樣寫了,如下:

     當然還有很多在hardware層需要做區分的,比如不同的屏,系統設定整體效果的亮度、對比度、色飽和度這些都不一樣,那我們可以利用産品名稱來區分,但是筆者建議還是以屏來區分,這樣更有代表性,這樣就不需要很長的一串宏來區分,比如筆者開始用産品名稱來隔開的,這樣做起來,确實也能解決問題,但是不利于維護,特别是産品成型的時候,稍微改一改又要做給另外一個客戶的時候,每個地方都需要改,而如果利于屏來區分,就可以再配置裡面搞定比如:

#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()\n");

     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);

         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 //E901-902

     這樣一對比,一看就知道了用屏的宏來隔開差異化代碼比用産品名稱來隔開要好很多,這樣增加項目的時候就不修改這裡面的代碼,隻要在device下面的目錄下增加一個宏配置就好了。

     筆者結合多年的實踐經驗認為工程代碼裡越少出現産品名稱來區分功能差異化、配置差異化最好,擴充項目的時候最友善省事,也利于維護。