android5.1+获取当前运行的app2

之前的5.1以上获取当前运行进程的针对有些山寨机还是无法获取,我又找到了另一种解决方法,不过这种解决方法只是针对masscom型号的手机,其他手机没有测试

                File[] files = new File("/proc").listFiles();
int lowestOomScore = Integer.MAX_VALUE;
String foregroundProcess = null;
for (File file : files) {
if (!file.isDirectory()) {
continue;
}
int pid;
try {
pid = Integer.parseInt(file.getName());
} catch (NumberFormatException e) {
continue;
}
try {
String cgroup = read(String.format("/proc/%d/cgroup", pid));
String[] lines = cgroup.split("\n");
String cpuSubsystem;
String cpuaccctSubsystem;


if (lines.length == 2) {// 有的手机里cgroup包含2行或者3行,我们取cpu和cpuacct两行数据
cpuSubsystem = lines[0];
cpuaccctSubsystem = lines[1];
} else if (lines.length == 3) {
cpuSubsystem = lines[0];
cpuaccctSubsystem = lines[2];
} else {
continue;
}
if (!cpuaccctSubsystem.endsWith(Integer.toString(pid))) {
// not an application process
continue;
}
if (cpuSubsystem.endsWith("bg_non_interactive")) {
// background policy
continue;
}
String cmdline = read(String.format("/proc/%d/cmdline", pid));
if (cmdline.contains("com.android.systemui")) {
continue;
}
int uid = Integer.parseInt(cpuaccctSubsystem.split(":")[2].split("/")[1].replace("uid_", ""));
if (uid >= 1000 && uid <= 1038) {
// system process
continue;
}
foregroundProcess = cmdline.trim();

这里面就直接获取了包名,没有对

int  appId = uid - AID_APP;
       int  userId =  0 ;
       // loop until we get the correct user id.
       // 100000 is the offset for each user.
       while  (appId > AID_USER) {
         appId -= AID_USER;
         userId++;
       }
       if  (appId <  0 ) {
         continue ;
       }
       // u{user_id}_a{app_id} is used on API 17+ for multiple user account support.
       // String uidName = String.format("u%d_a%d", userId, appId);
       File oomScoreAdj =  new  File(String.format( "/proc/%d/oom_score_adj" , pid));
       if  (oomScoreAdj.canRead()) {
         int  oomAdj = Integer.parseInt(read(oomScoreAdj.getAbsolutePath()));
         if  (oomAdj !=  0 ) {
           continue ;
         }
       }
       int  oomscore = Integer.parseInt(read(String.format( "/proc/%d/oom_score" , pid)));
       if  (oomscore < lowestOomScore) {
         lowestOomScore = oomscore;
         foregroundProcess = cmdline;
       }
     catch  (IOException e) {
       e.printStackTrace();
     }
   }
这一块进行处理,具体为什么不同原因不是很清楚,可以手机的系统处理机制不一样

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值