一个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下面的目录下增加一个宏配置就好了。

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

 

目录
相关文章
|
15天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
28天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第30天】 随着Kotlin成为开发Android应用的首选语言,开发者社区对于其性能表现持续关注。本文通过深入分析与基准测试,探讨Kotlin与Java在Android平台上的性能差异,揭示两种语言在编译效率、运行时性能和内存消耗方面的具体表现,并提供优化建议。我们的目标是为Android开发者提供科学依据,帮助他们在项目实践中做出明智的编程语言选择。
|
1月前
|
Ubuntu 网络协议 Java
【Android平板编程】远程Ubuntu服务器code-server编程写代码
【Android平板编程】远程Ubuntu服务器code-server编程写代码
|
1月前
|
安全 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第24天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin在Android开发中的普及,了解其与Java在性能方面的差异变得尤为重要。本文通过深入分析和对比两种语言的运行效率、启动时间、内存消耗等关键指标,揭示了Kotlin在实际项目中可能带来的性能影响,并提供了针对性的优化建议。
27 0
|
1月前
|
安全 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第18天】 在Android开发领域,Kotlin和Java一直是热门的编程语言选择。尽管两者在功能上具有相似性,但它们在性能表现上的差异却鲜有深入比较。本文通过一系列基准测试,对比了Kotlin与Java在Android平台上的运行效率,揭示了两种语言在处理速度、内存分配以及电池消耗方面的差异。此外,文章还将探讨如何根据性能测试结果,为开发者提供在实际应用开发中选择合适语言的建议。
|
22天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
在开发高性能的Android应用时,选择合适的编程语言至关重要。近年来,Kotlin因其简洁性和功能性受到开发者的青睐,但其性能是否与传统的Java相比有所不足?本文通过对比分析Kotlin与Java在Android平台上的运行效率,揭示二者在编译速度、运行时性能及资源消耗方面的具体差异,并探讨在实际项目中如何做出最佳选择。
17 4
|
1月前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第24天】 在移动开发领域,性能优化一直是开发者关注的重点。随着Kotlin的兴起,许多Android开发者开始从传统的Java转向Kotlin进行应用开发。本文将深入探讨Kotlin与Java在Android平台上的性能表现,通过对比分析两者在编译效率、运行时性能和内存消耗等方面的差异。我们将基于实际案例研究,为开发者提供选择合适开发语言的数据支持,并分享一些提升应用性能的最佳实践。
|
1月前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第22天】随着Kotlin在Android开发中的普及,开发者们对其性能表现持续关注。本文通过深入分析Kotlin与Java在Android平台上的执行效率,揭示了二者在编译优化、运行时性能以及内存占用方面的差异。通过实际案例测试,为开发者提供选择合适编程语言的参考依据。
|
16天前
|
Android开发
Android调用相机与相册的方法2
Android调用相机与相册的方法
17 0
|
1月前
|
安全 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第27天】 在Android开发领域,Kotlin和Java一直是热门的编程语言选择。尽管两者都可以用于创建高质量的Android应用程序,但它们在性能方面的差异一直是开发者关注的焦点。本文通过深入分析Kotlin与Java在Android平台上的运行效率、编译时间及内存消耗等方面的表现,揭示两种语言在实际应用中的性能差异,帮助开发者根据项目需求做出更明智的选择。