本篇博文参考了非虫大大的Android软件安全与逆向分析,这真的是一本好书,里面涵盖的内容比较全也比较基础。下面开始我们的学习。
Android为了提高效率、安全性等,提供了NDK(原生开发套件),现在我们来看看如何编译原生程序。
原生程序的编译有三种方法:
1、使用gcc手动编译
2、使用ndk-build手动编译
3、使用eclipse自动编译
我们分别使用这三种方式来分别编译看看。
准备工作:
1、下载对应版本的ndk,我所使用的平台是windows,解压到指定位置即可。ndk下载链接:
https://developer.android.com/ndk/downloads/index.html
我的路径为F:\android\android-ndk-r11b,那么工具链的完整路径为F:\android\android-ndk-r11b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin,大家可以看到该目录有很多前缀为arm-linux-androideabi-的exe文件,代表它们使用与arm架构的android程序开发。
现在,就开始动手啦。
首先,新建hello.c程序,代码如下:
#include<stdio.h>
int main(int argc, int** argv[]){
printf("Hello ARM!\n");
return 0;
}
1、gcc手动编译
http://jingyan.baidu.com/article/17bd8e52f514d985ab2bb800.html
,make.exe工具路径为F:\android\android-ndk-r11b\prebuilt\windows-x86_64\bin,将该路径添加到环境变量中,注意与adb路径用分号隔开。
NDK_ROOT=F:\android\android-ndk-r11b
TOOLCHAINS_ROOT=$(NDK_ROOT)\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64
TOOLCHAINS_PREFIX=$(TOOLCHAINS_ROOT)\bin\arm-linux-androideabi
TOOLCHAINS_INCLUDE=$(TOOLCHAINS_ROOT)\lib\gcc\arm-linux-androideabi\4.9\include-fixed
PLATFORM_ROOT=$(NDK_ROOT)\platforms\android-23\arch-arm
PLATFORM_INCLUDE=$(PLATFORM_ROOT)\usr\include
PLATFORM_LIB=$(PLATFORM_ROOT)\usr\lib
MODULE_NAME=hello
BUILD_TYPE=c
PATH_ANDROID=/data/local/tmp/
RM=del
FLAGS=-I$(TOOLCHAINS_INCLUDE) \
-I$(PLATFORM_INCLUDE) \
-L$(PLATFORM_LIB) \
-nostdlib \
-lgcc \
-Bdynamic \
-lc \
-pie -fPIE
OBJS=$(MODULE_NAME).o \
$(PLATFORM_LIB)\crtbegin_dynamic.o \
$(PLATFORM_LIB)\crtend_android.o
all:
$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) -c $(MODULE_NAME).$(BUILD_TYPE) -o $(MODULE_NAME).o
$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) -S $(MODULE_NAME).$(BUILD_TYPE) -o $(MODULE_NAME).S
$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) $(OBJS) -o $(MODULE_NAME)
clean:
$(RM) *.o
install:
adb push $(MODULE_NAME) $(PATH_ANDROID)
adb shell chmod 755 $(PATH_ANDROID)$(MODULE_NAME)
adb shell $(PATH_ANDROID)$(MODULE_NAME)
makefile文件说明:
make
make install
此时,可以看到控制台输出”Hello ARM!”。
同时,我们打开刚才的目录,可以看到里面生成了一些.o和.S文件。假设我们想删除其中后缀为.o的文件,执行make clean命令,再打开目录就会看到.o文件已经被删除。。如果想修改删除规则,修改makefile中clean标签内容即可。
2、ndk-build编译
android list
执行这条命令后,会列出很多个SDK版本,在这里选择其中一个版本作为我们建立项目的版本号,记住该版本的id
android create project -n hello2 -p hello2 -t 9 -k com.droider.hello2 -a MyActivity
命令行说明:-n 指定工程名称,-t 指定平台版本号,这里可以输入刚才选择版本号的id,-k 指定工程包名,-a 指定默认Actitivy名称。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm
LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.c
include $(BUILD_EXECUTABLE)
Android.mk文件说明:
Android.mk文件编写完后,将它与hello.c一同放在jni目录下,然后进入命令行切换到hello2根目录,执行ndk-build命令,执行效果如下:
adb push hello /data/local/tmp
adb shell chmod 755 /data/local/tmp/hello
adb shell /data/local/tmp/hello
说明:1、adb需要配置环境变量。
2、传入的hello必须修改权限为可执行文件
3、Eclipse创建工程并自动编译
在hello3工程上右键选择Properties,点击Builders选项,再点击右侧New按钮,然后双击Program打开Edit Configuration,在对话框的Name一栏中设置Builder名称,Location输入ndk-build命令路径,Working Drrectory右侧的Browser Workspace选择hello3工程,点击Apply按钮。点击Refresh标签,勾选“Refresh resource upon completion”复选框。点击Build Options标签,勾选“During auto builds”和”Specify working set of relevant resources”复选框。点击“Specify Resources”按钮,勾选hello3工程的jni目录,点击finish按钮,点击Ok关闭Edit Configuration对话框。点击OK关闭Properties对话框。