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

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

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连接网络。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值