Android Go项目 来电铃声与UI不同步问题

问题:Android R Go项目,来电时,来电铃声响起后,来电UI需要7-8秒才显示,甚至来电结束后都无法显示

根因:来电铃声在“Telecom”中,来电界面是在incallui,所以来电铃声会比界面快。这个问题在中高性能手机中也存在,但时间差很小,用户无法感知。在Android Go中,时间差比较大。根本原因在于Android的默认设计和平台的性能。

方案1:在MTK的FAQ中提供过一个参考方案(问题不同,方案可参考),Telecom不直接播放铃声,提供接口出来,由UI这边调用播放铃声。这个方案有个前提,需要修改Dialer端代码。

参考:[FAQ14322] 【Phone Call】关于来电响铃与UI同步的Workround方法

由于我们使用GoogleDialer,此方案不可行。

方案2:在使用GoogleDialer的情况下,UI是由Dialer发起的,没有源码,无法做到在发起UI的时候调用铃声,因此只能提供其他方式。

a)铃声延时播放,此问题仅能解决来电铃声与UI有明显规律的情况,即差异在不同场景下比较小,例如2秒,则可以考虑铃声延时1.5s播放。在CallAudioManager.java.中延时播放铃声。此修改会导致概率性UI先显示,来电铃声后播放,差异不大的情况下,可以接受

b)设置apk为odex status为speed mode,优先效果不明显

c)在来电的时候进行fastkill,释放内存出来。优化效果明显。(参考camera的fastkill修改)

在来电的时候,会创建dialer进程,在创建进程时,调用fastkill,最后会调用到lmkd中进程快速杀进程。fastkill的规则:一个是设置的fast_kill_mem,为设置的规定参数。例如100MB。

另外一个规则是杀进程的oom_adj,为设置的规定参数,例如400.

static int find_and_kill_multi_processes(int min_score_adj, int kill_reason, const char *kill_desc,
                                 union meminfo *mi, struct timespec *tm) {
    int i;
    int killed_size = 0;
    bool lmk_state_change_start = false;
    ALOGI("find_and_kill_multi_processes");

    for (i = OOM_SCORE_ADJ_MAX; i >= min_score_adj; i--) {
        struct proc *procp;

        while (true) {
            procp = kill_heaviest_task ? proc_get_heaviest(i) :
                    (lmkd_config_enabled ? proc_adj_lru_skip(i) : proc_adj_lru(i));

            if (!procp)
                break;

            if (is_fast_kill_skip_process(procp, kill_desc))
                break;

            killed_size += kill_one_process(procp, min_score_adj, kill_reason, kill_desc, mi, tm);
            if (killed_size >= 0) {
                if (!lmk_state_change_start) {
                    lmk_state_change_start = true;
                    stats_write_lmk_state_changed(
                            android::lmkd::stats::LMK_STATE_CHANGED__STATE__START);
                }
            }
             ALOGI("befault fast kill reclaim %dKB, required memory %dKB, last killed process's adj %d",
                           killed_size, fast_kill_mem * 1024, i);
            if (strstr(kill_desc, "<do fast kill>")) {
                if (killed_size > fast_kill_mem * 1024) {
                    ALOGI("fast kill reclaim %dKB, required memory %dKB, last killed process's adj %d",
                           killed_size, fast_kill_mem * 1024, i);
                    goto fast_kill_finished;
                }
            }
        }
    }

fast_kill_finished:
    if (lmk_state_change_start) {
        stats_write_lmk_state_changed(android::lmkd::stats::LMK_STATE_CHANGED__STATE__STOP);
    }

    if (enhance_meminfo_enable && (killed_size > 0))
        trigger_enhance_meminfo(min_score_adj);

    return killed_size;
}

1G RAM的修改后的效果比较好,高负载情况下7-8秒下降为3-4秒。中低负载在1秒内。

方案3:常驻进程-需要修改AndroidManifest.xml,没有源码无法实现,有源码可以考虑

方案4:进程保活-将Dailer进程保活

这个实现也是基于sprd,需要设置内存级别,在内存压力的什么级别下保活,即被kill之后,会自动重启。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值