一、Android adb无线调试(WI-FI Debug)
1、Android 10及以下版本:
必须通过 USB 连接后,才可实现同一 WLAN 下无线调试。
- 手机和电脑需连接在同一 WiFi 下;
- 手机开启开发者选项和 USB 调试模式,并通过 USB 连接电脑(即adb devices -l可以查看到手机);
- 设置手机的监听adb tcpip 5555;
- 拔掉 USB 线,找到手机的 IP 地址;
- 通过 IP 连接到手机adb connect ip(端口默认:5555);
- adb devices -l命令查看。
2、Android 11及以上版本:
从 Android 11 开始支持 ADB 以无线方式连接手机调试,可以彻底摆脱 USB 线。
- 手机和电脑需连接在同一 WiFi 下;
- 保证 SDK 为最新版本(adb --version ≥ 30.0.0);
- 手机启用开发者选项和无线调试模式(会提示确认);
- 允许无线调试后,选择使用配对码配对。记下显示的配对码、IP 地址和端口号;
- 运行adb pair ip:port,使用第 4 步中的 IP 地址和端口号;
- 根据提示,输入第 3 步中的配对码,系统会显示一条消息,表明您的设备已成功配对;
- (仅适用于 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();