Run native executable in Android App

Run native executable in Android App

Demo 

Here‘s demo application called "Run Native Exe" to:

  • run local UNIX commands
  • run native executable downloaded from the Web

Package: NativeExe-0.2.apk
Source code: on Github (ADT project)

To install the package,

  • Go to Settings→Application and check "Unknown sources"
  • Open the package link above using Android Browser

or type "adb install NativeExe-*.apk" in your PC if you have Android SDK.

How can I run UNIX commands in Android App? 

You can use Runtime.exec() in standard Java. Here‘s sample code to run /system/bin/ls /sdcard in Android App:

try {
    // Executes the command.
    Process process = Runtime.getRuntime().exec("/system/bin/ls /sdcard");

    // Reads stdout.
    // NOTE: You can write to stdin of the command using
    //       process.getOutputStream().
    BufferedReader reader = new BufferedReader(
            new InputStreamReader(process.getInputStream()));
    int read;
    char[] buffer = new char[4096];
    StringBuffer output = new StringBuffer();
    while ((read = reader.read(buffer)) > 0) {
        output.append(buffer, 0, read);
    }
    reader.close();

    // Waits for the command to finish.
    process.waitFor();

    return output.toString();
} catch (IOException e) {
    throw new RuntimeException(e);
} catch (InterruptedException e) {
    throw new RuntimeException(e);
}

This code is based on this article. Thanks yussi to let me know this by comment.

OK, but how can I put my own native executable in Android App? 

First, you need to cross-compile your native executable for ARM.

Here‘s a way (dynamic link version). Or you can use Scratchbox (Japanese).

If you get a file with a format like this, it‘s probably OK:

% file yourapp
yourapp: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.14, statically linked, not stripped

You have three ways to put the binary to the phone:

  • From Android Java app, using assets folder (by fnerg in comment below)

    • Include the binary in the assets folder.
    • Use getAssets().open("YourBinaryHere") to get an InputStream.
    • Write it to /data/data/app-package-name (e.g. /data/data/net.gimite.nativeexe), where your application has access to write files and make it executable.
    • Run "/system/bin/chmod 744 /data/data/app-package-name/yourapp" using the code above.
    • Run your executable using the code above.
  • From Android Java app, downloading via HTTP (which I use in my demo application above)

    • Dowload the executable using HTTP and put it to /data/data/app-package-name (e.g. /data/data/net.gimite.nativeexe), where your application has access to write files and make it executable. You can use standard Java FileOutputStream to write files there.
    • Run "/system/bin/chmod 744 /data/data/app-package-name/yourapp" using the code above.
    • Run your executable using the code above.
  • By adb (needs SDK and root)

    • If you want to put the executable to YOUR phone connected with adb command in Android SDK and you have root, you can put the executable by:
% adb shell
$ su
# mkdir /data/tmp
# chmod 777 /data/tmp
# exit
$ exit
% adb push yourapp /data/tmp
% adb shell
$ chmod 744 /data/tmp/yourapp
$ /data/tmp/yourapp

Note that you cannot make files executable in /sdcard.

时间: 2024-10-03 00:21:33

Run native executable in Android App的相关文章

原生Android App项目调用Untiy导出的Android项目

背景:采用Google VR SDK for Unity 开发3D场景功能,然后导出Android项目,合并到一个Android App里面,供其它Activity调用. 用Google VR for Unity SDK开发的Untiy项目导出来的Android项目,主Activity为com.google.unity.GoogleUnityActivity.如果需要在此基础上扩展一些功能,则需要实现自己的Activity(比如命名为GoogleCardboardActivity),并继承com

Android APP native 崩溃分析之令人困惑的 backtrace

完美无缺的代码逻辑,一定能产生完美无缺的程序吗?答案是否定的.从软件的层面来看,也许只有二进制才永远不会欺骗你. 现象 近期,业务方反馈了一个奇怪的崩溃问题,认为信息不足,无法解决. Signal: 11 (SIGSEGV), Code: 1 (SEGV_MAPERR) r0 993ff520 r1 dc3170c4 r2 00000000 r3 dabe3e08 r4 993ff520 r5 00000005 r6 00000290 r7 000007ac r8 e83253a0 r9 000

AndroidRuntime: android.app.RemoteServiceException: Bad notification posted from package

在使用RemoteView创建自定义通知视图的时候一启动通知栏应用就停止运行. 查看错误提示,开始时为 StatusBar: Caused by: android.content.res.Resources$NotFoundException: File res/drawable/fm_statusbar_clear.xml from drawable resource ID #0x7f02003f 找不到资源,调整了使用方法后又出现了 04-11 18:54:27.542 21850 2185

Android APP崩溃上传日志到服务器并且重启!

我们写程序的时候都希望能写出一个没有任何Bug的程序,期望在任何情况下都不会发生程序崩溃.但没有一个程序员能保证自己写的程序绝对不会出现异常崩溃.特别是当你用户数达到一定数量级后,你也更容易发现应用不同情况下的崩溃. 对于还没发布的应用程序,我们可以通过测试.分析Log的方法来收集崩溃信息.但对已经发布的程序,我们不可能让用户去查看崩溃信息然后再反馈给开发者.所以,设计一个对于小白用户都可以轻松实现反馈的应用就显得很重要了.我这里结合我自己写的一个Demo,来分析从崩溃开始到崩溃信息反馈到我们服

转-android.app.Fragment$InstantiationException 解决办法

在实际的开发中,我遇到过两次android.app.Fragment$InstantiationException报错. 其中一次报错,根据报错提示 “make sure class name exists, is public, and has an empty constructor that is public” ,若Fragement定义有带参构造函数,则一定要定义public的默认的构造函数.即可解决此问题.如果硬要携带参数进去,可以通过Intent结合Bunble的方式携带进去. 第

Android App优化之ANR详解

引言 背景:Android App优化, 要怎么做? Android App优化之性能分析工具 Android App优化之提升你的App启动速度之理论基础 Android App优化之提升你的App启动速度之实例挑战 Android App优化之Layout怎么摆 Android App优化之ANR详解 Android App优化之消除卡顿 Android App优化之内存优化 Android App优化之持久电量 Android App优化之如何高效网络请求 App优化系列已近中期, 前面分

Android App 安全的HTTPS 通信

漏洞描述 对于数字证书相关概念.Android 里 https 通信代码就不再复述了,直接讲问题.缺少相应的安全校验很容易导致中间人攻击,而漏洞的形式主要有以下3种: 自定义X509TrustManager.在使用HttpsURLConnection发起 HTTPS 请求的时候,提供了一个自定义的X509TrustManager,未实现安全校验逻辑,下面片段就是常见的容易犯错的代码片段.如果不提供自定义的X509TrustManager,代码运行起来可能会报异常(原因下文解释),初学者就很容易在

Unity上线google商店 用IL2Cpp打包64位版本和Android APP Bundle优化 及产生的bug

ios刚上线,这边着手改成android版本,我开始使用的是unity2017.4.1版本 上传谷歌商店是出现这两个警告: 要支持64位,但是在2017版本上没有找到64位的打包选项,猜测应该是版本的问题,上网查询果然是 以下是我查询的: https://www.cnblogs.com/cnxkey/articles/9760391.html http://tieba.baidu.com/p/5496282855 http://dy.163.com/v2/article/detail/E9LQN

VS2015下的Android开发系列02——用VS开发第一个Android APP

配置Android模拟器 这算是第一篇漏下说的,配置好VS的各参数,新建Android项目后,会发现菜单下的工具栏会多出Android相关的工具栏,红色圈出的就是AVD. 打开AVD后可以从模版处选一个设备,然后自己再做细节参数调整. 然后选择要模拟的版本,因为APP有蓝牙BLE的支持需求,所以选择了至少API Level18,注意如果安装了HAXM,CPU/ABI项一定要选"Intel Atom (x86)",如果没有,说明组件未安装,赶紧去下载后再来:另外一个注意点是内存至少3G,