.penaltyLog()
// Consider also adding penaltyDeath()
.build());
}
如果您的应用检测到 StrictMode
违规行为,您可能需要停止应用的执行以保护潜在的敏感信息。
注意:如果您的应用以 Android 12 为目标平台,并在其 VmPolicy
定义中使用 detectAll()
方法,系统将自动调用 detectUnsafeIntentLaunch()
方法。
如何最大限度地降低出现 StrictMode 违规行为的可能性
如果您的应用不可避免的会启动嵌套 intent
,以便在应用的各个组件之间导航,或代表其他应用执行操作等。请执行以下操作:
-
嵌套 intent 的内部启动:确保这些组件不会被导出。
-
嵌套 intent 的跨应用启动:使用
PendingIntent
代替嵌套intent
。如此一来,当PendingIntent
从包含它的Intent
中解封时,应用组件可以使用调用进程的身份启动PendingIntent
。该配置允许提供程序应用向调用应用的任何组件(包括未导出的组件)发送回调。
以 Android 12 为目标平台的应用再也无法在后台运行时启动前台服务,但一些特殊情况除外。如果应用尝试在后台运行时启动前台服务,则会引发异常(少数特殊情况除外)。当您的应用在后台运行时,请考虑使用 WorkManager
来计划和启动工作。
当用户与通知互动时,某些应用会启动应用组件来响应通知点按操作,此应用组件最终会启动用户最终看到并与之互动的 activity。此应用组件被称为通知 trampoline。
为了改进应用性能和用户体验,以 Android 12 为目标平台的应用无法从用作通知 trampoline 的服务或广播接收器中启动 activity。换言之,当用户点按通知或通知中的操作按钮时,您的应用无法在服务或广播接收器内调用 startActivity()
。
当您的应用尝试从充当通知 trampoline 的服务或广播接收器启动 activity 时,系统会阻止启动该 activity 启动,并在 Logcat 中显示以下消息:
Indirect notification activity start (trampoline) from PACKAGE_NAME, \
this should be avoided for performance reasons.
解决方法:
如果您的应用从充当通知 trampoline 的服务或广播接收器启动 activity,请完成以下迁移步骤:
1.创建一个与以下 activity
关联的 PendingIntent
对象:
-
用户点按通知后会看到的
activity
(首选)。 -
Trampoline activity
或用于启动用户在点按通知后可以看到的activity
的activity
。
2.在构建通知的过程中,请使用您在上一步中创建的 PendingIntent
对象。
其实从 Android 9(API 级别 28)开始,Android 平台对应用能使用的非 SDK 接口就实施了限制。只要应用引用非 SDK 接口或尝试使用反射或 JNI 来获取其句柄,这些限制就适用。Android 12 更新了这个限制列表(将Android 11的部分灰名单直接加到了黑名单列表中)
区分 SDK 接口和非 SDK 接口
-
SDK 接口:在 Android 框架软件包索引中记录的那些接口
-
非 SDK 接口:Android中私有或隐藏的 hidden api接口,这些接口方法可能在未来版本中随时可变
为最大程度地降低非 SDK 使用限制对开发工作流的影响,我们将非 SDK 接口分成了几个名单,这些名单界定了非 SDK 接口使用限制的严格程度(取决于应用的目标 API 级别)
| 名单 | 说明 |
| :-: | :-- |
| 黑名单 (blacklist) | 无论应用的目标 API 级别是什么,您都无法使用的非 SDK 接口。 如果您的应用尝试访问其中任何一个接口,系统就会抛出错误。 |
| 有条件灰名单 (greylist-max-x) | 从 Android 9(API 级别 28)开始,当有应用以该 API 级别为目标平台时,我们会在每个 API 级别分别限制某些非 SDK 接口。
这些名单会以应用无法再访问该名单中的非 SDK 接口之前可以作为目标平台的最高 API 级别 (max-target-x) 进行标记。例如,在 Android Pie 中未被屏蔽、但现在已被 Android 10 屏蔽的非 SDK 接口会列入 max-target-p (greylist-max-p) 名单,其中的“p”表示 Pie 或 Android 9(API 级别 28)。
如果您的应用尝试访问受目标 API 级别限制的接口,系统就会将此 API 视为已列入屏蔽名单。 |
| 灰名单 (greylist) | 当前不受限制且您的应用可以使用的非 SDK 接口。 但请注意,这些接口不受支持,可能会在未发出通知的情况下随时发生更改。预计这些接口在未来的 Android 版本中会被有条件地屏蔽,并列在 max-target-x 名单中。 |
| 白名单 (whitelist) | 已在 Android 框架软件包索引中正式记录、受支持并且可以自由使用的接口。 |
如何确定我当前使用的接口属于哪个名单?
-
官方给出了文件下载地址,可以到这里下载:确定接口属于哪个名单
-
可以参考这里:Android 12 中有关限制非 SDK 接口的更新
-
可以在FrameWork源码中搜索
hiddenapi
关键字,搜索结果中的hiddenapi-force-blacklist.txt
和hiddenapi-light-greylist.txt
就是黑名单和灰名单列表,推荐 Android Source 这个网站可在线搜索
如果用反射或者JNI调用了这些非SDK接口会导致什么影响:
| 访问方式 | 结果 |
| :-- | :-- |
| Dalvik 指令引用某个字段 | 抛出 NoSuchFieldError |
| Dalvik 指令引用某个方法 | 抛出 NoSuchMethodError |
| 通过 Class.getDeclaredField() 或 Class.getField() 进行反射 | 抛出 NoSuchFieldException |
| 通过 Class.getDeclaredMethod()、Class.getMethod() 进行反射 | 抛出 NoSuchMethodException |
| 通过 Class.getDeclaredFields()、Class.getFields() 进行反射 | 结果中未获取到非 SDK 成员 |
| 通过 Class.getDeclaredMethods()、Class.getMethods() 进行反射 | 结果中未获取到非 SDK 成员 |
| 通过 env->GetFieldID() 进行 JNI 调用 | 返回 NULL,抛出 NoSuchFieldError |
| 通过 env->GetMethodID() 进行 JNI 调用 | 返回 NULL,抛出 NoSuchMethodError |
Android 12 改变了完全自定义通知的外观。 以前,自定义通知能够使用整个通知区域并提供自己的布局和样式。由此产生的反模式可能会令用户困惑,或在不同设备上引发布局兼容性问题。
对于以 Android 12 为目标平台的应用,包含自定义内容视图的通知将不再使用完整通知区域;相反,系统会应用标准模板。此模板可确保自定义通知在所有状态下都与其他通知相同。
换言之,应用不能在整个通知栏区域进行个性化了,大家都长一个样。这是为了保持通知外观一致且易于浏览。
下图显示了标准模板中的自定义通知:
以下示例展示了在收起状态和展开状态下呈现的自定义通知:
Android 12 中的变更会影响某些定义 Notification.Style
的自定义子类的应用,或使用 Notification.Builder
的方法 setCustomContentView(RemoteViews)
、setCustomBigContentView(RemoteViews)
和 setCustomHeadsUpContentView(RemoteViews)
的应用。
如果您的应用使用的是完全自定义的通知,建议尽快使用新模板进行测试,并进行必要的调整:
- 启用自定义通知变更:
a. 将应用的 targetSdkVersion
变更为 S
以启用新行为。
b. 重新编译。
c. 在搭载 Android 12
的设备或模拟器上安装您的应用。
-
测试所有使用自定义视图的通知,确保这些通知在通知栏中看起来符合预期。
-
请注意自定义视图规格。一般来说,提供给自定义通知的高度比之前小。在收起状态下,自定义内容的最大高度已从
106dp
减少到48dp
。此外,水平空间也减小了。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
学习交流
如果你觉得自己学习效率低,缺乏正确的指导,可以加入资源丰富,学习氛围浓厚的技术圈一起学习交流吧!
群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。
35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。
02h6-1711131671075)]
[外链图片转存中…(img-fLGnRKo7-1711131671075)]
群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。
35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。