IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android Go项目 来电铃声与UI不同步问题 -> 正文阅读

[移动开发]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秒内。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-27 14:12:28  更:2021-09-27 14:15:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:41:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码