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

简介: 一个android工程代码多个差异化项目管理方法探讨   核心提示: 1、工程代码中尽量不要使用产品名称、设备名称之类的东西来区分,尽量以功能名称来区分,在工程独立的配置文件中再去配置这个文件; 2、在c/C++代码里可以在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的名称来区分吧!那样后面再增加一个项目就比较麻烦了。笔者想到的就是增加一个系统属性,这个属性就用来配置系统默认的音频通道值。比如:

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发射,以此类推。利用系统属性确实能解决很多问题。

    除了系统属性,在android代码中还有一个利器就是利用功能宏配置。比如有一个应用是CSIIN的应用,这个应用是用来解决视频输出鲜果的问题,但是有些客户要求做低成本的,就不需要这个硬件,当然这个应用也就没有用了,但是在Android.mk文件中用产品名称来区分也不好,笔者自己增加了一个配置宏就可以很好的解决这个问题配置为:

#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 eng

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_PACKAGE_NAME := CSIIN
LOCAL_CERTIFICATE := platform

LOCAL_OVERRIDES_PACKAGES := Home

include $(BUILD_PACKAGE)
endif

     当然还有很多在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);

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

     这样一对比,一看就知道了用屏的宏来隔开差异化代码比用产品名称来隔开要好很多,这样增加项目的时候就不修改这里面的代码,只要在device下面的目录下增加一个宏配置就好了。

     笔者结合多年的实践经验认为工程代码里越少出现产品名称来区分功能差异化、配置差异化最好,扩展项目的时候最方便省事,也利于维护。

 

目录
相关文章
|
22天前
|
安全 Android开发 iOS开发
Android vs. iOS:构建生态差异与技术较量的深度剖析###
本文深入探讨了Android与iOS两大移动操作系统在构建生态系统上的差异,揭示了它们各自的技术优势及面临的挑战。通过对比分析两者的开放性、用户体验、安全性及市场策略,本文旨在揭示这些差异如何塑造了当今智能手机市场的竞争格局,为开发者和用户提供决策参考。 ###
|
1月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
102 1
|
15天前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
40 15
Android 系统缓存扫描与清理方法分析
|
7天前
|
前端开发 JavaScript 测试技术
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
在 Android 开发中,选择合适的架构模式对于构建中大型项目至关重要。常见的架构模式有 MVVM、MVP、MVI、Clean Architecture 和 Flux/Redux。每种模式都有其优缺点和适用场景,例如 MVVM 适用于复杂 UI 状态和频繁更新,而 Clean Architecture 适合大型项目和多平台开发。选择合适的架构应考虑项目需求、团队熟悉度和可维护性。
31 5
|
6天前
|
Android开发 Swift iOS开发
探索iOS与安卓应用开发的差异性
探索iOS与安卓应用开发的差异性
22 2
|
6天前
|
安全 搜索推荐 Android开发
深入探索Android与iOS的系统架构差异
【10月更文挑战第29天】 在当今的智能手机市场中,Android和iOS无疑是两大主流操作系统。本文旨在深入探讨这两个系统的架构差异,从底层的操作系统设计到用户界面的呈现,以及它们如何影响了开发者和用户的体验。通过对比分析,我们可以更清晰地理解这两种平台的优势与局限,为开发者在选择开发平台时提供有价值的参考,同时也为用户选择设备提供一定的指导。
22 2
|
8天前
|
安全 搜索推荐 Android开发
揭秘安卓与iOS系统的差异:技术深度对比
【10月更文挑战第27天】 本文深入探讨了安卓(Android)与iOS两大移动操作系统的技术特点和用户体验差异。通过对比两者的系统架构、应用生态、用户界面、安全性等方面,揭示了为何这两种系统能够在市场中各占一席之地,并为用户提供不同的选择。文章旨在为读者提供一个全面的视角,理解两种系统的优势与局限,从而更好地根据自己的需求做出选择。
24 2
|
10天前
|
安全 搜索推荐 Android开发
揭秘iOS与安卓系统的差异:一场技术与哲学的较量
在智能手机的世界里,iOS和Android无疑是两大巨头,它们不仅定义了操作系统的标准,也深刻影响了全球数亿用户的日常生活。本文旨在探讨这两个平台在设计理念、用户体验、生态系统及安全性等方面的本质区别,揭示它们背后的技术哲学和市场策略。通过对比分析,我们将发现,选择iOS或Android,不仅仅是选择一个操作系统,更是选择了一种生活方式和技术信仰。
|
16天前
|
安全 Android开发 iOS开发
Android vs iOS:探索移动操作系统的设计与功能差异###
【10月更文挑战第20天】 本文深入分析了Android和iOS两个主流移动操作系统在设计哲学、用户体验、技术架构等方面的显著差异。通过对比,揭示了这两种系统各自的独特优势与局限性,并探讨了它们如何塑造了我们的数字生活方式。无论你是开发者还是普通用户,理解这些差异都有助于更好地选择和使用你的移动设备。 ###
31 3
|
17天前
|
安全 搜索推荐 Android开发
深入探索安卓与iOS系统的差异及其对用户体验的影响
在当今的智能手机市场中,安卓和iOS是两大主流操作系统。它们各自拥有独特的特性和优势,为用户提供了不同的使用体验。本文将深入探讨安卓与iOS系统之间的主要差异,包括它们的设计理念、用户界面、应用生态以及安全性等方面,并分析这些差异如何影响用户的使用体验。
下一篇
无影云桌面