Android版本兼容问题汇总

发布于:2025-08-12 ⋅ 阅读:(19) ⋅ 点赞:(0)

一、Android adb无线调试(WI-FI Debug)

1、Android 10及以下版本:

必须通过 USB 连接后,才可实现同一 WLAN 下无线调试。

  1. 手机和电脑需连接在同一 WiFi 下;
  2. 手机开启开发者选项和 USB 调试模式,并通过 USB 连接电脑(即adb devices -l可以查看到手机);
  3. 设置手机的监听adb tcpip 5555;
  4. 拔掉 USB 线,找到手机的 IP 地址;
  5. 通过 IP 连接到手机adb connect ip(端口默认:5555);
  6. adb devices -l命令查看。

2、Android 11及以上版本:

从 Android 11 开始支持 ADB 以无线方式连接手机调试,可以彻底摆脱 USB 线。

  1. 手机和电脑需连接在同一 WiFi 下;
  2. 保证 SDK 为最新版本(adb --version ≥ 30.0.0);
  3. 手机启用开发者选项和无线调试模式(会提示确认);
  4. 允许无线调试后,选择使用配对码配对。记下显示的配对码、IP 地址和端口号;
  5. 运行adb pair ip:port,使用第 4 步中的 IP 地址和端口号;
  6. 根据提示,输入第 3 步中的配对码,系统会显示一条消息,表明您的设备已成功配对;
  7. (仅适用于 Linux 或 Windows)运行 adb connect ip:port。

二、GradientDrawable中angle属性值为45倍数问题

<gradient
    android:angle="30"
    android:endColor="#F7F1E6"
    android:startColor="#F8E5D3" />

1、Android 10及以下版本:

Android 9 GradientDrawable源码
Android 10 GradientDrawable源码
android:angle="30"值为30,并不是45的倍数,会抛异常,因此引发崩溃。

if (angle % 45 != 0) {
    throw new IllegalArgumentException("Linear gradient requires 'angle' attribute "
        + "to be a multiple of 45");
}

2、Android 11及以上版本:

Android 11 GradientDrawable源码
android:angle="30"值为30时,不会抛异常,也就不会引发崩溃。

int angle = (int) a.getFloat(R.styleable.GradientDrawableGradient_angle, st.mAngle);
// GradientDrawable historically has not parsed negative angle measurements and always
// stays on the default orientation for API levels older than Q.
// Only configure the orientation if the angle is greater than zero.
// Otherwise fallback on Orientation.TOP_BOTTOM
// In Android Q and later, actually wrap the negative angle measurement to the correct
// value
if (sWrapNegativeAngleMeasurements) {
    st.mAngle = ((angle % 360) + 360) % 360; // offset negative angle measures
} else {
    st.mAngle = angle % 360;
}

三、Broadcasts版本兼容问题

系统Broadcast版本变化-Google文档
App接收广播有两种方式:

  • context-registered receivers
  • manifest-declared receivers.

1、Android 7及以上版本:

仅一个广播 CONNECTIVITY_ACTION 广播:

  • 不再支持manifest声明接收器(manifest-declared receivers),
  • 仅支持registerReceiver(BroadcastReceiver, IntentFilter)注册接收器(context-registered receivers)

2、Android 8及以上版本:

非App专属广播:又叫隐式广播(implicit broadcasts)
Implicit broadcasts are broadcasts that don’t target your app specifically.

大部分“非App专属广播”:

  • 不再支持manifest声明接收器(manifest-declared receivers),
  • 仅支持registerReceiver(BroadcastReceiver, IntentFilter)注册接收器(context-registered receivers)

3、Android 9及以上版本:

NETWORK_STATE_CHANGED_ACTION广播不会再收到“用户的位置或个人身份数据”(包括:SSIDs, BSSIDs, connection information, or scan results),如需获取需要额外调用getConnectionInfo() 方法获取。

getConnectInfo() 在Android 12(API 31)及以上版本已弃用(This method was deprecated in API level 31.),改用:NetworkCapabilities.getTransportInfo() 获取。
获取NetworkCapabilities对象的方式有两个:

方式一:NetworkCallback回调onCapabilitiesChanged方法参数中的NetworkCapabilities对象调用NetworkCapabilities.getTransportInfo() 方法获取

NetworkRequest request = new NetworkRequest.Builder()
      .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
      .build();
final ConnectivityManager connectivityManager =
      context.getSystemService(ConnectivityManager.class);
final NetworkCallback networkCallback = new NetworkCallback(ConnectivityManager.NetworkCallback.FLAG_INCLUDE_LOCATION_INFO) {
      ...
      @Override
      void onAvailable(Network network) {}

      @Override
      void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
          WifiInfo wifiInfo = (WifiInfo) networkCapabilities.getTransportInfo();
          ssidList.add(wifiInfo.getSSID());
          connectivityManager.unregisterNetworkCallback(this);
      }
      // etc.
 };
connectivityManager.registerNetworkCallback(request, networkCallback);
//...
connectivityManager.unregisterNetworkCallback(networkCallback);

方式二:ConnectivityManager.getNetworkCapabilities(Network)得到NetworkCapabilities对象后调用NetworkCapabilities.getTransportInfo() 获取

ConnectivityManager cm = context.getSystemService(ConnectivityManager.class);
Network n = cm.getActiveNetwork();
NetworkCapabilities netCaps = cm.getNetworkCapabilities(n);
WifiInfo info = (WifiInfo) netCaps.getTransportInfo();
String ssid = wifiInfo.getSSID();

四、


网站公告

今日签到

点亮在社区的每一天
去签到