• Android11编译第五弹:开启VPN权限


    问题:智能货柜上线以后,因为分布在全国各地,或者在国外,遇到问题需要调试设备的时候,需要及时连接设备,查看设备信息,拉取日志。

    一种方式是直接上传日志到云端,通过云端查看日志信息,但是耗费流量,而且浪费云端资源;

    二种方式:采用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

    1. mService = IConnectivityManager.Stub.asInterface(
    2. ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
    3. // ==== modify start ==== zhouronghua VPN Authorize
    4. try {
    5. if (mService.prepareVpn(null, mPackage, UserHandle.myUserId())) {
    6. // Authorize this app to initiate VPN connections in the future without user
    7. // intervention.
    8. mService.setVpnPackageAuthorization(mPackage, UserHandle.myUserId(), mVpnType);
    9. setResult(RESULT_OK);
    10. finish();
    11. }
    12. } catch (Exception e) {
    13. Log.e(TAG, "onClick", e);
    14. }
    15. // ==== modify end ====
    16. if (prepareVpn()) {
    17. setResult(RESULT_OK);
    18. finish();
    19. return;
    20. }
    21. // ==== modify start ==== zhouronghua VPN Authorize
    22. /** View view = View.inflate(this, R.layout.confirm, null);
    23. ((TextView) view.findViewById(R.id.warning)).setText(
    24. Html.fromHtml(getString(R.string.warning, getVpnLabel()),
    25. this, null /* tagHandler ));
    26. mAlertParams.mTitle = getText(R.string.prompt);
    27. mAlertParams.mPositiveButtonText = getText(android.R.string.ok);
    28. mAlertParams.mPositiveButtonListener = this;
    29. getWindow().setCloseOnTouchOutside(false);
    30. getWindow().addPrivateFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
    31. Button button = mAlert.getButton(DialogInterface.BUTTON_POSITIVE);
    32. button.setFilterTouchesWhenObscured(true); ***/
    33. // ==== modify end ====
    34. }

     2.2 关闭VPN授权申请

    frameworks/base/services/core/java/com/android/server/connectivity/Vpn.java

    1. // ==== modidy start ==== zhouronghua
    2. private void enforceControlPermission() {
    3. // mContext.enforceCallingPermission(Manifest.permission.CONTROL_VPN, "Unauthorized Caller");
    4. }
    5. private void enforceControlPermissionOrInternalCaller() {
    6. // Require the caller to be either an application with CONTROL_VPN permission or a process
    7. // in the system server.
    8. //mContext.enforceCallingOrSelfPermission(Manifest.permission.CONTROL_VPN,
    9. // "Unauthorized Caller");
    10. }
    11. private void enforceSettingsPermission() {
    12. // mContext.enforceCallingOrSelfPermission(Manifest.permission.NETWORK_SETTINGS,
    13. // "Unauthorized Caller");
    14. }
    15. // ==== modidy end ====

     注释掉VPN强制授权。2.1已经自动授权了。

    2.3 集成openvpn APK

    需要继承一个VPN客户端,用于连接VPN服务器。

    openvpn.apk内置到系统中。

    前面第一弹已经写过,此处就不再重复。

    packages/apps/Sandstar/Sandstar/Android.mk

    1. include $(CLEAR_VARS)
    2. LOCAL_MODULE := openvpn
    3. LOCAL_MODULE_TAGS := optional
    4. LOCAL_MODULE_CLASS := APPS
    5. LOCAL_CERTIFICATE := platform
    6. LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
    7. LOCAL_SRC_FILES := openvpn.apk
    8. LOCAL_DEX_PREOPT := false
    9. include $(BUILD_PREBUILT)

    这样,使用VPN的时候,下发VPN key, 然后客户端通过VPN key连接网络。

  • 相关阅读:
    暑假超越计划练习题(2)
    SpringBatch(10):ItemWriter详解
    Netty(一)NIO-基础
    【ISP】噪声--sensor(2)
    【华为OD机试真题 python】 运维日志排序【2022 Q4 | 100分】
    【ARM Coresight SoC-400/SoC-600 专栏导读】
    fastapi_No.21_安全性_目录权限认证
    redis复习总结
    Android应用内设置多语言
    (附源码)php校园寝室分配查询系统 毕业设计 032027
  • 原文地址:https://blog.csdn.net/joedan0104/article/details/132788804