V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tool2dx
V2EX  ›  Android

开发 APK 在澎湃 OS 上举步维艰。

  •  
  •   tool2dx · 20 天前 · 6421 次点击

    我想写一个后台定时服务代码,用来 10 分钟后自动熄灭小米平板屏幕的程序。

    在安卓模拟器和以前的 MIUI 系统上,运行完全没问题,一放到澎湃 OS 上,服务就老是被冻结。(以前 MIUI 内存不足是直接杀服务,由于设置了 START_STICKY ,5 秒钟后会被系统自动拉起来,包括安卓 14 模拟器也是走这个流程)

    查了一下,是一个 com.miui.powerkeeper 的进程干的好事。我用 ADB 设置了 RUN_ANY_IN_BACKGROUND allow, deviceidle whitelist +[应用的包名], 电池无优化,都会随机不定时被冻结,百思不得其解。

    而且如果调试程序 XML 里有后台隐私相关权限,比如 READ_CLIPBOARD_IN_BACKGROUND/GET_TASKS ,包名会被 com.miui.powerkeeper 拉黑,现象是无法弹出电池优化的按钮。解决方法是把权限去掉+换包名字。

    42 条回复    2024-11-18 21:19:22 +08:00
    magicls
        1
    magicls  
       20 天前
    试试先正向,先在什么手机管家,安全管家里面,找找入口,把自己的应用加白名单。然后 recents 里面把自己锁定。另外请求一下忽略电池优化,把自己加白。

    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

    @RequiresApi(api = Build.VERSION_CODES.M)
    public void requestIgnoreBatteryOptimizations() {
    try {
    Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
    intent.setData(Uri.parse("package:" + getPackageName()));
    startActivity(intent);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    这些都不行的话,再考虑 adb 那些骚操作。
    tool2dx
        3
    tool2dx  
    OP
       20 天前
    @magicls 试过了,好像没用,我代码里有申请这个权限。

    用的是这个代码,感觉和设置里的省电策略 = 无限制是一回事。

    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    if (pm != null && !pm.isIgnoringBatteryOptimizations(packageName))
    {
    intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
    ...
    }
    tool2dx
        4
    tool2dx  
    OP
       20 天前
    @minami 我把 com.miui.powerkeeper 关掉后,运行很完美。但总觉得好奇葩,在要不要改自己代码和关闭 com.miui.powerkeeper 之间反复纠结。
    tsja
        5
    tsja  
       20 天前
    不懂安卓开发, 要开发 App, 都要针对性适配每家的定制系统吗?
    tool2dx
        6
    tool2dx  
    OP
       20 天前
    @tsja 自从澎湃 OS 需要 APP 备案后,应该有一个黑白名单列表给你的应用打分。分数越低,就越容易被后台冻结(我猜的)

    还是怀念以前的 MIUI ,没那么多限制。
    bkmi
        7
    bkmi  
       20 天前
    这个真不能怪小米,你要保活服务就按照 Android 官方的规范来申请前台服务,或者试试 JobScheduler (我估计不行);
    READ_CLIPBOARD_IN_BACKGROUND 就只能怪 Google 垃圾,不给开发者一点余地,直接一刀切,我都是 Root 了用 Xposed 绕过。
    minami
        8
    minami  
       20 天前   ❤️ 1
    @tool2dx #4 等你啥时候认识到小米的产品只配买来刷机,你就米粉入门了;等你啥时候认识到小米的产品买回来并不赚的时候,你就米粉毕业了
    minami
        9
    minami  
       20 天前
    @bkmi 划重点,“包括安卓 14 模拟器也是走这个流程”
    bkmi
        10
    bkmi  
       20 天前
    另外印象中 READ_CLIPBOARD_IN_BACKGROUND 这个权限只能系统应用申请,普通应用是无法申请的
    xloger
        11
    xloger  
       20 天前
    如果用小米自带的“自动任务”来实现呢?靠它实现按规律唤起某个 App ,然后 App 再执行某些操作?
    lisongeee
        12
    lisongeee  
       20 天前
    我以前在上面开发的时候,在后台新启动子线程 thread{} 里面的代码竟然不执行,需要把界面切到前台才会执行
    tool2dx
        13
    tool2dx  
    OP
       20 天前
    @xloger 我是通过路由器调用 adb ,来远程启动小米平板上指定 service ,唤醒 APP 不是问题,保活是个难题。

    我已经准备改成在路由器定时 10 分钟,之后再调用 adb 指令了 -_-
    shily
        14
    shily  
       20 天前
    没有提到 前台服务,开启前提服务也不行吗?
    https://developer.android.com/develop/background-work/services/foreground-services?hl=zh-cn
    JensenQian
        15
    JensenQian  
       20 天前   ❤️ 2
    国内安卓不这么压,流氓软件,三 A 大作,塞虚幻引擎的聊天软件不然根本压不住啊
    只有流氓才能打败流氓
    reallittoma
        16
    reallittoma  
       20 天前
    在 MIUI 上开发也难用,合理怀疑所有国产 UI 都难用。后来买了一台二手美版三星做开发机,舒服了。
    GotKiCry
        17
    GotKiCry  
       20 天前
    @JensenQian 这你这么说不矛盾吗。现在厂商都是给虚幻聊天软件白名单
    anjingdexiaocai
        18
    anjingdexiaocai  
       20 天前 via Android
    现在只有提高 app 的活跃等级才行,也就是让系统认为你是处于前台,目前合规的办法只有前台服务。
    JensenQian
        19
    JensenQian  
       20 天前
    @GotKiCry 哈哈哈
    3A 聊天软件,还得开白名单
    dntilee
        20
    dntilee  
       20 天前
    我在国内工作最开心的日子是在小米写系统应用的日子,不用担心任何权限
    CSGO
        21
    CSGO  
       20 天前
    root 。取消白名单
    dupenn
        22
    dupenn  
       20 天前
    @tool2dx #6 没有限制的话就全靠开发者自觉了,但是开发者会自觉吗?
    icestraw
        23
    icestraw  
       20 天前   ❤️ 1
    感觉问题出在“操作系统功能”上,也就是关屏幕,这个权限理论上应该只有无障碍应用能操作。

    任何系统,写后台操作系统功能的代码,都不应该太容易,不然很容易就变成神仙打架。不然任何程序只要加一句你这个代码,就可以无限制保活,那生态也太乱了。
    bzkmsjy
        24
    bzkmsjy  
       20 天前
    audiorelay 在澎湃上也无法保持后台,root 了也不知道有什么办法保活,酷安上我也发过帖,没找到办法
    tool2dx
        25
    tool2dx  
    OP
       20 天前
    @icestraw 关屏幕是用户自己在设置里授权 APP 操作的,这个问题不大。后台其实安卓官方有提供电源管理选项,每一个 APP 设置都是可选的。小米的手机管家是二次封装,如果直接沿用谷歌的电池管理系统,就没有那么多麻烦事情了。
    109021017
        26
    109021017  
       20 天前
    @shily 是啊, 不知道小米行不行, 但别的 Android 需要用 Foreground Services. 然后电池优化要关闭.
    icestraw
        27
    icestraw  
       20 天前   ❤️ 3
    @tool2dx 关屏幕权限,从设计上看,理论上是应该控制“当你使用过程中”关屏幕,而不是“离开前台程序后”关屏幕。前者是 App 的正常操作,后者则是权限要求非常高的系统工具。对于国产 ROM 面对的恶劣安卓环境,策略严格一些感觉可以理解。

    其实 无障碍 这个权限 已经有些滥用了,现在百度啊甚至小红书都有声明这个权限,这些软件哪里会需要这个功能...不得不防啊
    lisxour
        28
    lisxour  
       20 天前
    之前不是出过一个黑科技保活的嘛,试试?百度、github 现在应该还能搜到
    gmx1234
        29
    gmx1234  
       20 天前
    @tool2dx 可以试试 Jetpack 中的 WorkManger
    Ruikoto
        30
    Ruikoto  
       20 天前
    我使用世界迷雾(后台记录 GPS 位置)的时候也有保活问题,如果放在后台,记录出的轨迹就会断断续续,这个问题苦恼我好久了,不知作为用户是否有什么办法
    jarvay
        31
    jarvay  
       20 天前
    https://github.com/Jarvay/workpaper-android
    这个是我写的定时换壁纸工具,用的是 29 楼说的 WorkManager ,service 设置成前台+省电策略无限制在澎湃上就能正常执行定时任务
    jarvay
        32
    jarvay  
       20 天前
    @jarvay 搞错了,定时任务的话是闹钟
    wdv2ly
        33
    wdv2ly  
       19 天前 via Android
    @reallittoma 哥们儿你这不是掩耳盗铃嘛?你开发舒服了,你的用户不舒服了哈哈
    behindeye
        34
    behindeye  
       19 天前
    开启前台服务+开启悬浮窗权限+后台运行开启+电池优化+使用 WorkManager 试试
    okakuyang
        35
    okakuyang  
       19 天前   ❤️ 1
    我说实话,你这个标题和你的内容有夸大的成分。你要开发一个能够熄屏的程序而且是在后台,这个已经大大超出一般 App 的职能范围。遇到坑也是可以预见的,省电管理程序,白名单已经是各家手机厂的基本操作,不存在小米一家这么做。如果我要做这功能我肯定首先要在更加简洁的固件上去开发。
    tool2dx
        36
    tool2dx  
    OP
       19 天前
    @okakuyang 我有多个小米设备,自用手机还是 MIUI14 的,测试平板上是澎湃 OS 。前一个运行没问题,后一个厂家白名单,那我肯定是吐槽后者了。

    弄得我现在都不敢升级设备 OS 了。
    linlord
        37
    linlord  
       19 天前
    @GotKiCry #17 该死的微信非得要自启动权限才能接到消息
    h1298841903
        38
    h1298841903  
       19 天前
    @tsja 各家都有各家的 bug
    lucifer9
        39
    lucifer9  
       18 天前
    小米的系统最离谱的是用户手动设置了允许自启动的应用
    系统隔一段时间会随机帮用户取消几个自启动权限
    要是说总数会有限制,起码明确写出来啊
    tyzandhr
        40
    tyzandhr  
       18 天前 via Android
    设置前台服务并且显示通知了吗?现在 Android 规范里面就是只有前台服务能够保证一直运行。或者,你也可以用 WorkManager 。
    RikkaW
        41
    RikkaW  
       17 天前
    READ_CLIPBOARD_IN_BACKGROUND 和 GET_TASKS 不是普通应用都用不了吗(
    reallittoma
        42
    reallittoma  
       15 天前
    @wdv2ly #33 还好吧,我的用户主要是海外用户
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3093 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:29 · PVG 22:29 · LAX 06:29 · JFK 09:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.