Android防火墙+流量统计代码

Android应用源码可以按时间段查询的流量统计项目 立即下载
 

BroadcastReceiver模块

用于监听开机信息 并初始化和启动服务

view plaincopy to clipboardprint?
package zy.dnh;  
import java.io.File;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import android.content.BroadcastReceiver;  
import android.content.Context;  
import android.content.Intent;  
import android.widget.Toast;  
public class getpowerinfo extends BroadcastReceiver{  
    FileOutputStream out;  
    final public String ONPATH = "/data/data/zy.dnh/on.txt";  
    @Override 
    public void onReceive(Context context, Intent intent) {  
        // TODO Auto-generated method stub  
           
         if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){  
                Intent bootActivityIntent=new Intent(context,mService1.class);//启动服务  
                bootActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
                writefile("0,0,0,0,0,0,0,0,0,0,0,0",ONPATH);  
                context.startService(bootActivityIntent);  
                 Toast.makeText(context, "Netcounter service has been lauched", Toast.LENGTH_LONG).show();  
                 Api.applySavedIptablesRules(context, false);//应用防火墙规则  
                 Toast.makeText(context, "Wall rules have been lauched", Toast.LENGTH_LONG).show();  
         }  
    }  
    public void writefile(String str,String path )  
    {  
       File file;  
       try {  
          //创建文件  
         file = new File(path);  
          file.createNewFile();  
            
          //打开文件file的OutputStream  
          out = new FileOutputStream(file);  
          String infoToWrite = str;  
          //将字符串转换成byte数组写入文件  
          out.write(infoToWrite.getBytes());  
          //关闭文件file的OutputStream  
          out.close();  
            
            
            
       } catch (IOException e) {  
          //将出错信息打印到Logcat  
           
            
       } 
package zy.dnh;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class getpowerinfo extends BroadcastReceiver{
 FileOutputStream out;
 final public String ONPATH = "/data/data/zy.dnh/on.txt";
 @Override
 public void onReceive(Context context, Intent intent) {
  // TODO Auto-generated method stub
  
   if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){
       Intent bootActivityIntent=new Intent(context,mService1.class);//启动服务
          bootActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          writefile("0,0,0,0,0,0,0,0,0,0,0,0",ONPATH);
          context.startService(bootActivityIntent);
           Toast.makeText(context, "Netcounter service has been lauched", Toast.LENGTH_LONG).show();
           Api.applySavedIptablesRules(context, false);//应用防火墙规则
           Toast.makeText(context, "Wall rules have been lauched", Toast.LENGTH_LONG).show();
   }
 }
 public void writefile(String str,String path )
    {
     File file;
     try {
          //创建文件
    file = new File(path);
          file.createNewFile();
         
          //打开文件file的OutputStream
          out = new FileOutputStream(file);
          String infoToWrite = str;
          //将字符串转换成byte数组写入文件
          out.write(infoToWrite.getBytes());
          //关闭文件file的OutputStream
          out.close();
         
         
         
       } catch (IOException e) {
          //将出错信息打印到Logcat
     
         
       }
 

mService1模块

后台服务,用于维护流量日志

view plaincopy to clipboardprint?
public class mService1 extends Service  
{  
    
    
    private Handler objHandler = new Handler();  
    private int intCounter=0;  
    private int mHour;   
    private int mMinute;   
    private int mYear;   
    private int mMonth;   
    private int mDay;  
    private String mdate;  
      
      
    final public String DEV_FILE = "/proc/self/net/dev";//系统流量文件  
    String[] ethdata={"0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"};  
    String[] gprsdata={"0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"};  
    String[] wifidata={"0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"};  
    String data="0,0,0,0,0,0,0,0,0,0,0,0";//对应on.txt里面的格式  
    final String ETHLINE="  eth0";//以太网信息所在行  
    final String GPRSLINE="rmnet0";  
    final String WIFILINE="tiwlan0";  
      
    final String TEXT_ENCODING = "UTF-8";  
       
    final public String ONPATH = "/data/data/zy.dnh/on.txt";  
    final public String LOGPATH = "/data/data/zy.dnh/log.txt";  
      
    private Runnable mTasks = new Runnable()   
    {  
     
        public void run()//运行该服务执行此函数  
        {  
          refresh();  
          
          
          intCounter++;  
        // DisplayToast("Counter:"+Integer.toString(intCounter));  
         objHandler.postDelayed(mTasks, 30000);//每3000毫秒执行一次  
       }   
    };  
    
  @Override 
  public void onStart(Intent intent, int startId)  
  {  
    // TODO Auto-generated method stub  
    //writefile("0,0,0,0,0,0,0,0,0,0,0,0",ONPATH);//每次启动服务 初始化onpath  
      
    objHandler.postDelayed(mTasks, 0);  
    super.onStart(intent, startId);  
  }  
  @Override 
  public void onCreate()  
  {  
    // TODO Auto-generated method stub  
        
    super.onCreate();  
  }  
    
  @Override 
  public IBinder onBind(Intent intent)  
  {  
    // TODO Auto-generated method stub  
      
      
    return null;  
  }  
  @Override 
  public void onDestroy()  
  {  
    // TODO Auto-generated method stub  
      
    /*  */ 
    objHandler.removeCallbacks(mTasks);  
    super.onDestroy();  
  }    
  public void DisplayToast(String str)  
  {  
    Toast.makeText(this,str,Toast.LENGTH_SHORT).show();  
  }    
  public void readdev()  
  {  
      FileReader fstream = null;  
    try {  
          fstream = new FileReader(DEV_FILE);  
            
          }   
        catch (FileNotFoundException e) {  
            DisplayToast("Could not read " + DEV_FILE);  
            
        }  
       BufferedReader in = new BufferedReader(fstream, 500);  
       String line;  
       String[] segs;  
       String[] netdata;  
         
       int count=0;  
       int k;  
       int j;  
       try {  
          while ((line = in.readLine()) != null) {  
              segs = line.trim().split(":");  
              if(line.startsWith(ETHLINE))  
                {  
                    
                  netdata=segs[1].trim().split(" ");  
                  for(k=0,j=0;k<netdata.length;k++)  
                  {  
                     if(netdata[k].length()>0)   
                     {   
                          
                          ethdata[j]=netdata[k];  
                          j++;  
                     }  
                  }  
              }  
              else if(line.startsWith(GPRSLINE))  
              {  
                   
                netdata=segs[1].trim().split(" ");  
              for(k=0,j=0;k<netdata.length;k++)  
              {  
                 if(netdata[k].length()>0)   
                 {   
                        
                      gprsdata[j]=netdata[k];  
                      j++;  
                 }  
              }  
              }  
            else if(line.startsWith(WIFILINE))  
          {  
               
            netdata=segs[1].trim().split(" ");  
                for(k=0,j=0;k<netdata.length;k++)  
                {  
                    if(netdata[k].length()>0)   
                    {   
                      
                      wifidata[j]=netdata[k];  
                      j++;  
                    }  
                }  
          }  
               
                
                
                
              count++;  
          }  
          fstream.close();  
             
        }   
        catch (IOException e) {  
          DisplayToast(e.toString());  
        }  
  }  
  public String getinfo(String path)  
  {  
    File file;  
    String str="";   
    FileInputStream in;  
   try{  
    //打开文件file的InputStream  
     file = new File(path);  
       in = new FileInputStream(file);  
       //将文件内容全部读入到byte数组  
       int length = (int)file.length();  
       byte[] temp = new byte[length];  
       in.read(temp, 0, length);  
       //将byte数组用UTF-8编码并存入display字符串中  
       str =  EncodingUtils.getString(temp,TEXT_ENCODING);  
       //关闭文件file的InputStream  
       in.close();  
   }  
   catch (IOException e) {  
         
      DisplayToast(e.toString());  
         
   }  
    return str;  
  }  
  public void writefile(String str,String path )  
  {  
    File file;  
    FileOutputStream out;  
     try {  
           //创建文件  
         file = new File(path);  
           file.createNewFile();  
           //打开文件file的OutputStream  
           out = new FileOutputStream(file);  
           String infoToWrite = str;  
           //将字符串转换成byte数组写入文件  
           out.write(infoToWrite.getBytes());  
           //关闭文件file的OutputStream  
           out.close();   
       } catch (IOException e) {  
           //将出错信息打印到Logcat  
          DisplayToast(e.toString());  
             
       }  
  }  
  public void refresh()  
  {  
        
        
      readdev();//读取本次开机之后直到当前系统的总流量  
        
       data=ethdata[0]+","+ethdata[1]+","+ethdata[8]+","+ethdata[9]+"," 
           +gprsdata[0]+","+gprsdata[1]+","+gprsdata[8]+","+gprsdata[9]+"," 
           +wifidata[0]+","+wifidata[1]+","+wifidata[8]+","+wifidata[9];  
      String onstr=getinfo(ONPATH);//读取on.txt记录到onstr里  
       String ondata[]=onstr.split(",");//将onstr各项分离 放到ondata里  
      //计算增量  
      int [] delta=new int [12];  
        
      delta[0]=Integer.parseInt(ethdata[0])-Integer.parseInt(ondata[0]);  
      delta[1]=Integer.parseInt(ethdata[1])-Integer.parseInt(ondata[1]);  
      delta[2]=Integer.parseInt(ethdata[8])-Integer.parseInt(ondata[2]);  
      delta[3]=Integer.parseInt(ethdata[9])-Integer.parseInt(ondata[3]);  
      delta[4]=Integer.parseInt(gprsdata[0])-Integer.parseInt(ondata[4]);  
      delta[5]=Integer.parseInt(gprsdata[1])-Integer.parseInt(ondata[5]);  
      delta[6]=Integer.parseInt(gprsdata[8])-Integer.parseInt(ondata[6]);  
      delta[7]=Integer.parseInt(gprsdata[9])-Integer.parseInt(ondata[7]);  
      delta[8]=Integer.parseInt(wifidata[0])-Integer.parseInt(ondata[8]);  
      delta[9]=Integer.parseInt(wifidata[1])-Integer.parseInt(ondata[9]);  
      delta[10]=Integer.parseInt(wifidata[8])-Integer.parseInt(ondata[10]);  
      delta[11]=Integer.parseInt(wifidata[9])-Integer.parseInt(ondata[11]);  
        
        
      //读取log.txt  
    //获取当前时间  
       final Calendar c = Calendar.getInstance();   
      mYear = c.get(Calendar.YEAR); //获取当前年份   
      mMonth = c.get(Calendar.MONTH)+1;//获取当前月份   
      mDay = c.get(Calendar.DAY_OF_MONTH);//获取当前月份的日期号码   
      mHour = c.get(Calendar.HOUR_OF_DAY);//获取当前的小时数   
      mMinute = c.get(Calendar.MINUTE);//获取当前的分钟数     
      mdate=mYear+"-"+mMonth+"-"+mDay;  
        
      String text=getinfo(LOGPATH);//将log.txt的内容读到text字符串中  
      String [] line=text.split("/n");   
       
      String today=line[line.length-1];//获得今日已记录流量  
      String [] beToday=today.split(",");   
     //检查文件最后一行是否为今天的流量记录信息  
      if(!beToday[0].equals(mdate))//  
        //判断今日流量是否已经记录,如果今日流量没有记录  
      {  
       
          text=text+mdate+",0,0,0,0,0,0,0,0,0,0,0,0/n";  
          writefile(text,LOGPATH);  
            
            
          line=text.split("/n");  
          today=line[line.length-1];//获得今日已记录流量  
           
          beToday=today.split(",");   
      }  
      int i;  
     //处理今日流量  
      int [] newTodaydata=new int [12];//表示今日流量  
      String newtoday=mdate;  
      for(i=0;i<=11;i++)//更新今日流量  
      {  
          newTodaydata[i]=Integer.parseInt(beToday[i+1])+delta[i];  
          newtoday=newtoday+","+newTodaydata[i];  
      }  
      newtoday=newtoday+"/n";  
        
        
      String [] beTotal=line[0].split(",");  
      int [] newTotaldata=new int [12];//表示总流量数值  
      //更新第一行  
      String newtotal="total";  
      for(i=0;i<=11;i++)//更新今日流量和总流量  
      {    
          newTotaldata[i]=Integer.parseInt(beTotal[i+1])+delta[i];//总流量数值+delta[i]更新  
          newtotal=newtotal+","+newTotaldata[i];  
      }  
      newtotal= newtotal+"/n";  
      //处理中间不变的部分  
      String before="";//before为之前的从第1行到昨天的流量记录  
        
      for(i=1;i<=line.length-2;i++)  
        before=before+line[i]+"/n";//代表中间不变的部分  
        
      String newlog=newtotal+before+newtoday;  
      writefile(data,ONPATH);//更新流量记录  
      writefile(newlog,LOGPATH);//更新log*/  
        
        
        
  }  
    
    
} 
public class mService1 extends Service
{
 
 
    private Handler objHandler = new Handler();
    private int intCounter=0;
    private int mHour;
 private int mMinute;
 private int mYear;
 private int mMonth;
 private int mDay;
 private String mdate;
 
 
 final public String DEV_FILE = "/proc/self/net/dev";//系统流量文件
 String[] ethdata={"0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"};
 String[] gprsdata={"0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"};
 String[] wifidata={"0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"};
 String data="0,0,0,0,0,0,0,0,0,0,0,0";//对应on.txt里面的格式
 final String ETHLINE="  eth0";//以太网信息所在行
 final String GPRSLINE="rmnet0";
 final String WIFILINE="tiwlan0";
 
 final String TEXT_ENCODING = "UTF-8";
 
 final public String ONPATH = "/data/data/zy.dnh/on.txt";
 final public String LOGPATH = "/data/data/zy.dnh/log.txt";
 
    private Runnable mTasks = new Runnable()
    {
  
        public void run()//运行该服务执行此函数
        {
       refresh();
     
     
          intCounter++;
        // DisplayToast("Counter:"+Integer.toString(intCounter));
         objHandler.postDelayed(mTasks, 30000);//每3000毫秒执行一次
       }
    };
 
  @Override
  public void onStart(Intent intent, int startId)
  {
    // TODO Auto-generated method stub
 //writefile("0,0,0,0,0,0,0,0,0,0,0,0",ONPATH);//每次启动服务 初始化onpath
   
    objHandler.postDelayed(mTasks, 0);
    super.onStart(intent, startId);
  }
  @Override
  public void onCreate()
  {
    // TODO Auto-generated method stub
  
    super.onCreate();
  }
 
  @Override
  public IBinder onBind(Intent intent)
  {
    // TODO Auto-generated method stub
   
   
    return null;
  }
  @Override
  public void onDestroy()
  {
    // TODO Auto-generated method stub
   
    /*  */
    objHandler.removeCallbacks(mTasks);
    super.onDestroy();
  } 
  public void DisplayToast(String str)
  {
   Toast.makeText(this,str,Toast.LENGTH_SHORT).show();
  } 
  public void readdev()
  {
   FileReader fstream = null;
   try {
          fstream = new FileReader(DEV_FILE);
         
          }
      catch (FileNotFoundException e) {
       DisplayToast("Could not read " + DEV_FILE);
         
        }
       BufferedReader in = new BufferedReader(fstream, 500);
       String line;
       String[] segs;
       String[] netdata;
      
       int count=0;
       int k;
       int j;
       try {
          while ((line = in.readLine()) != null) {
           segs = line.trim().split(":");
           if(line.startsWith(ETHLINE))
             {
              
               netdata=segs[1].trim().split(" ");
               for(k=0,j=0;k<netdata.length;k++)
               {
               if(netdata[k].length()>0)
               {
                       
                    ethdata[j]=netdata[k];
                    j++;
               }
               }
              }
           else if(line.startsWith(GPRSLINE))
           {
          
          netdata=segs[1].trim().split(" ");
             for(k=0,j=0;k<netdata.length;k++)
             {
             if(netdata[k].length()>0)
             {
                     
                  gprsdata[j]=netdata[k];
                  j++;
             }
             }
           }
         else if(line.startsWith(WIFILINE))
         {
        
        netdata=segs[1].trim().split(" ");
             for(k=0,j=0;k<netdata.length;k++)
             {
              if(netdata[k].length()>0)
              {
                   
                wifidata[j]=netdata[k];
                j++;
              }
             }
         }
            
             
             
             
              count++;
          }
          fstream.close();
          
        }
        catch (IOException e) {
          DisplayToast(e.toString());
        }
  }
  public String getinfo(String path)
  {
   File file;
   String str="";
   FileInputStream in;
   try{
   //打开文件file的InputStream
    file = new File(path);
       in = new FileInputStream(file);
       //将文件内容全部读入到byte数组
       int length = (int)file.length();
       byte[] temp = new byte[length];
       in.read(temp, 0, length);
       //将byte数组用UTF-8编码并存入display字符串中
       str =  EncodingUtils.getString(temp,TEXT_ENCODING);
       //关闭文件file的InputStream
       in.close();
   }
   catch (IOException e) {
      
    DisplayToast(e.toString());
      
   }
    return str;
  }
  public void writefile(String str,String path )
  {
   File file;
   FileOutputStream out;
    try {
           //创建文件
     file = new File(path);
           file.createNewFile();
           //打开文件file的OutputStream
           out = new FileOutputStream(file);
           String infoToWrite = str;
           //将字符串转换成byte数组写入文件
           out.write(infoToWrite.getBytes());
           //关闭文件file的OutputStream
           out.close();
       } catch (IOException e) {
           //将出错信息打印到Logcat
        DisplayToast(e.toString());
          
       }
  }
  public void refresh()
  {
  
  
   readdev();//读取本次开机之后直到当前系统的总流量
  
    data=ethdata[0]+","+ethdata[1]+","+ethdata[8]+","+ethdata[9]+","
        +gprsdata[0]+","+gprsdata[1]+","+gprsdata[8]+","+gprsdata[9]+","
        +wifidata[0]+","+wifidata[1]+","+wifidata[8]+","+wifidata[9];
   String onstr=getinfo(ONPATH);//读取on.txt记录到onstr里
    String ondata[]=onstr.split(",");//将onstr各项分离 放到ondata里
   //计算增量
   int [] delta=new int [12];
  
   delta[0]=Integer.parseInt(ethdata[0])-Integer.parseInt(ondata[0]);
   delta[1]=Integer.parseInt(ethdata[1])-Integer.parseInt(ondata[1]);
   delta[2]=Integer.parseInt(ethdata[8])-Integer.parseInt(ondata[2]);
   delta[3]=Integer.parseInt(ethdata[9])-Integer.parseInt(ondata[3]);
   delta[4]=Integer.parseInt(gprsdata[0])-Integer.parseInt(ondata[4]);
   delta[5]=Integer.parseInt(gprsdata[1])-Integer.parseInt(ondata[5]);
   delta[6]=Integer.parseInt(gprsdata[8])-Integer.parseInt(ondata[6]);
   delta[7]=Integer.parseInt(gprsdata[9])-Integer.parseInt(ondata[7]);
   delta[8]=Integer.parseInt(wifidata[0])-Integer.parseInt(ondata[8]);
   delta[9]=Integer.parseInt(wifidata[1])-Integer.parseInt(ondata[9]);
   delta[10]=Integer.parseInt(wifidata[8])-Integer.parseInt(ondata[10]);
   delta[11]=Integer.parseInt(wifidata[9])-Integer.parseInt(ondata[11]);
  
  
   //读取log.txt
 //获取当前时间
    final Calendar c = Calendar.getInstance();
      mYear = c.get(Calendar.YEAR); //获取当前年份
      mMonth = c.get(Calendar.MONTH)+1;//获取当前月份
      mDay = c.get(Calendar.DAY_OF_MONTH);//获取当前月份的日期号码
      mHour = c.get(Calendar.HOUR_OF_DAY);//获取当前的小时数
      mMinute = c.get(Calendar.MINUTE);//获取当前的分钟数  
      mdate=mYear+"-"+mMonth+"-"+mDay;
     
   String text=getinfo(LOGPATH);//将log.txt的内容读到text字符串中
   String [] line=text.split("/n");
 
   String today=line[line.length-1];//获得今日已记录流量
   String [] beToday=today.split(",");
  //检查文件最后一行是否为今天的流量记录信息
   if(!beToday[0].equals(mdate))//
  //判断今日流量是否已经记录,如果今日流量没有记录
   {
 
    text=text+mdate+",0,0,0,0,0,0,0,0,0,0,0,0/n";
    writefile(text,LOGPATH);
   
   
    line=text.split("/n");
    today=line[line.length-1];//获得今日已记录流量
  
    beToday=today.split(",");
   }
   int i;
  //处理今日流量
   int [] newTodaydata=new int [12];//表示今日流量
   String newtoday=mdate;
   for(i=0;i<=11;i++)//更新今日流量
   {
    newTodaydata[i]=Integer.parseInt(beToday[i+1])+delta[i];
    newtoday=newtoday+","+newTodaydata[i];
   }
   newtoday=newtoday+"/n";
  
  
   String [] beTotal=line[0].split(",");
   int [] newTotaldata=new int [12];//表示总流量数值
   //更新第一行
   String newtotal="total";
   for(i=0;i<=11;i++)//更新今日流量和总流量
   { 
    newTotaldata[i]=Integer.parseInt(beTotal[i+1])+delta[i];//总流量数值+delta[i]更新
       newtotal=newtotal+","+newTotaldata[i];
   }
   newtotal= newtotal+"/n";
   //处理中间不变的部分
   String before="";//before为之前的从第1行到昨天的流量记录
  
   for(i=1;i<=line.length-2;i++)
     before=before+line[i]+"/n";//代表中间不变的部分
  
   String newlog=newtotal+before+newtoday;
   writefile(data,ONPATH);//更新流量记录
   writefile(newlog,LOGPATH);//更新log*/
  
  
  
  }
 
 
}

应用iptable规则模块,通过运行iptable脚本来实现iptable规则的应用

view plaincopy to clipboardprint?
private static boolean applyIptablesRulesImpl(Context ctx, List<Integer> uids, boolean showErrors) {  
                if (ctx == null) {  
                        return false;  
                }  
                final SharedPreferences prefs = ctx.getSharedPreferences(PREFS_NAME, 0);  
                final boolean whitelist = prefs.getString(PREF_MODE, MODE_WHITELIST).equals(MODE_WHITELIST);  
                boolean wifi = false; // Wi-fi selected ?  
                final String itfs = prefs.getString(PREF_ITFS, ITF_3G);  
                String itfFilter;  
                if (itfs.indexOf("|") != -1) {  
                        itfFilter = ""; // Block all interfaces  
                        wifi = true;  
                } else if (itfs.indexOf(ITF_3G) != -1) {  
                        itfFilter = "-o rmnet+";;   
                        // Block all rmnet interfaces  
                } else {  
                        itfFilter = "-o tiwlan+";;  
                        // Block all tiwlan interfaces  
                        wifi = true;  
                }  
    final StringBuilder script = new StringBuilder();  
     try {  
             int code;  
        script.append("iptables -F || exit/n");  
         final String targetRule = (whitelist ? "ACCEPT" : "REJECT");  
        if (whitelist && wifi) {  
                                // When "white listing" Wi-fi, we need ensure that the dhcp and wifi users are allowed  
                                int uid = android.os.Process.getUidForName("dhcp");  
            if (uid != -1) script.append("iptables -A OUTPUT "   
                                        + itfFilter + " -m owner --uid-owner " + uid + " -j ACCEPT || exit/n");  
              uid = android.os.Process.getUidForName("wifi");  
            if (uid != -1) script.append("iptables -A OUTPUT " + itfFilter + " -m owner --uid-owner " + uid + " -j ACCEPT || exit/n"); }  
          for (Integer uid : uids) {  
             script.append("iptables -A OUTPUT " + itfFilter   
                                        + " -m owner --uid-owner " + uid + " -j " + targetRule + " || exit/n");  
                        }  
           if (whitelist) {  
                script.append("iptables -A OUTPUT " + itfFilter + " -j REJECT || exit/n");  
                        }  
                StringBuilder res = new StringBuilder();  
             code = runScriptAsRoot(script.toString(), res);  
             if (showErrors && code != 0) {  
              String msg = res.toString();  
              Log.e("DroidWall", msg);  
               // Search for common error messages  
              if (msg.indexOf("Couldn't find match `owner'") != -1 || msg.indexOf("no chain/target match") != -1) {  
               alert(ctx, "Error applying iptables rules./nExit code: " + code + "/n/n" +"It seems your Linux kernel was not compiled with the netfilter /"owner/" module enabled, which is required for Droid Wall to work properly./n/n" +"You should check if there is an updated version of your Android ROM compiled with this kernel module.");  
         } else {  
           // Remove unnecessary help message from output  
         if (msg.indexOf("/nTry `iptables -h' or 'iptables --help' for more information.") != -1) {  
        msg = msg.replace("/nTry `iptables -h' or 'iptables --help' for more information.", "");  
       }  
       // Try `iptables -h' or 'iptables --help' for more information.  
          alert(ctx, "Error applying iptables rules. Exit code: " + code + "/n/n" + msg.trim());  
           }  
        } else {  
           return true;  
        }  
       } catch (Exception e) {  
      if (showErrors) alert(ctx, "error refreshing iptables: " + e);  
                }  
                return false;  
    } 
private static boolean applyIptablesRulesImpl(Context ctx, List<Integer> uids, boolean showErrors) {
                if (ctx == null) {
                        return false;
                }
                final SharedPreferences prefs = ctx.getSharedPreferences(PREFS_NAME, 0);
                final boolean whitelist = prefs.getString(PREF_MODE, MODE_WHITELIST).equals(MODE_WHITELIST);
                boolean wifi = false; // Wi-fi selected ?
                final String itfs = prefs.getString(PREF_ITFS, ITF_3G);
                String itfFilter;
                if (itfs.indexOf("|") != -1) {
                        itfFilter = ""; // Block all interfaces
                        wifi = true;
                } else if (itfs.indexOf(ITF_3G) != -1) {
                        itfFilter = "-o rmnet+";;
                        // Block all rmnet interfaces
                } else {
                        itfFilter = "-o tiwlan+";;
                        // Block all tiwlan interfaces
                        wifi = true;
                }
    final StringBuilder script = new StringBuilder();
     try {
             int code;
        script.append("iptables -F || exit/n");
         final String targetRule = (whitelist ? "ACCEPT" : "REJECT");
        if (whitelist && wifi) {
                                // When "white listing" Wi-fi, we need ensure that the dhcp and wifi users are allowed
                                int uid = android.os.Process.getUidForName("dhcp");
            if (uid != -1) script.append("iptables -A OUTPUT "
                                  + itfFilter + " -m owner --uid-owner " + uid + " -j ACCEPT || exit/n");
              uid = android.os.Process.getUidForName("wifi");
            if (uid != -1) script.append("iptables -A OUTPUT " + itfFilter + " -m owner --uid-owner " + uid + " -j ACCEPT || exit/n"); }
          for (Integer uid : uids) {
             script.append("iptables -A OUTPUT " + itfFilter
                                  + " -m owner --uid-owner " + uid + " -j " + targetRule + " || exit/n");
                        }
           if (whitelist) {
                script.append("iptables -A OUTPUT " + itfFilter + " -j REJECT || exit/n");
                        }
                StringBuilder res = new StringBuilder();
             code = runScriptAsRoot(script.toString(), res);
             if (showErrors && code != 0) {
              String msg = res.toString();
              Log.e("DroidWall", msg);
               // Search for common error messages
              if (msg.indexOf("Couldn't find match `owner'") != -1 || msg.indexOf("no chain/target match") != -1) {
               alert(ctx, "Error applying iptables rules./nExit code: " + code + "/n/n" +"It seems your Linux kernel was not compiled with the netfilter /"owner/" module enabled, which is required for Droid Wall to work properly./n/n" +"You should check if there is an updated version of your Android ROM compiled with this kernel module.");
         } else {
           // Remove unnecessary help message from output
         if (msg.indexOf("/nTry `iptables -h' or 'iptables --help' for more information.") != -1) {
        msg = msg.replace("/nTry `iptables -h' or 'iptables --help' for more information.", "");
       }
       // Try `iptables -h' or 'iptables --help' for more information.
          alert(ctx, "Error applying iptables rules. Exit code: " + code + "/n/n" + msg.trim());
           }
        } else {
           return true;
        }
       } catch (Exception e) {
      if (showErrors) alert(ctx, "error refreshing iptables: " + e);
                }
                return false;
    }

Android iptables 使用及源码分析 立即下载

相关推荐

360流量防火墙v2.3独立版(绿色免安装).rar

软件介绍: 360流量防火墙能够限制本机下载速度,查看正在使用网络的程序,显示程序的下载速度和上传速度,已下载的流量及上传的流量,程序的网络连接数。控制程序网络访问,查看此程序所建立的连接,查看隐藏的系统服务。网速保护能够保护你的网速,确保在浏览网页时不受下载速度的影响,流畅看网页而不会干扰到下载。防蹭网能够帮助你发现局域网中的可疑设备,解决被别人蹭网所带来的网速变慢问题。如果无线被别人蹭会将你的带宽在未经你允许的情况下分享,导致你打开网页非常的慢。从网络连接中能够查看程序网络连接所使用的本地IP和端口,目标IP及端口,还能查看目标IP归属地信息。

成功解决:Can not find owner from table.

使用shardingsphere+mybatis-plus时执行子查询是报错。 例如: select * from ( select id from test ) t GROUP BY t.id 这时就会报错 改为一下就可以正常执行了 select * from ( select id from test ) t GROUP BY id 出现以上的原因是shardingsphere的bug,去掉shardingsphere就可以了,如果一定要使用的话就按照下面的那种方式解决 参考:

杰森写代码 1万+

流量防火墙droidwall源码

android手机完美的流量防火墙软件,可以控制单个应用的wifi和gprs的联网设置。

Android免root流量防火墙,简单小程序

对于在Android开发出具有流量防火墙的功能,在Android4.0后,提供了VpnService的API供调用, 我在上一篇博客 使用Android系统自带的VpnService截取流量中提到了VpnService的使用原理,并附上了我开发中测试的简单demo,但是这个demo没有实现数据回传的功能,就是说开了VPN开关后,没法进行上网,没办法接收到回传的数据包。这里我再提供个例子,供大家使

D.K专栏 6217

超级好用的流量防火墙

超级好用的流量防火墙超级好用,源于个人使用习惯,这个工具小又好用

360流量防火墙提取版

360流量防火墙提取版,只提取出流量防火墙组件

2024年安卓最新Android防火墙+流量统计代码,2024年最新腾讯面试岗位

首先是一个知识清单:(对于现在的Android及移动互联网来说,我们需要掌握的技术)泛型原理丶反射原理丶Java虚拟机原理丶线程池原理丶注解原理丶注解原理丶序列化Activity知识体系(Activity的生命周期丶Activity的任务栈丶Activity的启动模式丶View源码丶Fragment内核相关丶service原理等)代码框架结构优化(数据结构丶排序算法丶设计模式)APP性能优化(用户体验优化丶适配丶代码调优)热修复丶热升级丶Hook技术丶IOC架构设计。

2301_82242326的博客 626

Window流量监控小工具源码和EXE

基于.Net的流量监控小工具,喜欢的朋友可以下载使用或研究。 基于.Net的流量监控小工具,喜欢的朋友可以下载使用或研究。 基于.Net的流量监控小工具,喜欢的朋友可以下载使用或研究。

android wifi 流量统计,Android防火墙+流量统计代码

publicclassmService1extendsService{privateHandler objHandler =newHandler();privateintintCounter=0;privateintmHour;privateintmMinute;privateintmYear;privateintmMonth;privateintmDay;privateString mdate;...

weixin_33204101的博客 267

【opencv3 学习记录】第二章 读取显示保存视频

一:捕获视频函数 1.函数:cv2.VideoCapture(参数) 2.参数说明: (1)开启摄像头:参数一般为0,你可以通过设置成 1 或 者其他的来选择别的摄像头。 (2)从文件夹中获取视频:参数为字符串形式的文件路径 3.示例: cap = cv2.VideoCapture(0) #cap:存放参数 二:读取视频函数 1.函数:cap.read() 2.函数说明: (1)cap.read 中cap与捕获视频函数存放函数一致,可以自己命名.括号一般不用填写 (2)ret,f

m0_64448543的博客 3276

智能座舱-语音交互系统

从什么是智能座舱、智能座舱的发展驱动因素、智能座舱的构成要素三个方面梳理我对智能座舱的基础认识之后,为了加深“智能座舱产品入门”课程中语音交互部分知识的理解,我从什么是语音交互、语音交互的底层技术、智能座舱的语音交互等方面,对智能座舱语音交互系统相关的知识进行了梳理与总结。

GUOSA0928的博客 1443
上一篇: Android Intent的几种用法全面总结
下一篇: Thread、Looper、Handler和Message
cding1818
博客等级 码龄17年 963粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值