sharedUserID的使用

在AndroidManifest.xml的根节点中设置android:sharedUserId="android.uid.system"属性,应用签名时需要跟系统的签名保持一致,即可以用java -jar signapk.jar platform.x509.pem platform.pk8  NBSecu.apk a.apk,编译后的a.apk拥有系统所有权限,相当于系统的“设置”应用。


该应用在不需要root权限的情况下,能够调用系统的任何方法。如下面这些操作:


1.断开/连接某个应用软件的网络

管理应用的联网情况,需要开启防火墙,开启防火墙时,所有的应用都不能联网。所以要遍历所有的应用,设置为可联网。

Method method = Class.forName("android.os.ServiceManager")
        .getMethod("getService", String.class);
IBinder binder = (IBinder) method.invoke(null,
        new Object[] { NETWORKMANAGEMENT_SERVICE });
mNMService = INetworkManagementService.Stub.asInterface(binder);
// 设置防火墙为true时,所有的应用都不可联网
mNMService.setFirewallEnabled(true);
mNMService.setFirewallEgressDestRule("0.0.0.0/0.0.0.0", 53, true);

// 已经设置断网的应用
final List<Integer> saveList = getSaveAppList(ctx);
// 获取所有安装的应用
final List<TrafficApp> apps = AppTrafficManager.getInitApps(ctx);
new Thread(new Runnable() {
    public void run() {
        for (TrafficApp app : apps) {
            if(!saveList.contains(app.uid)){
                // 设置应用可以联网
                setUidNetWorkState(app.uid, true);
            }
        }
    }
}).start();


public static void setUidNetWorkState(int uid, boolean isEnable) {
    try {
        // 根据uid设置是否可以联网
        mNMService.setFirewallUidRule(uid, isEnable);
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}

aidl的处理:aidl中用不到的方法可以直接删除掉,只保留用到的方法即可。


2.设置数据网络是否可用

Android5.0之前所有应用都可以通过反射调用CONNECTIVITY_SERVICE中的setMobileDataEnabled(boolean enable)方法设置。

Android5.0以上都需要系统权限才可以设置。

Class<?> serviceManager = Class.forName("android.os.ServiceManager");
Method method = serviceManager.getDeclaredMethod("getService", String.class);
IBinder subBinder = (IBinder) method.invoke(serviceManager.newInstance(), "isub");
// android5.0是该方法,5.1中该方法的返回值类型改为int型了
long dataSubId = ISub.Stub.asInterface(subBinder).getDefaultDataSubId();
IBinder binder = (IBinder) method.invoke(serviceManager.newInstance(), "phone");
// android5.0是该方法,5.1中该方法改为setDataEnabled(int subId, boolean enable);
ITelephony.Stub.asInterface(binder).setDataEnabledUsingSubId(dataSubId, enabled);

3.挂断电话

Class<?> serviceManager = Class.forName("android.os.ServiceManager");
Method method = serviceManager.getMethod("getService", String.class);
IBinder binder = (IBinder) method.invoke(
        serviceManager.newInstance(), "telecom");
ITelecomService.Stub.asInterface(binder).endCall();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值