Android 7.0 (API 24) 适配
电池和内存
低电耗模式
此项新增的行为不会影响有关使您的应用适应Android 6.0(API级别23)中所推出的旧版本低电耗模式的建议和最佳做法,如对低电耗模式和应用待机模式进行针对性优化中所讨论
后台优化
移除了三项隐式广播,以帮助优化内存使用和电量消耗,详见后台优化
- CONNECTIVITY_ACTION:影响target 7.0的应用,替代方案JobScheduler
- ACTION_NEW_PICTURE:影响所有Android版本的应用,不允许收发
- ACTION_NEW_VIDEO:影响所有Android版本的应用,不允许收发
权限变更
系统权限变更
- 私有文件权限限制,MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE会引起SecurityException
- file:// 受限制,会引起FileUriExposedException,推荐使用FileProvider
- DownloadManager受限制,7.0以前访问COLUMN_LOCAL_FILENAME可能会失败,7.0及以后会引起SecurityException,推荐使用ContentResolver.openFileDescriptor()
应用间共享文件
- target 7.0的App,Android框架禁止以file:// 形式分享文件,会引起FileUriExposedException,推荐使用content://,并授予URI临时访问权限,详情参阅共享文件
无障碍改进
屏幕缩放
屏幕尺寸放生变化时:
target <= 23 | target > 23 | |
---|---|---|
前台 | 配置变更通知 | 配置变更通知 |
后台 | Terminated | 配置变更通知 |
Setting中的视觉设置
Android 7.0在“Welcome”屏幕中加入了“Vision Settings”,用户可以在新设备上设置以下无障碍功能设置:Magnification gesture、Font size、Display size 和话语提示。此项变更让您可以更容易发现与不同屏幕设置有关的错误。要评估此功能的影响,您应在启用这些设置的状态下测试应用。您可以在 Settings > Accessibility 中找到这些设置。
NDK
Android 7.0开始,系统阻止应用动态链接非公开NDK库
检查
- target <= 23,运行在Android 7.0,且尝试访问私有库时,警告:
03-21 17:07:51.502 31234 31234 W linker : library "libandroid_runtime.so"
("/system/lib/libandroid_runtime.so") needed or dlopened by
"/data/app/com.popular-app.android-2/lib/arm/libapplib.so" is not accessible
for the namespace "classloader-namespace" - the access is temporarily granted - target > 23, 运行在Android 7.0,且尝试访问私有库时,可能崩溃:
java.lang.UnsatisfiedLinkError: dlopen failed: library "libcutils.so"
("/system/lib/libcutils.so") needed or dlopened by
"/system/lib/libnativeloader.so" is not accessible for the namespace
"classloader-namespace"
at java.lang.Runtime.loadLibrary0(Runtime.java:977)
at java.lang.System.loadLibrary(System.java:1602) - 静态检测工具readelf:
aarch64-linux-android-readelf -dW libMyLibrary.so
更新
- 如果您的应用使用私有平台库,您应更新它,以添加该应用自己的库副本或使用公开NDK API。
- 如果您的应用使用访问私有符号的第三方库,则联系库作者以更新库。
- 请确保将您的所有非NDK库与您的APK打包在一起。
- 使用标准JNI函数而非来自 libandroid_runtime.so 的 getJavaVM 和 getJNIEnv:
AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h>
AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or
JavaVM::AttachCurrentThread from <jni.h>. - 使用 __system_property_get 而非来自 libcutils.so 的私有 property_get 符号。为此,请使用 __system_property_get 及以下 include 函数:
#include <sys/system_properties.h>
- 使用来自 libcrypto.so 的 SSL_ctrl 符号的本地版本。例如,您应在您的 .so 文件中静态链接 libcyrpto.a,或从 BoringSSL/OpenSSL 添加一个动态链接的 libcrypto.so 版本,并将其打包到您的APK中。
注解
Android 7.0修复了一个注解可见性被忽略的错误。这种问题会导致应用可在运行时访问原本不允许访问的注解。这些注解包括:
VISIBILITY_BUILD:仅应编译时可见。
VISIBILITY_SYSTEM:运行时应可见,但仅限底层系统。
如果您的应用依赖这种行为,请为运行时必须可用的注解添加保留政策。您可通过使用@Retention(RetentionPolicy.RUNTIME)来执行此操作。
其他
- 显示尺寸变化时,target < 7.0的后台App进程会被终止。用户从最近使用记录中恢复应用时,会出现崩溃现象。
- Debug.startMethodTracing()方法不再需要WRITE_EXTERNAL_STORAGE权限。
- 许多平台API现在开始检查在 Binder 事务间发送的大负载,会引发TransactionTooLargeExceptions。常见例子:Activity.onSaveInstanceState() 上存储过多数据,导致 ActivityThread.StopInfo 引发RuntimeException。
- 如果应用向 View 发布 Runnable 任务,并且 View 未附加到窗口,系统会用 View 为 Runnable 任务排队;在 View 附加到窗口之前,不会执行 Runnable 任务
- 如果Android 7.0上一项有 DELETE_PACKAGES 权限的应用尝试删除一个软件包,但另一项应用已经安装了这个软件包,则系统需要用户进行确认。在这种情况下,应用在调用 PackageInstaller.uninstall() 时预计的返回状态应为 STATUS_PENDING_USER_ACTION。
- 名为 Crypto 的 JCA 提供程序已弃用,因为它仅有的 SHA1PRNG 算法为弱加密。应用无法再使用 SHA1PRNG(不安全地)派生密钥。