Windows兼容性指南
如果您是一名开发者,正在使用现有应用来修复特定问题,请参阅Windows故障排除索引。
如果您是一名开发者,拥有新的或现有的应用,并希望确保它与Windows Subsystem for Android™兼容,或者如果您是亚马逊应用商店的新手并想要了解如何将您的应用移植到Windows 11设备,请浏览以下主题。
要将您的Android应用移植到Windows 11,请先查看以下主题。
升级到Android 12 - Windows Subsystem for Android基于Android 12。更新您的应用以符合Android 12的要求。
主题: 作用域存储 | 文件名无效
为Windows构建 - 学习如何处理特定于Windows的用例。
主题: 输入控件 | 图形 | 窗口管理和调整大小 | 摄像头功能 | 支持x86 ABI架构
处理不支持的功能 - 了解如何处理不支持的功能,包括硬件或软件服务依赖关系。
主题: 常用功能-不支持 | 常用功能-有限支持 | 禁用不支持的广告SDK | 处理不支持的Google Play服务 | 有条件地禁用不支持的功能 | 不支持功能列表

升级到Android 12
Windows Subsystem for Android基于Android 12。如果您的应用是针对旧版本的Android而构建的,请升级您的应用,使其与Android 12功能兼容。
Android开发者文档提供了有关Android不同版本之间区别的重要信息。请查看这些指南,帮助过渡到Android 12。
如果您的应用需要文件访问权限,则较新版本的Android上的某些特定功能可能会影响您的应用在Windows上的行为。与文件访问相关的问题通常是由作用域存储和无效的文件名引起的。为防止应用遇到文件访问问题,请遵循以下指南。
作用域存储
在Windows Subsystem for Android上测试的应用中出现的文件存储问题通常是由作用域存储引起的。作用域存储是Android 10中引入并在Android 11中强制执行的一项Android功能。使用作用域存储,应用只能访问该应用创建的外部存储和媒体上的特定目录。有关作用域存储的更多信息,请参阅有关Android存储用例和最佳实践的Android开发者指南。
文件名无效
在Windows上的Android应用经常遇到的另一个问题是文件名无效。Android引入了一些更改,如果文件名中包含无效字符,则不会保存该文件。在早期版本的Android中,无效字符被替换。但是,在较新版本的Android中,如果您的应用尝试保存名称中包含无效字符的文件,则该文件将无法保存。例如,名称中带有时间戳的文件(其中时间戳包含冒号:
)将无法保存。

为Windows构建
主题: 输入控件 | 图形 | 窗口管理和调整大小 | 摄像头功能 | 支持x86 ABI架构
为了提供愉快的用户体验,您的应用需要处理移动设备上没有遇到的Windows设备特有的功能。请考虑以下主题。如果您需要解答的问题未在此处列出,请访问亚马逊开发者论坛寻求开发者社区的帮助。
输入控件
原本就为Android或其他触摸屏移动设备设计的应用可能无法有效处理键盘和鼠标输入。要使应用与非触摸屏Windows设备上可用的输入控件兼容,请遵循本节中的指南。
键盘输入
为了帮助您提供友好的键盘体验,您可以使用以下代码检查设备是否有键盘:
private boolean isKeyboardConnected() {
return getResources().getConfiguration().keyboard == Configuration.KEYBOARD_QWERTY;
}
private fun isKeyboardConnected(): Boolean {
return resources.configuration.keyboard == Configuration.KEYBOARD_QWERTY
}
您的应用应能够处理Android框架无法自动处理的Windows应用和游戏的常用控件。在开发与Windows设备兼容的移动应用时,请考虑如何处理以下键盘输入。
- 输入密钥
- 箭头键导航
- 选项卡键导航
- 基于Ctrl的快捷方式(例如,Ctrl-C用于复制,Ctrl-V用于粘贴)
- 更改选定项目的突出显示颜色
- 右键单击显示上下文菜单
- 在游戏中移动的W、A、S和D键
- 游戏中的空格键跳跃
示例: 允许玩家在游戏中按Ctrl-J进行特殊动作。
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode) {
...
case KeyEvent.KEYCODE_J:
if (event.isCtrlPressed()) {
superJumpCombo();
}
...
default:
return super.onKeyUp(keyCode, event);
}
}
override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
return when (keyCode) {
...
KeyEvent.KEYCODE_J -> {
if (event.isCtrlPressed) {
superJumpCombo()
}
true
}
...
else -> super.onKeyUp(keyCode, event)
}
}
有关输入设计的更多注意事项,请参阅有关输入支持的 Android开发者指南。有关如何处理键盘输入的更多详细信息,请使用以下Android开发者指南:
鼠标输入
默认情况下,Windows Subsystem for Android将鼠标左键单击转换为虚拟触摸事件,将鼠标滚轮滚动转换为滑动事件。这样做是为了使大多数不处理鼠标输入的触摸屏应用具有兼容性。对于其他鼠标操作,请更新您的代码以处理特定的输入。考虑采取以下操作:
- 右键单击
- 拖放
- 工具提示和悬停文本
- 悬停效果
通过Android开发者指南学习如何处理鼠标输入:
图形
为了使用户在Windows计算机上运行应用时获得最佳体验,请支持更大的屏幕并在应用中使用增强的图形。请使用以下建议来改善用户在Windows上使用您应用时的体验。
OpenGL ES版本。 Windows Subsystem for Android支持OpenGL ES 1.1、2.0和3.0。目前不支持OpenGL ES 3.1及更高版本。
最大帧速率。 您的应用在Windows计算机上运行的帧速率可能高于在移动设备上运行时的帧速率。要在Windows上获得最佳体验,请将最大帧速率设置为60 FPS或更高,或者删除最大帧速率限制。
用户界面缩放。 确保所有用户界面元素的大小都适合更大的屏幕。建议HUD占屏幕面积小于20%。
宽高比。 要在大型设备上获得最佳体验,请支持多种宽高比,包括 16:9、16:10和3:2。
窗口管理。 在Windows Subsystem for Android上,应用始终以多窗口模式打开,并且可以由用户调整大小。
- 如果您的应用通过
android:screenOrientation
强制使用纵向模式,或者其宽高比与窗口大小不匹配,则在Windows上使用宽银幕边框或黑边框进行渲染。 - 如果您的应用在调整大小时无法正常运行,您可以在应用清单的
活动
元素中添加android:resizeableActivity="false"
。如此会以兼容模式运行您的应用,该模式使用宽银幕边框或黑边框对其进行渲染。 - 有关窗口管理的更多详细信息,请阅读以下章节。
窗口管理和大小调整
与移动设备不同,在Windows计算机上运行的Android应用可以自由调整大小。用户还可以使用Windows的操作将应用窗口拖动到屏幕的边缘或角落。这些功能可能会导致用户在使用Windows上的应用时获得不同的体验。请考虑以下几点。
宽银幕边框和黑边框
当内容的宽高比与包含该内容的显示屏不对齐时,可能会出现宽银幕边框和黑边框。在宽银幕边框中,原始内容比正在查看的显示屏要宽。为了保持内容的宽高比并查看全宽度的内容,在内容的顶部和底部添加了条块。

在黑边框中,原始内容比正在查看的显示屏要窄。为了保持宽高比,在侧面添加了条块。

添加的条块可以是浅色或深色主题,具体取决于系统设置。宽银幕边框和黑边框会在应用被拖动、最大化或手动调整大小时出现。
多窗口模式
当您的应用在Windows Subsystem for Android上运行时,它会以多窗口模式打开。这可能会在应用最小化、设备屏幕锁定或计算机从睡眠状态中唤醒时造成问题。
为了防止出现问题,使用正确的窗口机制很重要。有关如何支持窗口机制的详细信息,请参阅有关多窗口支持的Android开发者指南。您还必须处理与多窗口模式相关的活动生命周期,以确保正确保存和加载应用状态。有关详细信息,请参阅有关多窗口模式下的活动生命周期的Android开发者指南。
大小调整的其他注意事项
要使您的移动应用与Windows设备的窗口管理和大小调整功能兼容,请考虑以下主题。
- 初始启动大小-设置应用启动时的显示大小和方向
- 窗户尺寸
- 内容边界-避免被截断或不可访问的内容
- 任意形状大小调整-支持窗口大小调整
- 屏幕方向-考虑支持纵向和横向模式
有关每个主题的更多详细信息,请参阅有关窗口管理的Android开发者指南。
摄像头功能
如果您的应用使用摄像头并且支持Windows设备,请遵循以下指南。
- 在尝试使用设备的摄像头之前,使用Android的
CameraManager
API来检查是否有可用的摄像头设备。与移动设备不同,Windows设备可能有一个摄像头、多个摄像头、没有摄像头或一个外部摄像头。亚马逊应用商店建议处理针对每种情况都进行处理。 - 检查Windows设备的摄像头支持哪些预览尺寸,然后使用这些尺寸拍照和显示预览。
- 在笔记本电脑等横向设备上测试应用的方向,并相应地调整旋转角度。
- 如果您遇到“Your hardware doesn't support this application error(您的硬件不支持此应用错误)”,则Assets/Plugins/Android/lib/armeabi文件夹中可能存在旧版原生库。当您构建原生库时,默认情况下会创建x86、armeabi、armeabi-v7a和其他库的输出。Unity 5.x已经放弃支持armeabi,因此为避免此错误,请勿在Unity 5.x或更高版本中使用armeabi。
有关如何在应用中支持摄像头的更多详细信息,请参阅有关摄像头方向的Android开发者文档。
支持x86 ABI架构
大多数Windows设备使用基于x86的英特尔或AMD处理器。Windows Subsystem for Android使用英特尔桥接技术在基于x86的处理器上模拟Arm®应用。封装层会产生性能开销。因此,要获得最佳性能,请同时提交x86-64和Arm64架构的应用。有关如何支持x86 ABI架构的详细信息,请参阅包含x86 ABI架构的Android开发者指南。

处理不支持的功能
主题: 常用功能-不支持 | 常用功能-有限支持 | 禁用不支持的广告SDK | 处理不支持的Google Play服务 | 有条件地禁用不支持的功能 | 不支持功能列表
某些功能和服务可在移动设备上使用,但在Windows Subsystem for Android上不可用,或者可能仅提供有限的支持。当您的应用在Windows上运行时,请求使用不支持的功能和服务将导致失败。本节将介绍如何处理应用中不支持的功能。
要检查某项功能或API是否不受支持,您可以直接访问此处的不支持功能列表:
Windows Subsystem for Android目前不支持系统功能,包括Wi-Fi管理、亮度和声音控制。如果您的应用中有这些功能之一并在Windows上进行测试,则在尝试控制或访问该功能时可能会遇到问题。要检查某项功能是否不受支持,请参阅不支持的功能。
Windows Subsystem for Android上的应用不允许更改Windows系统设置。如果您的应用尝试切换设备的Wi-Fi或声音,则会失败。
如果这些系统依赖项是您应用的主要功能,亚马逊应用商店建议等到支持这些功能后再尝试将支持Windows设备。如果这些是应用中的次要功能,请确保在支持Windows设备之前妥善处理异常。
请按照以下建议处理不支持的功能:
- 对于所有Windows Subsystem for Android不支持的功能,请在应用清单中的
<uses-feature>
声明中添加android: required="false"
。这仅适用于您的应用清单中已经声明的功能。例如,要禁用NFC,您的代码可能如下所示:<uses-feature android:name="android.hardware.nfc" android:required="false"/>
- 禁用应用中其所依赖的硬件和软件功能不受Windows Subsystem for Android支持的功能。如果您在移动应用中使用相同的APK,请使用条件逻辑禁用Windows Subsystem for Android不支持的功能。有关更多详细信息,请参阅有条件地禁用不支持的功能。
常用功能-不支持
Windows Subsystem for Android目前不支持以下功能。
自定义Wi-Fi热点。 如果您的应用创建自定义热点来托管基于局域网的游戏或传输文件,则该功能可能无法如期运行,因为Windows Subsystem for Android不支持Wi-Fi热点。但是,如果运行应用的设备位于同一个网络上,则您的应用应该能够创建主机。
连接的音频设备。 在Windows Subsystem for Android上,您的应用无法检测到连接的音频设备,如耳机或头戴式耳机。如果您的应用需要耳机,并且您使用isAudioConnected
方法进行强制验证,请在Windows Subsystem for Android上跳过或忽略此强制验证。
系统声音设置。 Windows Subsystem for Android目前不支持从应用内部控制系统声音设置,例如音量。要优化应用中的声音设置,请参阅有关使用固定音量设备的Android开发者指南。
画中画。 Windows Subsystem for Android不支持画中画(PiP)模式。
常用功能-有限支持
目前,Windows Subsystem for Android对以下功能提供有限支持。
Wi-Fi。 Windows Subsystem for Android使用虚拟Wi-Fi接口,无法直接显示Wi-Fi信号。扫描Wi-Fi信号的应用将看不到可用的Wi-Fi网络。Windows Subsystem for Android目前不支持Wi-Fi热点和Wi-Fi Direct等其他Wi-Fi功能。如果您的应用依赖于Wi-Fi扫描或其他Wi-Fi管理功能,请勿支持Windows设备,因为这些功能会失效。
本地网络连接。 如果您的应用能够连接到在同一网络上运行您应用的其他设备,则此功能受支持,但必须启用Windows Subsystem for Android的高级网络设置。
视频数字版权管理。 支持Widevine L3 DRM和Clearkey DRM。Windows Subsystem for Android不支持Widevine L1、L2和其他视频DRM格式(例如PlayReady)。
音频录制。 Windows Subsystem for Android支持麦克风录音。然而,目前不支持系统音频的录制。
禁用不支持的广告SDK
如果您的应用使用广告SDK,那么请务必在Windows上测试您的应用。要开始在Windows上测试您的应用,请遵循微软的测试和调试指南。
一些广告SDK与Windows Subsystem for Android不兼容。如果广告SDK不兼容,则广告可能无法投放,这可能会导致您的应用出现问题。如果您的广告SDK导致任何意外行为,请按照以下指南将其禁用。
-
禁用所有移动广告单元,包括横幅、插页式广告和广告奖励(这会为观看广告的用户授予应用内奖励)。以下示例显示的方法可以根据广告是否可用有条件地设置布局。
boolean adsDisabled = "Subsystem for Android(TM)".equals(Build.MODEL); if (adsDisabled) { setContentView(R.layout.layoutNoAds); } else { setContentView(R.layout.layoutWithAds); }
val adsDisabled = "Subsystem for Android(TM)" == Build.MODEL if (adsDisabled) { setContentView(R.layout.layoutNoAds) } else { setContentView(R.layout.layoutWithAds) }
- 在应用中禁用依赖广告奖励的功能。例如,如果用户必须点击按钮才能观看广告以获得奖励,请禁用或移除该按钮。
- 如果您对移动应用使用相同的APK,请使用条件逻辑将更改仅应用于Windows Subsystem for Android。
处理不支持的Google Play服务
如果您在Windows上进行测试时,您的应用会将您重定向到Google Play服务,这可能是因为您的应用检查了设备制造商ID,并且如果制造商不是亚马逊,则会重定向到Google Play服务。由于Windows是由微软而非亚马逊开发的,因此当您的应用在Windows设备上运行时,就会发生这种重定向行为。要解决此问题,请勿使用制造商ID来检测设备。相反,请检查特定的服务。请遵循以下指南。
Cloud Messaging 如果您在应用中同时实现了Firebase Cloud Messaging (FCM)和Amazon Device Messaging (ADM),请使用逻辑检查ADM并在可用时使用。有关详细信息,请参阅ADM文档中的Gracefully degrade if ADM is unavailable。
应用内购买 如果您在应用中同时实现了Google应用内支付(IAB)和亚马逊应用内购买(IAP),请使用逻辑检查亚马逊IAP并在可用时使用。有关详细信息,请参阅实现在Google Play Billing和IAP之间进行调解的逻辑。
地图。 在亚马逊设备上,如果您的应用使用Google Map API,则亚马逊应用商店允许您重定向并使用Amazon Maps。但是,Amazon Maps不适用于Windows Subsystem for Android。对于Windows,请务必更新您的应用以优雅降级。
有条件地禁用不支持的功能
在有条件地禁用不支持的功能时,应尽可能检查功能的可用性,而不是使用设备检测。这使您可以维护通用代码库,同时为您的应用支持多种设备类型。
要检查硬件或软件功能,请使用Android PackageManager API中的hasSystemFeature()
方法。以下示例显示如何检测设备是否有可用的加速度计。
PackageManager packageManager = context.getPackageManager();
boolean hasAccelerometer = packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_ACCELEROMETER);
if (hasAccelerometer) {
// 此设备上有加速度计可用。
} else {
// 加速度计*不*可用。禁用该功能。
}
val packageManager: PackageManager = context.packageManager
val hasAccelerometer: Boolean = packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_ACCELEROMETER)
if (hasAccelerometer) {
// 此设备上有加速度计可用。
} else {
// 加速度计*不*可用。禁用该功能。
}
如果可能,请使用前面的示例来检测特定功能。如果您无法检查特定功能,请使用以下代码。
if ("Subsystem for Android(TM)".equals(Build.MODEL)) {
//应用可在Windows Subsystem for Android上运行
} else {
//应用*不可*在Windows Subsystem for Android上运行
}
if ("Subsystem for Android(TM)" == Build.MODEL) {
//应用可在Windows Subsystem for Android上运行
} else {
//应用*不可*在Windows Subsystem for Android上运行
}
不支持功能列表
这些列表列出了Windows Subsystem for Android目前不支持的功能。
软件功能 | 应用功能描述 |
---|---|
android.software.app_widgets |
在主页屏幕上使用应用小组件; WSA显示此功能可用,但目前始终处于关闭状态 |
android.software.device_admin |
使用设备策略管理 |
android.software.home_screen |
取代设备的主页屏幕 |
android.software.input_methods |
使用InputMethodService中的自定义输入法 |
android.software.leanback |
使用电视屏幕用户界面 |
android.software.live_tv |
流式电视直播 |
android.software.live_wallpaper |
使用动画壁纸 |
android.software.managed_users |
允许二级用户和受管理的个人资料 |
android.software.midi |
连接到MIDI设备 |
android.software.sip |
使用会话发起协议(SIP),支持视频会议和即时消息 |
android.software.sip.voip |
使用互联网语音传输协议(VoIP),支持双向视频会议 |
画中画 | 允许小型观看窗口(通常用于视频播放)叠加屏幕 |
网页应用 | 基于网络的应用 |
API | 备选方案 |
---|---|
Google Play应用内支付 | 使用亚马逊应用内购买API。 请参阅迁移指南。 |
谷歌云消息推送 | 使用Amazon Device Messaging。 请参阅迁移指南。 |
谷歌地图 | 无。Windows Subsystem for Android不支持。 |
Firebase API | 请参阅Firebase替代方案。 |