Android 13 变更及适配攻略

2023-05-16

在这里插入图片描述

准备工作

首先将我们项目中的 targetSdkVersioncompileSdkVersion 升至 33。

影响Android 13上所有应用

1.通知受限

对新安装的应用的影响:

如果用户在搭载 Android 13 或更高版本的设备上安装您的应用,应用的通知默认处于关闭状态。在您请求新的权限且用户向您的应用授予该权限之前,您的应用都将无法发送通知。

  • 如果您的应用以 Android 13 或更高版本为目标平台,应用将可以完全自行控制权限对话框的显示时间。您可以借此机会向用户说明应用需要此权限的原因,进而鼓励他们授予该权限。
  • 如果您的应用以 12L(API 级别 32)或更低版本为目标平台,在您创建通知渠道后您的应用首次启动 activity 时,或在您的应用启动一个 activity,然后创建它的第一个通知渠道时,系统会显示该权限对话框。这通常是在应用启动时。

对现有应用更新的影响:

为了最大限度地减少与通知权限相关的中断,当用户将其设备升级到Android 13或更高版本后,系统会自动向所有符合条件的应用预先授予相应权限。换言之,这些应用可以继续向用户发送通知,而用户不会看到运行时权限提示。

适配方法:

应用以Android 13或更高版本为目标平台,需要在应用程序manifest文件中声明POST_NOTIFICATIONS权限,并完成与请求其他运行时权限类似的流程。

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

请求权限前,可以使用areNotificationsEnabled()方法检查用户是否已启用通知。Android 13上做权限申请,Android 13一下可以引导设置页开启。

官方文档建议等到用户熟悉您的应用之后,再请求授予权限。下面列举了几个适合显示通知权限提示的时机:

  • 用户点按“提醒铃铛”按钮时。
  • 用户选择关注他人的社交媒体帐号时。
  • 用户提交外卖订单时。

下图是关于请求通知权限的建议用户驱动工作流程。仅当 shouldShowRequestPermissionRationale() 返回true时,才有必要显示中间屏幕。

在这里插入图片描述

2.intent过滤器会屏蔽不匹配的intent

当您的应用向以Android 13或更高版本为目标平台的其他应用的导出组件发送 intent 时,仅当该intent与接收应用中的<intent-filter>元素匹配时,系统才会传送该 intent。换言之,系统会屏蔽所有不匹配的intent,但以下情况除外:

  • 目标组件未声明任何<intent-filter>
  • 同一应用内发送的intent
  • 由系统发送的intent
  • 具有ROOT权限的进程发送的intent

如果接收方应用升级到Android 13或更高版本,仅当intent与其声明的 元素匹配时,源自外部应用的所有intent才会传送到导出组件,而不考虑发送应用的目标SDK版本。

所以我们需要检查应用内是否有通过Intent方式启动其他App或发送广播,同时检查actiondata等信息是否准确。

影响以Android 13或更高版本为目标平台的应用

1.GestureDetector

升到33后,发现编译失败。一看是kotlin实现的GestureDetector.OnGestureListener接口报错,提示onScroll方法的MotionEvent参数不会为空。原因是Android 13上这里的代码多了一个@NonNull的注解。

在这里插入图片描述

本以为删除可空的“?”就正常了,但发现在低版本手机上会报错:

Fatal Exception: java.lang.NullPointerException: 
Parameter specified as non-null is null: method android.view.GestureDetector.onTouchEvent, parameter e1

因为低版本手机上,这里拿到的MotionEvent为空。但是在kotlin中,变量不可空时,它会使用checkNotNullParameter方法校验,如果为null就会发生上面的异常。

在这里插入图片描述

所以如果你是用java实现的,不会存在这个问题。那么解决方法之一就是改用java实现。或者可以加上@Suppress("NOTHING_TO_OVERRIDE", "ACCIDENTAL_OVERRIDE")这样就不会生成checkNotNullParameter校验代码。

如果适配过程中有类似问题,不要盲目删除“?”。需要注意一下低版本的运行情况。

2.读取媒体文件权限

对于目标版本为Android 13的应用,细化了READ_EXTERNAL_STORAGE权限,使用READ_MEDIA_IMAGEREAD_MEDIA_VIDEOREAD_MEDIA_AUDIO替代READ_EXTERNAL_STORAGE

如果用户之前向您的应用授予了 READ_EXTERNAL_STORAGE 权限,系统会自动向您的应用授予细化的这三个媒体权限。

适配说明:

<manifest ...>
    <!-- 按需添加 -->
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
                     android:maxSdkVersion="32" />
    <application ...>
        ...
    </application>
</manifest>

代码部分可以做个判断,例如:

String requestPermission;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    requestPermission = Manifest.permission.READ_MEDIA_IMAGES;
} else {
    requestPermission = Manifest.permission.READ_EXTERNAL_STORAGE;
}

另外文档建议,如果你的应用只需要访问图片、照片和视频,可以考虑使用照片选择器,而不是声明 READ_MEDIA_IMAGESREAD_MEDIA_VIDEO 权限。

3.访问附近Wi-Fi设备受限

面向Android 13 (API级别33)或更高版本并管理Wi-Fi连接的应用程序必须请求NEARBY_WIFI_DEVICES 运行时权限。这种权限使应用程序访问附近的Wi-Fi设备变得更加容易;在以前版本的Android上,这些应用程序需要声明ACCESS_FINE_LOCATION权限。

需要NEARBY_WIFI_DEVICES权限的API方法:

  • WifiManager:startLocalOnlyHotspot()
  • WifiAwareManager:attach()
  • WifiAwareSession:publish()subscribe()
  • WifiP2pManager:addLocalService()connect()createGroup()discoverPeers()discoverServices()requestDeviceInfo()requestGroupInfo()requestPeers()
  • WifiRttManager:startRanging()

适配说明:

<manifest ...>
    <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"
                     android:usesPermissionFlags="neverForLocation" />

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
                     android:maxSdkVersion="32" />
</manifest>
  • 如果你的应用不会通过Wi-Fi API推导物理位置,请将usesPermissionFlags属性设为neverForLocation。同时将ACCESS_FINE_LOCATION权限的最高SDK版本设置为32
  • 如果你使用了WifiManagergetScanResults()startScan(),在Android 13还是需要ACCESS_FINE_LOCATION权限,所以去除android:maxSdkVersion="32"

4.广告 ID

使用 Google Play 服务广告 ID 且以 Android 13(API 级别 33)及更高版本为目标平台的应用必须在其清单文件中声明常规AD_ID权限,如下所示:

<manifest ...>
    <uses-permission android:name="com.google.android.gms.permission.AD_ID"/>

    <application ...>
        ...
    </application>
</manifest>

如果您的应用以 Android 13 或更高版本为目标平台且未声明此权限,系统会自动移除广告 ID 并将其替换为一串零。

5.废弃方法

  • PackageManager中的getPackageInfogetApplicationInforesolveActivity等方法。

以常用的getPackageInfo方法举例:

 public static PackageInfo getPackageInfoCompat(PackageManager packageManager, String packageName, int flag)
        throws PackageManager.NameNotFoundException {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        return packageManager.getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(flag));
    } else {
        return packageManager.getPackageInfo(packageName, flag);
    }
}
  • Intent中的getSerializableExtragetParcelableExtraBundle中的getSerializablegetParcelable等方法。

getParcelableExtra举例说明:

public static <T extends Parcelable> T getParcelableExtraCompat(Intent intent, String name, Class<T> clazz) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        return intent.getParcelableExtra(name, clazz);
    } else {
        return intent.getParcelableExtra(name);
    }
}

如果你的代码是Kotlin写的,当然也可以将此方法用Kotlin的拓展方法实现,便于替换。

  • WebSettings中的setAppCacheEnabledsetAppCacheMaxSizesetAppCachePath方法被移除。

    setAppCacheEnabled(false) 可以用setCacheMode(WebSettings.LOAD_NO_CACHE)替代。

    setAppCacheEnabled(true) 可以用setCacheMode(WebSettings.LOAD_DEFAULT)替代。

  • 对于以 Android 13(API 级别 33)或更高版本为目标平台的应用,WebSettings中的setForceDark方法已废弃,调用该方法无效。

    WebView 现在始终会根据应用的主题属性 isLightTheme 来设置媒体查询 prefers-color-scheme。换句话说,如果 isLightTheme 为 true 或未指定,则 prefers-color-scheme 为 light;否则为 dark。此行为意味着,系统会自动应用 Web 内容的浅色或深色样式(如果相应内容支持应用主题)。

    对于大多数应用,新行为应自动应用适当的应用样式,不过,您应测试应用以检查是否存在可能已手动控制深色模式设置的情况。

    如果您仍需要自定义应用的颜色主题行为,请改用 setAlgorithmicDarkeningAllowed() 方法。为了向后兼容以前的 Android 版本,我们建议使用 AndroidX 中的等效 setAlgorithmicDarkeningAllowed() 方法。

其他新功能及API

1.更安全地导出上下文注册的接收器

Android 13 允许您指定您应用中的特定广播接收器是否应被导出以及是否对设备上的其他应用可见。如果导出广播接收器,其他应用将可以向您的应用发送不受保护的广播。此导出配置在以 Android 13 或更高版本为目标平台的应用中可用,有助于防止一个主要的应用漏洞来源。在以前的 Android 版本中,设备上的任何应用都可以向动态注册的接收器发送不受保护的广播,除非该接收器受签名权限的保护。

以Android 13或更高版本为目标平台的应用,必须为每个广播接收器指定 RECEIVER_EXPORTEDRECEIVER_NOT_EXPORTED。否则,当您尝试注册广播接收器时,系统会抛出SecurityException

Caused by: java.lang.SecurityException: com.xxx.xxx: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts

当然这个目前不是强制适配的,需要在开发者选项 -> 应用兼容变更中开启DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED。这个安全增强措施默认是关闭的,所以暂时无影响。

适配方法:

// 这个广播接收器能够接收来自其他应用程序的广播。
context.registerReceiver(sharedBroadcastReceiver, intentFilter,
                    RECEIVER_EXPORTED);
// 这个私有广播接收器不能够接收来自其他应用的广播。
context.registerReceiver(privateBroadcastReceiver, intentFilter,
                    RECEIVER_NOT_EXPORTED);

因为我们项目之前统一将普通广播替换为了本地广播(LocalBroadcastManager),所以不受影响。

2.预测性返回手势

Android 13(API 级别 33)针对手机、大屏设备和可折叠设备等 Android 设备引入了预测性返回手势。该功能的发布历程跨度将达多年;完全实现后,该功能可让用户在完全完成某个返回手势之前就能预览此手势完成后的目的地或其他结果,以便用户能够决定是继续完成手势还是留在当前视图中。

在这里插入图片描述

参照文档添加对预测性返回手势的支持以及运行官方Codelab发现在Vivo、OPPO、小米上都不起作用,可能被阉割了。。。使用模拟器正常。目前此功能在开发者选项中供测试使用。官方计划在未来的Android版本中向用户提供此界面。

Android 12L开始,发现官方不断地在大屏设备和可折叠设备上提供优化支持。可以看到未来大屏的适配也是一个趋势。

3.各应用语言偏好设定

在许多情况下,多语言用户会将其系统语言设置为某一种语言(例如英语),但又想为特定应用选择其他语言(例如荷兰语、中文或印地语)。为了帮助应用为这些用户提供更好的体验,Android 13 针对支持多种语言的应用引入了以下功能:

  • 系统设置:用户可以在这个集中位置为每个应用选择首选语言。

    您的应用必须在应用的清单中声明 android:localeConfig 属性,以告知系统它支持多种语言。

  • 其他 API:借助这些公共 API(例如 LocaleManager 中的 setApplicationLocales()getApplicationLocales() 方法),应用可以在运行时设置不同于系统语言的其他语言。

    这些 API 会自动与系统设置同步;因此,使用这些 API 创建自定义应用内语言选择器的应用将确保用户获得一致的用户体验,无论他们在何处选择语言偏好设置。公共 API 还有助于减少样板代码量、支持拆分 APK,并且支持应用自动备份,以存储应用级的用户语言设置。

同样,试了几部国产手机此功能都被阉割,所以没有过多的尝试。详情参见文档:各应用语言偏好设定

4.更快断字

断字让分行的文本更易于阅读,并且有助于使界面更具自适应性。从Android 13开始,断字性能提升了高达200%,因此您可以在 TextView 中启用更快断字功能,而几乎不会影响渲染性能。如需启用更快断字功能,请在setHyphenationFrequency() 中使用 fullFastnormalFast 频率。

使用方法:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    // 适用于聊天消息
    textView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL_FAST);
    // 标准连词符
    textView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL_FAST)
}

下图是使用fullFast属性前后对比:

在这里插入图片描述


在这里插入图片描述

5.带主题的应用图标

从 Android 13 开始,您可以选择启用带主题的应用图标。借助此功能,用户可以调节受支持的Android应用图标色调,以继承所选壁纸和其他主题的配色。

如需支持此功能,您的应用必须提供自适应图标和单色应用图标,并通过清单中的 <adaptive-icon> 元素指向该单色应用图标。如果用户启用了带主题的应用图标(换句话说,在系统设置中开启了带主题的图标切换开关),而启动器支持此功能,则系统将使用用户选择的壁纸和主题来确定色调颜色,然后该颜色将应用于单色应用图标。

在这里插入图片描述

适配方法很简单,只需要额外添加<monochrome/>单色应用图标配置就可以支持这个功能。

<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@mipmap/ic_launcher_background"/>
    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
    <monochrome android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

测试了几个部手机都不支持此功能,所以只能使用模拟器测试效果。模拟器效果图:

在这里插入图片描述


有关Android 13的适配内容主要就这么多,更多的变更还是需要我们去阅读官方文档。链接我也贴到了文末。

最后,如果本文对你有所帮助,欢迎收藏点赞。感谢!

参考

  • 官方Android13文档

  • GestureDetector.OnGestureListener overridden methods are not working in Android API 33

  • OPPO - Android 13 应用兼容性适配指导

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 13 变更及适配攻略 的相关文章

  • linux解压缩常见命令

    tar详解 c 建立压缩档案 x xff1a 解压 t xff1a 查看内容 r xff1a 向压缩归档文件末尾追加文件 u xff1a 更新原压缩包中的文件 这五个是独立的命令 xff0c 压缩解压都要用到其中一个 xff0c 可以和别的
  • linux 安装 gcc 方法

    今天安装Linux虚拟机发现竟然没有gcc 感觉是崩溃的 xff0c 上网寻找一下安装方法 xff0c 借鉴总结了一下得出下面步骤 使用root权限下载 sudo yum y install gcc gcc c 43 43 autoconf
  • MFC编程基础(—)

    MFC类的基本层次结构如图所示 xff1a CObject类是MFC提供的绝大多数类的基类 该类完成动态空间的分配和回收 xff0c 支持一般的诊断 出错信息处理和文档序列化等 CCmdTarget类主要负责将系统事件 xff08 消息 x
  • 开启windows10系统组策略更新、开启Windows自动更新、关闭自动更新

    win 43 R键打开运行 xff0c 输入regedit 按路径 计算机 HKEY LOCAL MACHINE SOFTWARE Policies Microsoft Windows WindowsUpdate AU 找到NoAutoUp
  • linux 中 /etc/systemd/system和/usr/lib/systemd/system 的区别

    每一个 Unit xff08 服务等 xff09 都有一个配置文件 xff0c 告诉 Systemd 怎么启动这个 Unit Systemd 默认从目录 etc systemd system 读取配置文件 但是 xff0c 里面存放的大部分
  • Vue3使用axios请求数据后使用v-for显示不出数据

    getAccount let that 61 this axios url 39 http localhost 8080 api GetAllUniAccounts 39 method 39 post 39 then res 61 gt t
  • Axios请求中Content-Type的使用总结

    Axios请求头中的Content Type常见的有3种 xff1a 1 Content Type application json 2 Content Type application x www form urlencoded 3 Co
  • mycat全局序列号数据库方式

    1 server xml lt property name 61 34 sequnceHandlerType 34 gt 1 lt property gt 2 schema xml lt table name 61 34 z test 34
  • Warning: Packets out of order. Expected 8 received 0

    环境 xff1a linux 43 mycat 43 hyperf 43 es 原因 xff1a mycat进行了分片 解决 xff1a 修改文件路径 xff1a vendor hyperf database src Connectors
  • Ubuntu下不能切换中文,qt creator无法输入中文,sogo输入法(详细步骤)

    目录 xff1a 1 解决ubuntu 不支持切换中文 xff0c 并安装sogo输入法步骤 xff1b 2 解决Qt Creator不支持中文输入 xff1a 详细步骤 xff1a 一 解决ubuntu 不支持切换中文 xff0c 并安装
  • wordpress插件API入口

    lt php 64 package Moodo Zhong 64 version 1 0 0 Plugin Name Moodo Zhong Plugin URI http wordpress org plugins hello dolly
  • PHP源码目录说明

    1 build 和编译有关的目录 2 ext 扩展库代码 xff0c 例如 MySQL zlib iconv 等我们熟悉的扩展库 其中 ext standard 目录下是常用的标准函数集 3 main 主目录包含主要的 PHP 宏和定义 4
  • 终端程序定义示例

    interrupt 0 外部中断0 interrupt 1 T0中断 interrupt 2 外部中断1 interrupt 3 T1中断 interrupt 4 串口中断 我来告诉你实质 xff1a 单片机的中断处理是这样工作的 xff0
  • lisp学习资料

    中文LISP学习网站 CL HTTP franz com 217条消息 使用hunchentoot搭建Lisp web 服务器 keyboardOTA的博客 CSDN博客
  • GO调用C语言之字符串传递

    C xff1a hello h include lt stdlib h gt include lt stdio h gt include lt string h gt char abc int strnum char str C hello
  • C++-基础语法-cin.getline() 与 cin.get() 的区别,以及getline()函数使用方法

    参考声明 xff1a C 43 43 primer plus https blog csdn net best fiends zxh article details 53064771 https blog csdn net u0114216
  • Kotlin开发中的一些Tips(二)

    接着上一篇 xff0c 最近又整理了一些 1 作用域函数选择 目前有let run with apply 和 also五个作用域函数 官方文档有张表来说明它们之间的区别 xff1a 总结一下有几点区别 xff1a apply和also返回上
  • Jetpack Compose 从入门到入门(一)

    Jetpack Compose 是用于构建原生 Android 界面的新工具包 它使用更少的代码 强大的工具和直观的 Kotlin API xff0c 可以帮助您简化并加快 Android 界面开发 xff0c 打造生动而精彩的应用 它可让
  • Jetpack Compose 从入门到入门(二)

    开始布局部分 这部分我个人感觉没有必要每个组件 属性都详细说到 xff0c 否则篇幅会很长 建立起Compose中的组件与 Android Views的一个对应关系就够了 具体还是需要在实际的使用中去熟悉 1 Column 子元素按竖直顺序
  • Jetpack Compose 从入门到入门(三)

    本篇开始介绍Jetpack Compose 中的修饰符Modifier 修饰符可以用来执行以下操作 xff1a 更改可组合项的大小 布局 行为和外观 添加信息 xff0c 如无障碍标签 处理用户输入 添加高级互动 xff0c 如使元素可点击

随机推荐

  • 【操作系统】Linux系统中直接优化提升CPU性能(已解决)

    文章目录 问题 xff1a 服务器CPU没有调用最高性能 xff0c 导致跑算法的时候处理速度慢一 BIOS方法二 终端直接设置CPU调节器方法1 查看当前CPU调节器2 安装各种依赖库3 最后安装cpufrequtis工具包并设置CPU调
  • Jetpack Compose 从入门到入门(四)

    本篇开始介绍Jetpack Compose 中常用的组件 有一部分之前的文章中也出现过 xff0c 今天详细说明一下 1 Text 日常最常用的应该就是显示文字 xff0c 所以有必要说一下Text控件 首先源码如下 xff1a span
  • Jetpack Compose 从入门到入门(五)

    应用中的状态是指可以随时间变化的任何值 这是一个非常宽泛的定义 xff0c 从 Room 数据库到类的变量 xff0c 全部涵盖在内 由于Compose是声明式UI xff0c 会根据状态变化来更新UI xff0c 因此状态的处理至关重要
  • Jetpack Compose 从入门到入门(六)

    本篇说说Compose中的Canvas 1 Canvas span class token annotation builtin 64 Composable span span class token keyword fun span sp
  • Jetpack Compose 从入门到入门(七)

    本篇进入Compose 动画部分 1 动画预览 在本系列第一篇中我们提到过 xff0c 64 Preview可以帮我们实现UI的预览功能 xff0c 简单的交互和播放动画 在Android Studio Bumblebee xff08 大黄
  • Android 12 变更及适配攻略

    这几个月有点忙 xff0c 一年一篇的适配文章来的有点晚了 但其实也还好 xff0c 因为我们项目也是下半年才适配 我这边也是提前调研踩坑 xff0c 评估一下工作量 这个时间点也完全跟得上Google Play的审核要求 xff08 11
  • Jetpack Compose 从入门到入门(八)

    接着上一篇的动画部分 xff0c 本篇主要是自定义动画与Animatable AnimationSpec 上一篇中 xff0c 出现了多次animationSpec属性 xff0c 它是用来自定义动画规范的 例如 xff1a span cl
  • Jetpack Compose 从入门到入门(九)

    本篇是Compose的手势部分 点击 添加clickable修饰符就可以轻松实现元素的点击 此外它还提供无障碍功能 xff0c 并在点按时显示水波纹效果 span class token annotation builtin 64 Comp
  • 记参加 2022 Google开发者大会

    前几天有幸参加了2022年Google 开发者大会 Google Developer Summit xff0c 上一次参加Google开发者大会还是2019年 这期间因为众所周知的原因 xff0c 开发者大会都改为了线上举办 和上次相比可以
  • Jetpack Compose 从入门到入门(十)

    本篇介绍如何将Jetpack Compose 添加到已有应用中 xff0c 毕竟大多数情况都是在现有项目中使用 Jetpack Compose 旨在配合既有的基于 View 的界面构造方式一起使用 如果您要构建新应用 xff0c 最好的选择
  • Flutter状态管理之Riverpod 2.0

    两年前分享过一篇Flutter状态管理之Riverpod xff0c 当时riverpod的版本还是0 8 0 xff08 后来文章更新到0 14版本 xff09 当时提到过有一些不足之处 xff1a 毕竟诞生不久 xff0c 它还不能保证
  • Python:元组和字典简述

    目录 1 列表的方法2 for循环遍历列表2 1 语法2 2 range 函数 3 元组3 1 元组的基本概念3 2 元组的创建3 3 元组的解包3 3 1 号在解包中的用法 4 字典4 1 字典的基本概念4 2 字典的使用4 2 1 字典
  • 七种常见软件开发模型

    目录 瀑布模型 xff08 面向文档的软件开发模型 xff09 演化模型 螺旋模型 增量模型 构件组装模型 统一过程 xff08 up xff09 xff08 迭代的软件过程 xff0c 以架构为中心 xff09 敏捷开发模型 瀑布模型 x
  • IP安全策略:只允许指定IP连接远程桌面,限制IP登录

    一 xff0c 新建IP安全策略 WIN 43 R打开运行对话框 xff0c 输入gpedit msc进入组策略编辑器 依次打开 本地计算机 策略 计算机配置 Windows设置 安全设置 IP安全策略 在 本地计算机上 在右面的空白处右击
  • 2022年终总结

    不知不觉就到了年末 xff0c 感叹时间过的真快 我自己坚持写了七年多的博客 xff0c 但这其实是我第一次去写年终总结 也不知道怎么写 xff0c 就简单聊聊 写博客的初衷就是个人收获 xff0c 学习的记录 xff0c 分享出来如果能帮
  • Rust库交叉编译以及在Android与iOS中使用

    本篇是关于交叉编译Rust库 xff0c 生成Android和iOS的二进制文件 xff08 so与a文件 xff09 xff0c 以及简单的集成使用 1 环境 系统 xff1a macOS 13 0 M1 Pro xff0c Window
  • 利用Rust与Flutter开发一款小工具

    1 起因 起因是年前看到了一篇Rust 43 iOS amp Android xff5c 未入门也能用来造轮子 xff1f 的文章 xff0c 作者使用Rust做了个实时查看埋点的工具 其中作者的一段话给了我启发 xff1a 无论是 Loo
  • 在Android与iOS中使用LLDB调试Rust程序

    在Rust中通过println 打印的日志信息在Xcode中可以显示 xff0c 但是Android Studio里不显示 所以Android可以使用android logger实现日志输出 但是开发中仅使用打印日志的方式进行调试还是不够的
  • 使用jni-rs实现Rust与Android代码互相调用

    本篇主要是介绍如何使用jni rs 有关jni rs内容基于版本0 20 0 xff0c 新版本写法有所不同 入门用法 在Rust库交叉编译以及在Android与iOS中使用中我简单说明了jni rs及demo代码 xff0c 现在接着补充
  • Android 13 变更及适配攻略

    准备工作 首先将我们项目中的 targetSdkVersion和compileSdkVersion 升至 33 影响Android 13上所有应用 1 通知受限 对新安装的应用的影响 xff1a 如果用户在搭载 Android 13 或更高