原文链接:http://www.lupaworld.com/home.php?mod=space&uid=345712&do=blog&id=248921

好久没有写bolg了,前些天遇到一个很纠结的问题,就是如何将一个可执行文件打包到APK中并且运行该文件,开始想用NDK的方式将其以动态库的方式打包至APK中,可是由于条件限制没有源码只有一个可执行文件。无奈之下只好采取曲线救国的道路。好了闲话少说我们进入主题吧

首先我们要知道APK的打包原理有哪些文件时可以打包到APK中去的先将APK文件用winRAR工具打开可以看到起文件目录结果如下

|-assest

|-lib

|-META-INF

|-res

|-AndroidManifest.xml

|-classes.dex

|-resources.arsc

从上述可以看出 Android的apk文件中除了一些标准的资源文件,我们还可以在/assets和/res/raw中置入一些非标准的文件,但是却只能通过输入流访问,因为这些文件在安装时并没有被复制到data目录下。这个限制在Java层可能并无大碍,但是如果想通过本地C/C++代码访问的话,似乎就只能指定路径了。
       想要将一个可执行文件打包入APK我们可以将可执行文件当做资源文件打包至APK,接下来就是读取/assets和/res/raw下的文件,然后通过FileOutputStream openFileOutput (String name, int mode)将其写入到对应数据目录下的files目录,之后文件路径可以通过getFilesDir()+"filename"取得,编码上稍微有点繁琐。核心代码如下

//先检查files目录下是否存在该文件不能存在拷贝该文件到files目录下
if (!fileIsExists(executablePath))
{

String executableFilePath = getFilesDir().getParent()+ "/files/" + commandtext.getText().toString();

try

{

InputStream input = getResources().getAssets()  .open( commandtext.getText().toString());读取Assets目录下的可执行文件到输入流

int filesize = input.available(); //获取文件小

writeFileData(executableFilePath, input, filesize);//将文件写到executableFilePath下

} catch (IOException e)

{

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public void writeFileData(String fileName, InputStream message, int filesize)
 {

try

{

FileOutputStream fout = new FileOutputStream(fileName);

byte[] bytes = new byte[filesize];

message.read(bytes);

fout.write(bytes);

fout.close();

}

catch (Exception e)

{

e.printStackTrace();

}

}

public boolean fileIsExists(String fileName)
{

File f = new File(fileName);

if (!f.exists())

{

return false;

}

return true;

}

执行可执行文件核心代码如下

File elfFile = new File(executableFilePath);

boolean b = elfFile.setExecutable(true, true); //设置可执行权限

Runtime runtime = Runtime.getRuntime();

Process proc = null;

try

{

proc = runtime.exec(executableFilePath);

} catch (IOException e1)

{

// TODO Auto-generated catch block

e1.printStackTrace();

}

在API Level 9及以上版本中,可通过File类的boolean setExecutable(boolean executable, boolean ownerOnly)方法将文件重新加上可执行权限。API Level 9以下版本则需通过shell命令,并且需要root权限,具体做法如下:
Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());

os.writeBytes("chmod 555 " + executablePath + " \n");
os.flush();

os.writeBytes(executablePath + " &" + " \n");
os.flush();

os.writeBytes("exit \n");
os.flush();

如何将可执行文件打包至APK并运行(转)的更多相关文章

  1. 【转】如何把ndk编译出来的可执行文件伪装成so打包到apk中

    原文网址:http://jeyechao.iteye.com/blog/2164286 ndk编译出来的共享库,eclipse会自动打包到apk中,而编译出来的可执行文件则不会. 要想可执行文件自动被 ...

  2. 定位真机运行能用但是打包成apk就不能用的解决方法

    打包apk的SHA1,与key的SHA1(这是多人开发的通病不同电脑共同开发一个app的常见错误之一)不一致.解决方法: 今天虽然离职了,但是今天遇到的是,当我在用高德地图开发的时候,在Android ...

  3. Android 手机卫士--打包生成apk维护到服务器

    项目打包生成apk过程: 1.生成签名文件,并且指定所在位置 2.使用生成的签名文件,给工程打包生成一个apk 本文地址:http://www.cnblogs.com/wuyudong/p/59033 ...

  4. cocos2dx 3.x(在Mac平台下利用Eclipse打包安卓apk安装包详细教程)

    最近在学习cocos2dx在MAC上如何打包apk,今天先把安装JDK和ANT的过程记来. 首先,打开终端,输入"java -version" 点击回车后,出现如下提示: 我们的M ...

  5. 初级——程序如何打包成apk文件

    将Eclipse Android项目打包成APK文件是本文要介绍的内容,主要是来了解并学习Eclipse Android打包的内容,具体关于Eclipse Android内容的详解来看本文.Eclip ...

  6. UNITY 打包安卓APK

    1,安装JDK.这个直接下就行了. 2,安装android sdk相关.这个比较蛋疼,官网是被墙的.有些网站的包还是需要访问墙外下载的.关键是找对那个能用的包(对我来说就是不FQ). http://p ...

  7. 使用ionic与cordova(phonegap)进行轻量级app开发前的环境配置与打包安卓apk过程记录

     前言 有人说:"如果你恨一个人,就让ta去接触cordova(phonegap)",这是因为这里面的水很深,坑很多,真让人不是一般地发狂.或许有幸运的人儿基本顺顺利利就配置完环境 ...

  8. Android 自动编译、打包生成apk文件 3 - 使用SDK Ant方式

      相关文章列表: < Android 自动编译.打包生成apk文件 1 - 命令行方式> < Android 自动编译.打包生成apk文件 2 - 使用原生Ant方式> &l ...

  9. Python:使用Kivy将python程序打包为apk文件

    1.概述 Kivy是一套Python下的跨平台开源应用开发框架,官网,我们可以用 它来将Python程序打包为安卓的apk安装文件.以下是在windows环境中使用. 安装和配置的过程中会下载很多东西 ...

随机推荐

  1. VisualStudio自定义代码段_方法一

    在VisualStudio里,使用代码段会提高我们的编写速度.其实,就是给一段代码加个快捷方式,使用时,快捷方式按键+2次Tab键. 举个例子: 比如输入Console.WriteLine (); 传 ...

  2. CGRectOffset与CGRectInset的计算公式

    (1)CGRectInset CGRect CGRectInset ( CGRect rect, CGFloat dx, CGFloat dy ); 该结构体的应用是以原rect为中心,再参考dx,d ...

  3. 使用Yeoman搭建 AngularJS 应用 (1) —— 介绍

    原文地址:http://yeoman.io/learning/ Yeoman 是一个通用的可以创建多种应用的基架系统.它帮助用户快速搭建新的项目,并且可以简化已存在项目的维护过程. Yeoman是不限 ...

  4. 从clone()谈protected

    看到Object的clone()是protected的,然后看到<java2认证考试指南>上描述:一个对象只能请求其他对象的克隆,后者的类与被克隆对象属于同一类,或是被克隆对象的子类. e ...

  5. ping(1)

    /* ping program for learning IP protocol author: jeff date: 2014/10/25 */ #include <stdio.h> # ...

  6. Ubuntu下Qt编译报错“cannot find -lGL”的解决方案

    转自cannot find -lGL Solved the problem by installing the "libglu1-mesa-dev" package. sudo a ...

  7. ORMBase对象/关系型数据库映射在MVC中的应用(二)

    3.DataBase基类,查询方法返回值是List<T>,并且是分页的,ThePart.dll版本2.0中封装了一个PageInfo类,作为分页的类型.这种方法很机械,也很狗血..建议大家 ...

  8. POJ 3422 Kaka's Matrix Travels(最小费用最大流)

    http://poj.org/problem?id=3422 题意 : 给你一个N*N的方格,每个格子有一个数字,让你从左上角开始走,只能往下往右走,走过的数字变为0,走K次,问最大能是多大,累加的. ...

  9. datetime 和 smalldatetime

    用于表示某天的日期和时间的数据类型. datetime 和 smalldatetime 表示某天的日期和时间. 数据类型 范围 精确度 datetime 1753 年 1 月 1 日到 9999 年 ...

  10. 判断微信内置浏览器的UserAgent

    要区分用户是通过"微信内置浏览器"还是"原生浏览器"打开的WebApp, 可以通过navigator.userAgent来进行判断. 以下是对各种平台上微信内置 ...