日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android库项目管理,一个android工程代码多个差异化项目管理方法探讨

發(fā)布時間:2025/4/5 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android库项目管理,一个android工程代码多个差异化项目管理方法探讨 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

核心提示:

1、工程代碼中盡量不要使用產品名稱、設備名稱之類的東西來區(qū)分,盡量以功能名稱來區(qū)分,在工程獨立的配置文件中再去配置這個文件;

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

3、在java代碼中盡量使用系統(tǒng)的property來做區(qū)分,設置系統(tǒng)屬性來解決;

4、?UI顯示定制的XML文件,無法做到兼容的話,就把文件拷貝到每個產品的device目錄下,在編譯的時候拷貝過去覆蓋;

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

6、?把硬件差異化配置盡量放到system_config1.fex里面去配置,全志把這一點發(fā)揮到極致了;

/*****************************************************************************************************/聲明:本博內容均由http://blog.csdn.net/sundesheng125原創(chuàng),轉載請注明出處,謝謝!/*****************************************************************************************************/

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

在devicesoftwinnercrane-EW1021-A目錄中就存放了一些跟這個產品相關的東西,比如init.sun4i.rc里面就可以加載自己產品需要的驅動ko文件,啟動自己需要的service;在crane_xxx.mk文件中也可以存放一些自己需要加載到系統(tǒng)中的資源文件,比如預裝的音視頻小文件、圖片等,在這里面也可以設置好自己需要的語言設置,比如定制成英語為默認語言還是中文簡體為系統(tǒng)默認語言,這些在設置property就可以搞定。

筆者以一個實際例子來做一下介紹,筆者做的是車載互動娛樂系統(tǒng),就以里面的通道設置來學習一下我的做法。在實際產品中,存在幾種音頻輸出的可能,從喇叭出,從耳機出,從FM發(fā)射出,從紅外出,還可以從線性出,強調一下線性輸出一般輸出到功放音響,比如原廠帶的音響,可以獲得高品質的聽覺效果。有一個A項目這5種輸出都有,B項目沒有喇叭,從耳機出,從FM發(fā)射出,從紅外出,還可以從線性出,而C項目只有從耳機出,從FM發(fā)射出,還可以從線性出。從這個要求上來說,我們知道在UI顯示上肯定是完全不一樣的,這就要求我們把ui顯示的XML放到各個產品的device目錄下,編譯的時候拷貝過來,這就解決了UI的控制問題。然而,ABC項目三個客戶要求默認的輸出通道又不一樣,A默認喇叭,B默認紅外,C默認線性,這怎么解決呢?總不能再代碼的處理中用ABC的名稱來區(qū)分吧!那樣后面再增加一個項目就比較麻煩了。筆者想到的就是增加一個系統(tǒng)屬性,這個屬性就用來配置系統(tǒng)默認的音頻通道值。比如: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代表耳機,2代表FM發(fā)射,以此類推。利用系統(tǒng)屬性確實能解決很多問題。

除了系統(tǒng)屬性,在android代碼中還有一個利器就是利用功能宏配置。比如有一個應用是CSIIN的應用,這個應用是用來解決視頻輸出鮮果的問題,但是有些客戶要求做低成本的,就不需要這個硬件,當然這個應用也就沒有用了,但是在Android.mk文件中用產品名稱來區(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

當然還有很多在hardware層需要做區(qū)分的,比如不同的屏,系統(tǒng)設置整體效果的亮度、對比度、色飽和度這些都不一樣,那我們可以利用產品名稱來區(qū)分,但是筆者建議還是以屏來區(qū)分,這樣更有代表性,這樣就不需要很長的一串宏來區(qū)分,比如筆者開始用產品名稱來隔開的,這樣做起來,確實也能解決問題,但是不利于維護,特別是產品成型的時候,稍微改一改又要做給另外一個客戶的時候,每個地方都需要改,而如果利于屏來區(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

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

筆者結合多年的實踐經驗認為工程代碼里越少出現(xiàn)產品名稱來區(qū)分功能差異化、配置差異化最好,擴展項目的時候最方便省事,也利于維護。

總結

以上是生活随笔為你收集整理的android库项目管理,一个android工程代码多个差异化项目管理方法探讨的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久精品毛片 | 少妇被狂c下部羞羞漫画 | 久久久久人妻一区二区三区 | 99re在线视频免费观看 | 久久视频一区二区三区 | 中文字幕素人 | 精品少妇一区二区三区在线观看 | xxx视频在线观看 | 亚洲欲妇 | 久久久久久久久久久av | 国产av剧情一区二区三区 | 在线aaa| 国产精品视频免费看 | 欧美一卡二卡在线 | 日韩在线观看免费高清 | julia一区| 色窝| 亚洲成人av免费观看 | 91麻豆精品| 少妇乱淫| 九七在线视频 | 成人免费网站视频 | 天天干天天操天天拍 | 污视频免费看 | 国产偷怕| 草草影院1| 国产1区2区3区 | 五十路japanese55丰满 | 精品一区二区av | 日本不卡123 | 色狠狠一区二区三区香蕉 | 亚洲激情在线播放 | 欧美在线精品一区二区三区 | 精品人妻天天爽夜夜爽视频 | 日本免费在线观看 | 一区二区三区久久 | 鲁片一区二区三区 | 亚洲中字在线 | 少女视频的播放方法 | 毛片视频免费观看 | 欧美一区二区三区爽爽爽 | 亚洲专区免费 | 男女爽爽视频 | 国产亚洲欧美在线视频 | 欧美日韩在线看 | 日本亲子乱子伦xxxx50路 | 麻豆www.| 无码少妇一区二区三区芒果 | 操网站 | 日本不卡视频一区 | 亚洲人做受 | 日韩在线精品视频一区二区涩爱 | av资源吧首页 | 精品少妇一区二区 | 在线观看特色大片免费网站 | 91成人看 | 日韩无码精品一区二区三区 | 亚洲黄色在线观看 | 91射| 麻豆 国产 | 亚洲色图综合在线 | 天天综合网久久综合网 | 亚洲综合网在线观看 | 色婷婷久久久 | 国产伦精品一区二区三区四区 | 成年人在线免费观看视频网站 | 丰满岳乱妇在线观看中字无码 | 日韩黄色免费视频 | 久久久久久久久久久久久久久久久 | 国产主播一区二区三区 | 一级黄色a视频 | 日韩激情在线观看 | 天天曰天天爽 | 潘金莲激情呻吟欲求不满视频 | 天天激情站 | 亚洲人体一区 | 国产69页| 国产精品第二十页 | 亚洲AV无码久久精品国产一区 | 成人在线观看一区 | 国产精品久久一区二区三区 | 成人字幕 | 久久国产人妻一区二区免色戒电影 | 波多野结衣视频免费 | 91夜色视频 | 无套内谢大学处破女www小说 | 黄色片免费观看视频 | 视频一区国产精品 | 欧美激情三级 | 精品无码黑人又粗又大又长 | 让男按摩师摸好爽 | 黄瓜视频污在线观看 | 欧美大片黄 | 一区二区三区在线视频播放 | 成人99 | 午夜色婷婷 | 亚洲第九页 | 国产在线观看免费视频软件 | 久久激情影院 |