P2及P301项目软件总结
一、 项目回顾
1、 版本总结
P2到目前为止一共发布14个送测版本,A11,A12,A13已用于正式生产。P2由于三大件存在二供问题,还需要出A14版本来解决,以实现最终放量量产。
P301到目前为止一共发布11个送测版本,在开发前期和中期,两项目版本发布同步,因此版本号基本一致。
主要是在MTK6732新平台上开发,版本成熟度较低,两项目大同小异,仅主要器件的不同,应用软件没有差异。这2个项目采用共分支开发,应用在同一分支,驱动也在同一分支,使用宏,在差异部分做区分,省去大量的代码合并和同步的工作,节省了工作量,实现了快速开发。但当同时开发项目多时,也会有些干扰,开发人员一时难适应,经过一段时间磨合以后,逐渐适应。当某个项目开发即将结束,就可以通过拉TAG的方式,引出,但需要重新创建编译环境,需要一定的硬盘资源,需要考虑。
2、 功能/技术总结
平台:MT6732、KK2.MP13.V1.16、Android 4.4.4。
本项目是该平台上的首次开发,定制了大量的三方应用,比如
软件商店 ,浏览器,天气等功能三方定制。
因为同是Android 4.4.4,应用代码主要从P5项目上移植而来。
二、 流程改进
1. 这2个项目采用共分支开发,应用在同一分支,驱动也在同一分支,使用宏,在差异部分做区分,省去大量的代码合并和同步的工作,节省了工作量,实现了快速开发。但当同时开发项目多时,也会有些干扰,开发人员一时难适应,经过一段时间磨合以后,逐渐适应。当某个项目开发即将结束,就可以通过拉TAG的方式,引出,但需要重新创建编译环境,需要一定的硬盘资源,需要考虑。同平台同时项目较多是,争夺主分支的使用权,会互相有干扰问题。
2. 驱动分支,即CTA分支,即驱动纯净版本跟CTA 版本二合一,这样可节省资源,另外项目初期的试产版本,跟CTA使用同一版本,也可节省资源。实践可行。
三、 疑难总结
1. 生产线发现,部分LCD 最低亮度不亮问题。
部分机器最低亮度不亮屏,是当时测试要求调节最低亮度,P2 framework层修改alps/frameworks/base/core/res/res/values/config.xml最低亮度值由6改成3 ,是在帝京和合力泰两块屏上都有验证的,部分机器不亮屏是由于生产和调试使用的背光ic不是同一颗,出问题的ic是没有经过调试和试产验证的。
确认结果是P2最低亮度由3调整至6,暂停在P2上的使用,i7使用在P2上使用有问题的背光IC芯片,将最低亮度调整至7,与李辉经理确认背光最低亮度的占空比不低于2%即可。另外有工厂提机两台50%以上亮度调节不上去,通过重新焊接IC的使能脚(第4脚)可以恢复正常调节背光。测量ledpwm输出引脚的电压为1.8v到ic的使能脚电压却为1.5v,尝试断开ap端的电阻,此压降现象消失。后续I7会断开Ap端的电阻。这个现象与最低亮度问题没有关系。
2. LCD底部黑条纹问题
这个问题解决的过程比较曲折,开始怀疑设置分辨率的寄存器没有正常写入,不过通过读取写入寄存器的值可以发现是正确的。后来IC原厂通过抓取波形也发现没有问题,包括修改mipi时序以及相关的写入速度等等各种办法都尝试了,还是不行,最后是台湾那边加了一个寄存器,这个寄存器是测试模式下的一个使能寄存器,可以确保初始化里面的寄存器都可以正常写入并且生效。
相关代码alps\mediatek\custom\common\kernel\lcm\otm8018b_dsi_vdo\otm8018b_dsi_vdo.c
加入:
staticstructLCM_setting_tablelcm_initialization_setting[] = {
…
{0x00, 1 , {0x80}}, //added by fengshangdong, very important
{0xF6, 1 , {0x01}},这个也只能针对这个otm8018b
…
}
3. LCD唤不醒黑屏问题
由于我们的机器都开启了cabc功能,而且平台端控制背光IC的那路电路在物理上又没有断开,导致从LCM端的信号出来连接平台端的那路有一部分分压,从而导致背光IC点不亮,所以会引起唤不醒这个现象。解决办法就是将平台端控制背光IC的那路信号断开。
4. LCD恢复出厂设置之后屏幕闪屏,黑色条纹问题
更新了LCD驱动之后没有编进recovery.img,因为这个包里面还是以前的LCD驱动,如果只编lk 跟kernel恢复出厂的时候有可能会出现这个问题,因为recovery.img中保存的还是以前的LCD驱动参数。
5. CTP兼容导致烧写失败问题
系统启动后先判断ic类型,用int g_ic_version全局变量。
在tpd_local_init() 里判断g_ic_version的结果。如果是该器件,
i2c_add_driver(&tpd_i2c_driver)会成功。如果不成功则错误退出。
如果是ft6336--帝晶ctp, 在 ft6336_p2/ft6336_ts.c/ tpd_local_init(void) 里,系统会运行到g_ic_version = 0x6336;
如果不是ft6336--帝晶ctp, 系统在 if(i2c_add_driver(&tpd_i2c_driver)!=0)
会出错退出。
staticinttpd_local_init(void)
{
TPD_DMESG("FocaltechFT6336 I2C Touchscreen Driver (Built %s @ %s)\n", __DATE__, __TIME__);
if(i2c_add_driver(&tpd_i2c_driver)!=0)
{
TPD_DMESG("ft6336unable to add i2c driver.\n");
return -1;
}
if(tpd_load_status == 0)
{
TPD_DMESG("ft6336 add errortouch panel driver.\n");
i2c_del_driver(&tpd_i2c_driver);
return -1;
}
g_ic_version = 0x6336;
strcpy(g_ctp_ic_name,tpd_i2c_driver.driver.name);
wake_lock_init(&ctp_fwup_lock,WAKE_LOCK_SUSPEND, "ctp_fwup_lock");
。。。
。。。
}
如果是合力泰ctp,在msg2138a_p2/msg2138a_driver.c/tpd_local_init(void)里面,系统会运行到g_ic_version = 0x2138a;这一步,
如果不是合力泰ctp,系统在 if(i2c_add_driver(&tpd_i2c_driver)!=0)
就会出错退出。
staticinttpd_local_init(void)
{
TPD_DMESG("Mstar msg2138aI2C Touchscreen Driver (Built %s @ %s)\n", __DATE__, __TIME__);
if(i2c_add_driver(&tpd_i2c_driver)!=0)
{
TPD_DMESG("msg2138aunable to add i2c driver.\n");
printk("han_msg2133 unable to add i2c driver.\n");
return -1;
}
if(tpd_load_status == 0)
{
TPD_DMESG("msg2138a adderror touch panel driver.\n");
i2c_del_driver(&tpd_i2c_driver);
return -1;
}
g_ic_version = 0x2138a;
strcpy(g_ctp_ic_name,tpd_i2c_driver.driver.name);
wake_lock_init(&ctp_fwup_lock,WAKE_LOCK_SUSPEND, "ctp_fwup_lock");
。。。
。。。
}
6. camera录像前4S噪音严重问题
原因分析:P2的camera录像前4S噪音是,由于连接主板和小板的FPC上,mic线和喇叭线处于平行状态,且距离比较近;在喇叭的PA打开时,喇叭线上的小信号会耦合到mic线上从而导致了杂音;在录像的时候滴的一声会持续PA打开状态4S钟,从而导致了前4S的噪音很大,而4S之后噪音就会消失,或者使用耳机来进行录音也不会有噪音问题。
解决方法:
1、FPC从硬件上重新走线,杜绝这样的干扰问题;
2、在硬件无法改善情况下,去掉camera录像时候的滴的一声;
3、微信聊天这样的应用场景也会遇到同样的问题,为了错开喇叭和mic同时工作,减小PA关闭的时间:
需要修改下面的部分:
alps\frameworks\av\services\audioflinger\AudioFlinger.h
//modified the mic noise, decrease the speaker PA closing time,etonguotao 2014-11-27
Static constnsecs_tkDefaultStandbyTimeInNsecs= seconds(0.3); //3S, 0.3S
将3S改为0.3S或者更低一些。
7. 按power键亮屏速度慢问题
原因及解决方法:
各驱动的resume函数里面的延时,还有充电驱动里面的线程的延时需要重新查看,和原始的代码进行比较;除了一些必要的延时,其他的延时都要去掉,还有一些经常打的log也要去掉,加快按power键亮屏的速度。
如下代码:
alps\mediatek\custom\common\kernel\lcm\hx8379c_dsi_vdo\hx8379c_dsi_vdo.c
staticstructLCM_setting_tablelcm_sleep_out_setting[] = {
// Sleep Out
{0x11, 0, {0x00}},
{REGFLAG_DELAY, 120, {}}, //150
// Display ON
{0x29, 0, {0x00}},
{REGFLAG_DELAY, 10, {}},
{REGFLAG_END_OF_TABLE, 0x00, {}}
};
alps\mediatek\platform\mt6752\kernel\drivers\power\pmic_chr_type_det.c
static void hw_bc11_init(void)
{
/*[eton begin]:Modify by jorgenat 2014-11-11
*[reason]:经测试,在此无需延时300ms,也会造成唤醒速度变慢。
*/
//msleep(300);
/*[eton end]*/
Charger_Detect_Init();
//RG_bc11_BIAS_EN=1
mt6325_upmu_set_rg_bc11_bias_en(0x1);
//RG_bc11_VSRC_EN[1:0]=00
mt6325_upmu_set_rg_bc11_vsrc_en(0x0);
//RG_bc11_VREF_VTH = [1:0]=00
mt6325_upmu_set_rg_bc11_vref_vth(0x0);
……
}
alps\mediatek\custom\common\kernel\touchpanel\ft6336_p2\ft6336_ts.c
static int tpd_resume(structi2c_client *client)
{
intretval = TPD_OK;
char data;
TPD_DEBUG("TPD wake up\n");
#ifdef FTS_GESTURE
chargesture_close= 0;
TPD_DMESG("tpd_resumegesture_switch= %d \r\n", gesture_switch);
printk("tpd_resume()/11\n");
if (gesture_switch== 1)
{
gesture_switch= 0;
printk("%s,setgesture_switchto 0, =%d\n",__func__, gesture_switch);
i2c_smbus_write_i2c_block_data(i2c_client,0xd0, 1, &gesture_close);
printk("tpd_resume()/22\n");
}
#endif
#ifdefTPD_CLOSE_POWER_IN_SLEEP
hwPowerOn(TPD_POWER_SOURCE,VOL_3300,"TP");
#else
#ifdef MT6573
mt_set_gpio_mode(GPIO_CTP_EN_PIN,GPIO_CTP_EN_PIN_M_GPIO);
mt_set_gpio_dir(GPIO_CTP_EN_PIN,GPIO_DIR_OUT);
mt_set_gpio_out(GPIO_CTP_EN_PIN,GPIO_OUT_ONE);
#endif
mt_set_gpio_mode(GPIO_CTP_RST_PIN,GPIO_CTP_RST_PIN_M_GPIO);
mt_set_gpio_dir(GPIO_CTP_RST_PIN,GPIO_DIR_OUT);
mt_set_gpio_out(GPIO_CTP_RST_PIN,GPIO_OUT_ZERO);
//msleep(20);
mdelay(10);
mt_set_gpio_mode(GPIO_CTP_RST_PIN,GPIO_CTP_RST_PIN_M_GPIO);
mt_set_gpio_dir(GPIO_CTP_RST_PIN,GPIO_DIR_OUT);
mt_set_gpio_out(GPIO_CTP_RST_PIN,GPIO_OUT_ONE);
msleep(310); //是否可以考虑减小?
#endif
mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM);
if((i2c_smbus_read_i2c_block_data(i2c_client,0x00, 1, &data))< 0)
{
TPD_DMESG("resumeI2C transfer error, line: %d\n", __LINE__);
}
tpd_up(0,0,0);
input_sync(tpd->dev);
printk("tpd_resume()/33\n");
TPD_DMESG("TPDwake up done\n");
gesture_switch =0;
printk("%s,setgesture_switchto 1, =%d\n",__func__, gesture_switch);
returnretval;
}
8. sdcard热插拔导致系统重启问题
原因分析:
Sdcard的中断脚接上了3.3V的电压,原本是1.8V的IO口,导致了中断脚电源域电压偏高不稳定,导致不可预知的问题,比如GPU传输失败等;
解决方法:
去掉Sdcard的中断脚连接的电阻,从硬件上断开,如果只是修改codegen.dws文件还是会存在死机重启问题。
9. 80%电量拔电池重开机电量显示不足问题
问题原因及解决方法:
当待机电流很大,比如200mA时,需要在系统唤醒的时battery的resume函数里去重新检测电量,然后用这个电量再进行电量计算,代码如蓝色部分:
重新计算电量,才不会导致80%电量200mA待机电流8小时以上,然后拔电池重新开机电量确实3%的低电的情况。
g_spm_timer = NORMAL_WAKEUP_PERIOD; // 90 min
alps\mediatek\kernel\drivers\power\battery_meter_p2.c
staticintbattery_meter_resume(structplatform_device *dev)
{
#if defined(CONFIG_POWER_EXT)
#elifdefined(SOC_BY_SW_FG) || defined(SOC_BY_HW_FG)
#if defined(SOC_BY_SW_FG)
kal_int32 hw_ocv_after_sleep;
#endif
structtimespecxts, tom,rtc_time_after_sleep;
#ifdef MTK_POWER_EXT_DETECT
if(KAL_TRUE ==bat_is_ext_power())
return 0;
#endif
get_xtime_and_monotonic_and_sleep_offset(&xts,&tom, &rtc_time_after_sleep);
_g_bat_sleep_total_time += rtc_time_after_sleep.tv_sec- g_rtc_time_before_sleep.tv_sec;
battery_xlog_printk(BAT_LOG_CRTI,"[battery_meter_resume] sleep time = %d, g_spm_timer = %d\n",_g_bat_sleep_total_time, g_spm_timer);
#if defined(SOC_BY_HW_FG)
#ifdef MTK_ENABLE_AGING_ALGORITHM
if(bat_is_charger_exist() == KAL_FALSE)
{
battery_aging_check();
}
#endif
#endif
if(_g_bat_sleep_total_time // etonguotao 2014-11-03 // this will keep battery levelno change after sleep long and resume // return 0; } bat_spm_timeout = true; #if defined(SOC_BY_SW_FG) battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_OCV,&hw_ocv_after_sleep); if(_g_bat_sleep_total_time>3600) //1hr { /*[eton begin]: Modify by Jorgen at2014-7-10 [reason]:Fixed the problem that thecapacity will keep a long time at one level */ if(hw_ocv_after_sleep !=g_hw_ocv_before_sleep) { gFG_DOD0 =fgauge_read_d_by_v(hw_ocv_after_sleep); oam_d0 = gFG_DOD0; //etonguotao 2014-11-03 oam_v_ocv_2 =oam_v_ocv_1 = hw_ocv_after_sleep; oam_car_1 =oam_car_1 + (10* (rtc_time_after_sleep.tv_sec -g_rtc_time_before_sleep.tv_sec)/3600);; oam_car_2 =oam_car_1 + (10* (rtc_time_after_sleep.tv_sec -g_rtc_time_before_sleep.tv_sec)/3600);; } else { oam_car_1 =oam_car_1 + (40* (rtc_time_after_sleep.tv_sec -g_rtc_time_before_sleep.tv_sec)/3600); //0.1mAh oam_car_2 =oam_car_2 + (40* (rtc_time_after_sleep.tv_sec -g_rtc_time_before_sleep.tv_sec)/3600); //0.1mAh } //etonguotao 2014-11-03 //if suspend current verylarge, it need reset FG meter data, //and calculate batteryvoltage level in resume func. if(upmu_is_chr_det() ==KAL_FALSE ) { g_bat_cap_after_sleep= fgauge_read_capacity_by_v(hw_ocv_after_sleep); BMT_status.SOC =BMT_status.UI_SOC = g_bat_cap_after_sleep; battery_meter_reset(); } /*[eton end]*/ } else { oam_car_1 = oam_car_1 +(20* (rtc_time_after_sleep.tv_sec - g_rtc_time_before_sleep.tv_sec)/3600);//0.1mAh oam_car_2 = oam_car_2 +(20* (rtc_time_after_sleep.tv_sec - g_rtc_time_before_sleep.tv_sec)/3600);//0.1mAh } bm_print(BM_LOG_CRTI,"sleeptime=(%d)s, be_ocv=(%d), af_ocv=(%d), D0=(%d), car1=(%d), car2=(%d)\n", rtc_time_after_sleep.tv_sec- g_rtc_time_before_sleep.tv_sec, g_hw_ocv_before_sleep, hw_ocv_after_sleep,gFG_DOD0, oam_car_1, oam_car_2); #endif #endif bm_print(BM_LOG_CRTI, "[battery_meter_resume].--eton--oam_v_ocv_2=%d, oam_v_ocv_1=%d, oam_car_1=%d, oam_car_2=%d\n", oam_v_ocv_2,oam_v_ocv_1, oam_car_1, oam_car_2); return 0; } 10. 开关机充电曲线差异较大问题 原因及解决方法: 1)、P2采用的是脉冲充电的方式,充9秒钟,然后停1秒钟的形式,d5_count_time决定充电的每一步的时间,稍微增加d5_count_time值,可以使充电曲线变得平滑,但是不能加得过大,否则会导致电压上升太高,而显示示数确很低; Void oam_run(void) { … if(gFG_Is_Charging == KAL_FALSE) { d5_count_time = 80; //eton update by jorgen at 2014-7-10 d5_count_soc_99 = 0; } /*[eton end]*/ else { charging_current = get_charging_setting_current(); charging_current = charging_current / 100; // charging_current -= 150; //BMT_status.ICharging; d5_count_time_rate =(((gFG_BATT_CAPACITY_aging*60*60/100/(charging_current-50))*10)+5)/10; if(d5_count_time_rate < 1) d5_count_time_rate =1; //调节d5_count_time的值,可以调节充电的每一步的时间, //如果d5_count_time = 80,那么充电的每一步的检测时间是:80秒 //如果80秒之后,电压达到了预定的电池曲线的电压值,电量就会加1 d5_count_time =d5_count_time_rate; } … } 2)、由于充电电流2A太大,容易导致电池电量虚高的问题,可以在这个读取电量的函数中,在读取电量的时候,停掉充电,读完之后再恢复充电。 kal_int32 battery_meter_get_battery_voltage(kal_boolupdate) { int ret=0; intval=5; staticintpre_val = -1; if(update == KAL_TRUE || pre_val == -1) { val= 5; //set avg times //begin modified, etonguotao2014-11-11 #if 1 if(upmu_is_chr_det() == KAL_TRUE) { kal_boolcharging_enable =KAL_FALSE; /*stop charging for vbatmeasurement*/ battery_charging_control(CHARGING_CMD_ENABLE,&charging_enable); msleep(100); } #endif #ifdef MTK_MAX77819_SUPPORT val =get_battery_voltage_by_max77819(); #else ret =battery_meter_ctrl(BATTERY_METER_CMD_GET_ADC_V_BAT_SENSE, &val); #endif #if 1 if(upmu_is_chr_det() == KAL_TRUE) { kal_boolcharging_enable =KAL_TRUE; /*stop charging for vbatmeasurement*/ battery_charging_control(CHARGING_CMD_ENABLE,&charging_enable); // msleep(100); } #endif //end modified, etonguotao pre_val= val; } else { val = pre_val; } g_sw_vbat_temp = val; #ifdef MTK_BATTERY_LIFETIME_DATA_SUPPORT if(g_sw_vbat_temp>gFG_max_voltage) { gFG_max_voltage =g_sw_vbat_temp; } if(g_sw_vbat_temp { gFG_min_voltage = g_sw_vbat_temp; } #endif returnval; } 11. 距离传感器动态校准方案。 Q1:p2的p-sensor动态校准方法和实施细节是什么? 一).p-sensor的动态校准,即在打电话时,采集此时的psensor远离值,以这组数据的远离值的最小值min-crosstalk + Hoffset为贴近关屏门限值,min-crosstalk + Loffset为远离开屏的门限值。其中Hoffset值为工厂采集100组数据得到的3cm的读值- 远离无遮挡的读值的平均值;Loffset值为工厂采集100组数据得到的5cm的读值- 远离无遮挡的读值的平均值. 这样做的好处是手机在使用过程中由于结构的变化导致距离传感器的读值与出厂设置的值差别很大时,仍能保证使用,缺点是门限值的误差可能会在±0.5cm。 二).实施细节 1).整体代码移植可将\alps\mediatek\custom\common\kernel\alsps\EPL2182_p2整个文件夹目录进行拷贝,粘贴,重命名为项目文件名,在ProjectConfig.mk修改alsps相关配置。 2).相关修改 以\alps\mediatek\custom\common\kernel\alsps\EPL2182_p2为例 (1)配置动态校准的距离远、近门限值 修改epl2182.c文件中 #define DYN_H_OFFSET 867//靠近门限值 #define DYN_L_OFFSET 335//远离门限值 (2)配置黑屏手势的距离远、近门限值 修改epl2182.h文件中 #define PS_HIGH_OFFSET (867)//靠近门限值 #define PS_LOW_OFFSET (335)//远离门限值 (3)默认黑屏手势的距离远、近门限值修改(主要防止工厂工人在测试时忘记点击校准按钮) 修改epl2182.h文件中 #define CALI_HIGH_THRESHOLD 1500(这个是远离值+靠近门限值) #define CALI_LOW_THRESHOLD 900(这个是远离值+远离门限值) 3).靠近门限和远离门限的得来: 这个是项目经理安排工厂采集100组数据,必须使用灰卡测量3.5cm和5.5cm,还有黑卡0.5cm和远离时的读值,共四种数据。 其中靠近门限值= 灰卡测量3 cm - 远离值的平均值。 远离门限值=灰卡测量5cm-远离值的平均值。 0.5cm主要为了看黑头发的问题。 注意事项:每次采集数据必须写清楚测量方法和测量数据要求,不然工厂会给出意想不到的结果。 要求可以这样写: 请帮忙测量采集灰卡3.5cm,灰卡5.5cm,黑卡0.5cm和无遮挡时的读值,共四种,100组 Q2 工厂校准的作用是什么? 由于我们使用的是动态校准,如果在打开距离传感器时,通光空被遮挡,这样取得的读值就会很大,会被判定为远离。所以这点是和我们黑屏手势口袋模式相悖的,为了使我们的黑屏手势能继续使用,我们会在返回远离和贴近给上层时判断是不是处于黑屏手势状态,如果是的话,我们就不能使用动态校准,我们会以工厂校准的参数计算出门限值作为黑屏手势模式下的门限值。另外也可以通过校准来判断是不是结构和组装的问题。 Q3 需要注意哪些? i及时与项目经理沟通项目进度,协调安排工厂采集数据进度。 ii每次采集数据必须写清楚测量方法和测量数据要求,邮件到工厂,不然工厂会给出意想不到的结果。 iii对采集数据要进行及时的分析,以确保结构是否合理,来保证psensor的一致性。 12. MODEM 卡识别问题:由于硬件设计,将SIM AB卡标识反,由于硬件修改困难,成本高,所以通过修改MODEM,软件解决此问题。 13. P2 待机电流大问题。 硬件测试组反馈P2手机待机电流大,经检查,发现driver only版本不存在问题。因此怀疑是三方应用集成造成的问题,将外置三方应用全部删除以后,发现待机电流会下来,证明跟三方应用有关系。之后利用二分法,将所用三方应用分组,一一检查,发现是软件商店,游戏世界及书城三个应用造成,有的应用频繁唤醒系统,比较容易查出,有的应用,5分钟才唤醒系统一次,需要花大量时间去检查,费时费力。三方给了新包以后,还要PUSH 到手机,恢复出厂设置,重新检查电流。以后的项目建议测试组需要对三方应用做电流测试。 14. 前camera工厂模式测试偏绿问题 这个问题从现象上看是shading参数没跑,导致模组预览拍照四周偏绿。后来发现只有进入工厂模式之后才会出现这种现象。通过抓取相关log可以看出工厂模式的camera确实没有调用到shading这块参数,修改工厂模式相关代码,让其可以调用到shading参数问题得到解决。 15. 打开美颜,录完像后,相机卡死问题 原因分析: 这个问题是由于加大了预览分辨率,而美颜的预览分辨率要求比较低,过大的预览分辨率会导致buffer的溢出,从而导致卡死。 解决方法: 当打开美颜功能后,自动调低预览分辨率,关闭美颜后再恢复大分辨率预览。 问题升级: 上面是一种单独使用美颜的情况,还有一种就是按照上面的方法修改后,跟手势一起组合使用,还是会导致卡死的现象,针对这种现象的做法就是,做互斥,当打开手势的时候,关闭美颜的功能,这样做就可以避免卡死的问题。 四、 其它总结/建议 1.Launcher 固定位置图标应用,目前跟包名,类名绑定,但三方常常改变包名和类名。我方 Launcher 能否改成绑定 APK 名,或者从APK 中自动获取包名,类名,这样能减少集成三方应用之后出现的ICON 丢失的问题。 2.三方应用集成后,部分会导致待机电流大的问题,能否让测试组,验证三方应用的时候,增加一项检查,即三方应用对待机电流的影响的测试,这样免得项目后期发现待机电流大,再去查找的问题。 3. 英文模式,如果不去掉的话,建议大家别忘记检查这一项。添加资源的时候,别忘记两者都需要添加。 4. 超大字体,以后在小屏幕上,都不打开,建议策划写入文档,不然每个项目,都后期都纠结这个问题。 5. 量产前过BUG,是高效的做法,应该坚持。免得跟品质过的时候,无解决方案。 6. 运营商定制,什么情况下,选OP01,OP02问题。