Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用some在APK中创建和添加Java类?_Java_Android_Android Instrumentation_Soot - Fatal编程技术网

如何使用some在APK中创建和添加Java类?

如何使用some在APK中创建和添加Java类?,java,android,android-instrumentation,soot,Java,Android,Android Instrumentation,Soot,我想使用APK来计算其回调方法的执行次数(与此类似) 为此,我想从头创建一个静态类(与此类似),它保持计数。然后将该类添加到APK,最后插入回调方法的开头,以调用该静态类的方法(类似于此) 我可以用Java应用程序做类似的事情,但不能用APK。下面是生成新SootClass并将其添加到场景中的代码部分: SootClass staticCls = generateClass("StaticCounter"); Scene.v().addClass(staticCls); Scene.v().ad

我想使用APK来计算其回调方法的执行次数(与此类似)

为此,我想从头创建一个静态类(与此类似),它保持计数。然后将该类添加到APK,最后插入回调方法的开头,以调用该静态类的方法(类似于此)

我可以用Java应用程序做类似的事情,但不能用APK。下面是生成新SootClass并将其添加到
场景中的代码部分

SootClass staticCls = generateClass("StaticCounter");
Scene.v().addClass(staticCls);
Scene.v().addBasicClass("StaticCounter", SootClass.SIGNATURES);
Scene.v().loadNecessaryClasses();
generateClass
是从中改编而来的。但是当我检查修改后的APK时,没有出现
StaticCounter
class的迹象。此外,我安装并运行了修改后的APK,并出现以下错误:

08-21 14:15:45.936 19917 19917 E AndroidRuntime:
 Caused by: java.lang.ClassNotFoundException:
  Didn't find class "StaticCounter" on path:
   DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/APKNAME-RdhHiJzxKyyUHh_KCi6RUA==/base.apk"],nativeLibraryDirectories=[/data/app/APKNAME-RdhHiJzxKyyUHh_KCi6RUA==/lib/x86, /system/lib]]
这只是表明生成的类不在APK内


这个问题有什么解决方案吗?

您可能需要提供它所要求的依赖关系:

android {
    useLibrary "org.apache.http.legacy"
}
它不会生成的原因可能是,
StaticCounter
在编译时是未知的,因为它可能应该而不是从应用程序包中引用,而应用程序包并不知道它。看看这个,显然是从
作者那里。。。驱动程序类可能是成功的关键:

//prefer Android APK files// -src-prec apk
Options.v().set_src_prec(Options.src_prec_apk);

//output as APK, too//-f J
Options.v().set_output_format(Options.output_format_dex);

// resolve the PrintStream and System soot-classes
Scene.v().addBasicClass("java.io.PrintStream", SootClass.SIGNATURES);
Scene.v().addBasicClass("java.lang.System", SootClass.SIGNATURES);

下面是一个完整的示例:

除非您将其标记为应用程序类,否则烟尘不会发出该类。你能试试吗?

我想我已经找到了为什么应用程序不知道新生成的类,这要归功于的提示。生成的类必须在APK的包中。烟尘通过查看类的签名来处理类的包。因此,
StaticCounter
类必须具有如下签名

com.example.app.StaticCounter
这表示
StaticCounter
在包
com.example.app

可以使用FlowDroid中的
ProcessManifest
类查找包名:

new ProcessManifest(apkPath).getPackageName();

我简化了工作代码并将其放在。它从头开始创建一个新类,并添加一个静态整型字段和一个方法,该字段表示调用静态方法的次数,该方法打印该值。然后使用转换包,应用程序中的每个方法都将调用此静态方法。

谢谢。但我已经遵循了博客文章中的步骤。当没有额外的类时,它可以正常工作:运行应用程序后,每当我执行一次回调时,它都会打印日志。但是,我有兴趣向包中添加一个新类(
StaticCounter
)。我认为应该有办法改变APK本身的配置,使新引入的类对所有方法都可见。@noidsirius您可以通过将其添加到
androidTest
源集中,将其添加到测试应用程序中,或者使用
TestSuite
将其添加到其中<代码>烟尘
似乎相当专门用于桌面Java,而桌面Java是另一种动物,因此可能存在某些限制。不过,谢谢,我做到了。看来问题出在班级的包袱上。