问题:智能货柜上线以后,因为分布在全国各地,或者在国外,遇到问题需要调试设备的时候,需要及时连接设备,查看设备信息,拉取日志。
一种方式是直接上传日志到云端,通过云端查看日志信息,但是耗费流量,而且浪费云端资源;
二种方式:采用VPN网络,通过adb tcp连接设备,就能访问设备,拉取日志,查看设备状态。
采用第二种方案比较好。
一、什么是VPN网络?
虚拟专用网(VPN)是一条通信隧道,可以在不可信的中间网络上提供身份认证和数据通信的点对点传输。大多数VPN使用加密技术来保护封装的通信数据,但是加密对于VPN 连接而言并非必需的。
简单来说,设备不论连接什么类型的网络,只要和VPN服务器提供的网络,那么这些设备就在VPN网络中,相当于在同一个虚拟局域网内。因此就可以使用adb访问智能货柜设备。
因为需要支持VPN访问,因此AOSP需要定制支持VPN权限。
二、集成步骤
2.1 去掉VPN授权确认弹窗
应用连接VPN,需要授权弹窗用户确认,默认直接授权。
frameworks/base/packages/VpnDialogs/src/com/android/vpndialogs/ConfirmDialog.java
mService = IConnectivityManager.Stub.asInterface(
ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
// ==== modify start ==== zhouronghua VPN Authorize
try {
if (mService.prepareVpn(null, mPackage, UserHandle.myUserId())) {
// Authorize this app to initiate VPN connections in the future without user
// intervention.
mService.setVpnPackageAuthorization(mPackage, UserHandle.myUserId(), mVpnType);
setResult(RESULT_OK);
finish();
}
} catch (Exception e) {
Log.e(TAG, "onClick", e);
}
// ==== modify end ====
if (prepareVpn()) {
setResult(RESULT_OK);
finish();
return;
}
// ==== modify start ==== zhouronghua VPN Authorize
/** View view = View.inflate(this, R.layout.confirm, null);
((TextView) view.findViewById(R.id.warning)).setText(
Html.fromHtml(getString(R.string.warning, getVpnLabel()),
this, null /* tagHandler ));
mAlertParams.mTitle = getText(R.string.prompt);
mAlertParams.mPositiveButtonText = getText(android.R.string.ok);
mAlertParams.mPositiveButtonListener = this;
getWindow().setCloseOnTouchOutside(false);
getWindow().addPrivateFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
Button button = mAlert.getButton(DialogInterface.BUTTON_POSITIVE);
button.setFilterTouchesWhenObscured(true); ***/
// ==== modify end ====
}
2.2 关闭VPN授权申请
frameworks/base/services/core/java/com/android/server/connectivity/Vpn.java
// ==== modidy start ==== zhouronghua
private void enforceControlPermission() {
// mContext.enforceCallingPermission(Manifest.permission.CONTROL_VPN, "Unauthorized Caller");
}
private void enforceControlPermissionOrInternalCaller() {
// Require the caller to be either an application with CONTROL_VPN permission or a process
// in the system server.
//mContext.enforceCallingOrSelfPermission(Manifest.permission.CONTROL_VPN,
// "Unauthorized Caller");
}
private void enforceSettingsPermission() {
// mContext.enforceCallingOrSelfPermission(Manifest.permission.NETWORK_SETTINGS,
// "Unauthorized Caller");
}
// ==== modidy end ====
注释掉VPN强制授权。2.1已经自动授权了。
2.3 集成openvpn APK
需要继承一个VPN客户端,用于连接VPN服务器。
openvpn.apk内置到系统中。
前面第一弹已经写过,此处就不再重复。
packages/apps/Sandstar/Sandstar/Android.mk文章来源:https://www.toymoban.com/news/detail-708688.html
include $(CLEAR_VARS)
LOCAL_MODULE := openvpn
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := APPS
LOCAL_CERTIFICATE := platform
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_SRC_FILES := openvpn.apk
LOCAL_DEX_PREOPT := false
include $(BUILD_PREBUILT)
这样,使用VPN的时候,下发VPN key, 然后客户端通过VPN key连接网络。文章来源地址https://www.toymoban.com/news/detail-708688.html
到了这里,关于Android11编译第五弹:开启VPN权限的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!