package com.nii.soot.CFGCamera2Analyser; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; import soot.*; import soot.jimple.*; import soot.jimple.internal.*; import soot.toolkits.graph.*; import soot.options.Options; import soot.tagkit.LineNumberTag; import soot.tagkit.Tag; import soot.toolkits.graph.CompleteBlockGraph; import soot.toolkits.scalar.ArraySparseSet; import soot.util.Chain; import soot.util.HashChain; public class MyAnalysisCameraX extends BodyTransformer { protected void internalTransform(final Body body,String phase, @SuppressWarnings("rawtypes")Map options){ // for (SootClass c:Scene.v().getApplicationClasses()) { // System.out.println("[sootClass]"+c); // for(SootMethod method:c.getMethods()) // { // //System.out.println("[sootMethod]"+m); // // if (method.hasActiveBody()) { // Body methodBody = method.getActiveBody(); // Iterator unitIt = methodBody.getUnits().snapshotIterator(); // // while (unitIt.hasNext()) { // Stmt stmt = (Stmt) unitIt.next(); // // // 在语句中查找与camera2相关的内容 // if (stmt.toString().contains("camera2")) { // System.out.println("Found camera2-related code in method: " + method); // } // } // } // } // } // } //} // 获取所有类 Chain classes = Scene.v().getClasses(); Set methodsWithCamera2Resource = new HashSet<>(); // 遍历所有类 for (SootClass sootClass : classes) { // 遍历类中的方法 for (SootMethod sootMethod : sootClass.getMethods()) { // 分析每个方法是否包含 Camera2 相关资源 if (sootMethod.hasActiveBody()) { if (containsCamera2Resource(sootMethod)) { methodsWithCamera2Resource.add(sootMethod); } } } } if (!methodsWithCamera2Resource.isEmpty()) { System.out.println("Methods that contain CameraX resource calls:"); for (SootMethod method : methodsWithCamera2Resource) { System.out.println("Class: " + method.getDeclaringClass() + ", Method: " + method); } } else { System.out.println("No methods found that contain CameraX resource calls."); } } public static boolean containsCamera2Resource(SootMethod method) { DirectedGraph cfg = new ExceptionalUnitGraph(method.getActiveBody()); for (Unit unit : cfg) { Stmt stmt = (Stmt) unit; if (stmt.toString().contains("cameraX")) { return true; } } return false; } } //import soot.*; //import soot.jimple.Stmt; //import soot.jimple.internal.*; //import soot.toolkits.graph.*; //import soot.toolkits.scalar.ArraySparseSet; //import soot.util.Chain; //import soot.util.HashChain; // //import java.util.HashSet; //import java.util.Map; //import java.util.Set; // //public class MyAnalysis extends BodyTransformer{ // // protected void internalTransform(final Body body, String phase, @SuppressWarnings("rawtypes") Map options) { // // 创建一个容器,用于存储包含"camera2"资源的方法 // Set methodsWithCamera2Resource = new HashSet<>(); // // // 创建控制流图 // DirectedGraph cfg = new ExceptionalUnitGraph(body); // // // 遍历控制流图的每个节点 // for (Unit unit : cfg) { // Stmt stmt = (Stmt) unit; // // // 在语句中查找与"camera2"相关的内容 // if (stmt.toString().contains("camera")) { // // 如果找到,将包含该资源的方法添加到容器中 // methodsWithCamera2Resource.add(body.getMethod()); // break; // 中断循环 // } // // } // // if(methodsWithCamera2Resource.isEmpty()) // { // System.out.println("There is no method to involve camera2 resources."); // } // else // { // // 在这里,你可以根据需要处理或记录methodsWithCamera2Resource中的方法 // for (SootMethod method : methodsWithCamera2Resource) { // System.out.println("Method with camera2 resource: " + method); // } // } // } //}