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<g_spm_timer) {
// 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 )
{
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問題。