前言

本文为继RK3128 Android 7 BOX SDK 修改为MID界面 与 RK3128 Android 7 BOX SDK 修改为MID界面-近期任务 后续.

问题

三方应用无法通过接收开机完成广播(BOOT_COMPLETED)完成自启.

LOG如下

Unable to launch app com.test/10033 for broadcast Intent
{ act=android.intent.action.BOOT_COMPLETED flg=0x9000010 (has extras) }: process is bad

分析解决

首先, LOG输出的位置:

frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java

if ((r.curApp=mService.startProcessLocked(targetProcess,info.activityInfo.applicationInfo, true,r.intent.getFlags() | Intent.FLAG_FROM_BACKGROUND,"broadcast", r.curComponent,(r.intent.getFlags()&Intent.FLAG_RECEIVER_BOOT_UPGRADE) != 0, false, false))== null) {// Ah, this recipient is unavailable.  Finish it if necessary,// and mark the broadcast record as ready for the next.Slog.w(TAG, "Unable to launch app "+ info.activityInfo.applicationInfo.packageName + "/"+ info.activityInfo.applicationInfo.uid + " for broadcast "+ r.intent + ": process is bad");

frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

final ProcessRecord startProcessLocked(String processName,ApplicationInfo info, boolean knownToBeDead, int intentFlags,String hostingType, ComponentName hostingName, boolean allowWhileBooting,boolean isolated, boolean keepIfLarge) {return startProcessLocked(processName, info, knownToBeDead, intentFlags, hostingType,hostingName, allowWhileBooting, isolated, 0 /* isolatedUid */, keepIfLarge,null /* ABI override */, null /* entryPoint */, null /* entryPointArgs */,null /* crashHandler */);}final ProcessRecord startProcessLocked(String processName, ApplicationInfo info,boolean knownToBeDead, int intentFlags, String hostingType, ComponentName hostingName,boolean allowWhileBooting, boolean isolated, int isolatedUid, boolean keepIfLarge,String abiOverride, String entryPoint, String[] entryPointArgs, Runnable crashHandler) {//...省略中间代码...if((("true".equals(SystemProperties.get("ro.config.low_ram", "false")))||("true".equals(SystemProperties.get("ro.mem_optimise.enable", "false")))) && (!"true".equals(SystemProperties.get("cts_gts.status", "false")))){final ActivityRecord next = getFocusedStack().topRunningActivityLocked();if(next!= null && (!next.packageName.equals(processName)&& !processName.contains("antutu")) && next.packageName.contains("antutu")){if(DEBUG_LOWMEM)Slog.v("xzj", "process dont start because for antutu: " + next.packageName + "/" + info.processName);return null;}if((mProcessMap.get(processName) != null) && (("broadcast".equals(hostingType))||("content provider".equals(hostingType)))){if(DEBUG_LOWMEM)Slog.v("xzj", "process dont start because for filter: " + info.uid + "/" + info.processName);return null;}if((mServiceMap.get(processName) != null)&&("service".equals(hostingType))&&((info.flags & ApplicationInfo.FLAG_IS_GAME) !=0))//for service start by system{if(DEBUG_LOWMEM)Slog.v("xzj", "service dont start auto because for filter: " + info.uid + "/" + info.processName);return null;  }if(((info.flags & ApplicationInfo.FLAG_SYSTEM) ==0)&&("broadcast".equals(hostingType))){//从这里返回if(DEBUG_LOWMEM)Slog.v("xzj", "third part process dont start for broadcast: " + info.uid + "/" + info.processName);return null;}if(mGameMap.get(processName) != null){killAllBackgroundProcesses();if(DEBUG_LOWMEM)Slog.v("xzj", "----clean memory for start " + info.processName);  }}

基本可以定位问题点, 进一步验证:

//获取属性值:
rk3128_box:/ $ getprop ro.mem_optimise.enable
true

判断非系统应用则返回处理.

if(((info.flags & ApplicationInfo.FLAG_SYSTEM) ==0)&&("broadcast".equals(hostingType)))

ro.mem_optimise.enable从属性名可以推断出这是为了优化低内存平台的用户体验, 减少自启应用以降低系统的内存占用率.

解决的方案:

  1. ro.mem_optimise.enable 设置为false
  2. 以上代码中增加白名单, 允许指定第三方应用自启

眠休不黑屏

设置休眠15秒后, 屏幕只是变暗而不关闭:

diff --git a/device/rockchip/common/tv/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/device/rockchip/common/tv/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
index 40021f719c..92bdfb40b9 100644
--- a/device/rockchip/common/tv/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
+++ b/device/rockchip/common/tv/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
@@ -26,7 +26,7 @@<bool name="def_device_provisioned">true</bool><!-- Keep screen on at all times by default -->
-    <bool name="def_stay_on_while_plugged_in">true</bool>
+    <bool name="def_stay_on_while_plugged_in">false</bool><!-- Do not give up on DHCP --><integer name="def_max_dhcp_retries">0</integer>

相当代码可以参考看看

进入休眠前的几个函数:
PowerManagerService|-- handleUserActivityTimeout|-- updatePowerStateLocked|-- updateWakefulnessLocked //不进黑屏是到这里后没有进入下一个函数|-- goToSleepNoUpdateLocked //进入休眠

frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

        mStayOnWhilePluggedInSetting = Settings.Global.getInt(resolver,Settings.Global.STAY_ON_WHILE_PLUGGED_IN, BatteryManager.BATTERY_PLUGGED_AC);/*** Updates the value of mStayOn.* Sets DIRTY_STAY_ON if a change occurred.*/private void updateStayOnLocked(int dirty) {if ((dirty & (DIRTY_BATTERY_STATE | DIRTY_SETTINGS)) != 0) {final boolean wasStayOn = mStayOn;if (mStayOnWhilePluggedInSetting != 0&& !isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()) {mStayOn = mBatteryManagerInternal.isPowered(mStayOnWhilePluggedInSetting);} else {mStayOn = false;}if (mStayOn != wasStayOn) {mDirty |= DIRTY_STAY_ON;}}}
    /*** Returns true if the device should go to sleep now.* Also used when exiting a dream to determine whether we should go back* to being fully awake or else go to sleep for good.*/private boolean isItBedTimeYetLocked() {return mBootCompleted && !isBeingKeptAwakeLocked();}/*** Returns true if the device is being kept awake by a wake lock, user activity* or the stay on while powered setting.  We also keep the phone awake when* the proximity sensor returns a positive result so that the device does not* lock while in a phone call.  This function only controls whether the device* will go to sleep or dream which is independent of whether it will be allowed* to suspend.*/private boolean isBeingKeptAwakeLocked() {return mStayOn|| mProximityPositive|| (mWakeLockSummary & WAKE_LOCK_STAY_AWAKE) != 0|| (mUserActivitySummary & (USER_ACTIVITY_SCREEN_BRIGHT| USER_ACTIVITY_SCREEN_DIM)) != 0|| mScreenBrightnessBoostInProgress;}/*** Updates the wakefulness of the device.** This is the function that decides whether the device should start dreaming* based on the current wake locks and user activity state.  It may modify mDirty* if the wakefulness changes.** Returns true if the wakefulness changed and we need to restart power state calculation.*/private boolean updateWakefulnessLocked(int dirty) {boolean changed = false;if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_BOOT_COMPLETED| DIRTY_WAKEFULNESS | DIRTY_STAY_ON | DIRTY_PROXIMITY_POSITIVE| DIRTY_DOCK_STATE)) != 0) {if (mWakefulness == WAKEFULNESS_AWAKE && isItBedTimeYetLocked()) {if (DEBUG_SPEW) {Slog.d(TAG, "updateWakefulnessLocked: Bed time...");}final long time = SystemClock.uptimeMillis();if (shouldNapAtBedTimeLocked()) {changed = napNoUpdateLocked(time, Process.SYSTEM_UID);} else {changed = goToSleepNoUpdateLocked(time,PowerManager.GO_TO_SLEEP_REASON_TIMEOUT, 0, Process.SYSTEM_UID);}}}return changed;}

RK3128 Android 7 BOX SDK 应用无法接收广播自启 + 眠休不黑屏问题相关推荐

  1. Android模拟器启动3个g,android,模拟器_android 模拟器用3.18的内核无法启动,一直黑屏。,android,模拟器,内核 - phpStudy...

    android 模拟器用3.18的内核无法启动,一直黑屏. 今天git clone 了android 源码master分支,编译完成后启动模拟器发现系统版本是6.0.1,但是内核版本居然是3.4.67 ...

  2. android广告视频播放,一种解决android广告视频启播前黑屏的方法与流程

    本发明涉及数字视频技术领域,具体的说,是一种解决android广告视频启播前黑屏的方法. 背景技术: 目前,Android系统已经作为普遍的智能电视平台出现在我们面前,为了提升电视平台的运营价值,很多 ...

  3. Oracle virtual box 安装系统黑屏问题

    主机:win7 64bit 装了Oracle VM virtual Box 装Xp 是经常出问题, 总是系统启动时黑屏. 搞了好几遍终于知道 在设置-系统里 扩展特性里,一定要勾上 1.启用IO AP ...

  4. 如何判断Android手机是否黑屏和锁屏

    1. 前言 Android手机在一段时间未操作后,会黑屏,然后点亮屏幕后,会显示锁屏界面.在实现某些功能(例如:手机QQ的手势密码锁定)的时候,需要对黑屏或锁屏进行处理. 2. 解决方案 因为Andr ...

  5. 【Android】自定义theme解决进入app闪黑屏问题

    每次启动app时总会闪一下黑屏,时间很短,一闪而过但是还是可以看的很清楚,虽然不影响运行,但是用户体验性极差,效果如图. 初感觉是app加载的问题,网上查相关资料后,该问题出现还是跟Activity生 ...

  6. 个推无法获取个推id_最新个推Android 推送 SDK Maven 集成

    概述 公司准备采用个推作为第三方推送平台,我作为客户端的头号小鸟,掐指一算已经毕业 0.1 年了,Leader 准备把这个简单而又独立的功能点交给我来处理,我紧张兮兮的打开官网集成文档 学习了起来.其 ...

  7. Android 4.0 SDK新特性

    Android 4.0 是一次重要的平台发布版,为用户和应用程序开发者增加了大量的新特性.在下面我们将讨论的所有新特性和API中,因为它将 Android 3.x 版本中广泛使用的API和全息图像主题 ...

  8. 【Android篇】 SDK 目录结构

    SDK (Software Development Kit) 软件开发工具包是软件开发工程师用于为特定的软件包.软件框架.硬件平台.操作系统等建立应用软件的开发工具的集合.Android SDK 就是 ...

  9. 最新个推Android 推送 SDK Maven 集成

    概述 公司准备采用个推作为第三方推送平台,我作为客户端的头号小鸟,掐指一算已经毕业 0.1 年了,Leader 准备把这个简单而又独立的功能点交给我来处理,我紧张兮兮的打开官网集成文档 学习了起来.其 ...

最新文章

  1. android代码集EditText只要输入号码、信
  2. mysql 评论回复表设计_【数据库】评论回复表设计
  3. IDA __OFSUB__ 测试
  4. grep检索关键字的命令_linux系统中java线上问题常用排查命令
  5. Windows系统MySQL8.0的安装教程
  6. ExtJs 滚动条问题
  7. LeetCode 24 Swap Nodes in Pairs (交换相邻节点)
  8. linux socket接收不到16进制数据,C下通过socket收发十六进制数据解决办法
  9. Unofficial Windows Binaries for Python Extensi...
  10. android9 添加开机音乐
  11. 简账(开源记账软件)-数据库设计
  12. 数电中一些常用的逻辑门符号
  13. CCL“中国法研杯”相似案例匹配评测竞赛 - TOP队伍攻略分享
  14. 下载维基百科wikipedia!
  15. 【自学与引导】 大数据技术 技能课程总结篇
  16. linux 安装环境
  17. 阿里云开启ipv6通过appstore审核的方法
  18. 红蜻蜓抓图精灵抓视频播放器画面结果一片漆黑解决教程
  19. Java程序员如何月薪达到两万,需要技术水平达到什么程度?
  20. iPhone与win10传输大文件,使用局域网

热门文章

  1. 电子科技大学信息门户模拟登录
  2. js 正则表达式中的特殊字符
  3. 2010笔记本显卡排行榜
  4. C生万物 | 常量指针和指针常量的感性理解
  5. MySQL 索引优化及失效场景
  6. php语言学习_新手如何学习PHP语言
  7. autohotkey更改win键盘快捷键为mac风格
  8. JavaSE笔记 类与对象
  9. melogin服务器无响应,Win7打不开melogin.cn怎么办?melogin.cn登录页面打不开怎么办?...
  10. Python 使用mutagen写入MP3文件标签信息