将二进制文件附加到Android应用

时间:2014-09-14 07:51:59

标签: android binary add precompiled

我正在试图将手臂预编译的二进制文件附加到我的私有Android应用程序中。

如果你不介意的话,我会告诉你我的应用程序。它只需要修改iptables规则,因为我的gprs与我的机器人通信。它是Android的遥控器,如果我拒绝所有流量而不是我的机器人,我会得到更好的结果。

所以我用我的cyanogenmod版本11 iptables编译了iptables,但是使用-save -restore支持,因为我想在完成机器人的控制后恢复规则..

问题是我一直在谷歌搜索很多时间,我刚刚发现droidwall似乎只在'res'顶部目录中创建一个'原始'目录,一旦安装,我可以看到在adb shell上的文件夹'app_bin'在/ data / data的路径中。 但是当我安装我的应用程序时,用那些创建的dirs我甚至看不到某个奇怪路径中的二进制文件......真的,这是一个非常罕见的情况吗?我在网络上找不到任何文档...

非常感谢,

希望你觉得它有用。

阿贝尔。

编辑(可能的解决方案)

我已经从android_firewall项目下载了代码,它似乎是从apk资源复制到bin目录:

./ src / com / jtschohl / androidfirewall / Api.java:final String app_iptables = dir +“/ iptables_armv5”; ./src/com/jtschohl/androidfirewall/Api.java://检查iptables_armv5 ./src/com/jtschohl/androidfirewall/Api.java:file file = new File(ctx.getDir(“bin”,0),“iptables_armv5”); ./src/com/jtschohl/androidfirewall/Api.java:copyRawFile(ctx,R.raw.iptables_armv5,file,“755”);

我要去试试。保持新闻......

1 个答案:

答案 0 :(得分:0)

是的,这是溶剂。文件夹名称“app _%{TYPE}”是调用函数getDir返回的文件名(%{TYPE},MODE_PRIVATE);

因此,以下代码执行所需的功能:

   private static void copyRawFile(Context ctx, int resid, File file, String mode) throws IOException, InterruptedException {
           final String abspath = file.getAbsolutePath();
           // Write the iptables binary
           final FileOutputStream out = new FileOutputStream(file);
           final InputStream is = ctx.getResources().openRawResource(resid);
           byte buf[] = new byte[1024];
           int len;
           while ((len = is.read(buf)) > 0) {
               out.write(buf, 0, len);
           }
           out.close();
           is.close();
           // Change the permissions
           Runtime.getRuntime().exec("chmod " + mode + " " + abspath).waitFor();
       }

       private boolean assertBinaries(Context ctx, boolean showErrors) {
           try {
               File file = new File(ctx.getDir("bin", MODE_PRIVATE), "xtables_multi");
               if (!file.exists()) {
                   copyRawFile(ctx, R.raw.xtables_multi, file, "755");
               }
               file = new File(ctx.getDir("bin", MODE_PRIVATE), "iptables_new.sh");
               if (!file.exists()) {
                   copyRawFile(ctx, R.raw.iptables_new, file, "755");
               }
           } catch(Exception e) {
               if (showErrors) {
                   alert(ctx, R.string.error_assertbinaries + " " + e);
               }
               return false;
           }
        return true;
       }

       public static void alert(Context ctx, CharSequence msg) {
           if (ctx != null) {
               Toast.makeText(ctx, msg, Toast.LENGTH_SHORT).show();
           }
       }

希望有所帮助,

欢呼声;阿贝尔。