【Android源码 栏目提醒】:网学会员为广大网友收集整理了,Android移植drcom - 开发文档,希望对大家有所帮助!
移植步骤 在此选用
android源码编译drcom的源码虽然用ndk和源码都可以但是源码灵活性比较大因此选用源码编译还有编译kmod驱动模块时也必须用到android的linux内核源码所以还是用源码编译比较方便。
版本drcom 1.4.x android-2.2 linux-kernel-2.6.29 ubuntu 10.10 Drcom的源代码主要包括drcomcdrcomdkmodutils四个文件夹其中drcomcdrcomd编译成可执行程序的形式kmod编译成内核驱动的形式utils编译成动态链接库的形式注虽然android有自己的utils库但可能因为版本不同或其他原因在此还是选择把drcom自带的utils重新编译且分析各文件夹下的Makefile得知drcomcdrcomd都要用到utils编译好的链接库所以先编译utils库。
1.编译libutils_drcom 在utils文件夹下建立Android.mk文件内容 LOCAL_PATH : call my-dir include CLEAR_VARS LOCAL_CFLAGS : -D__STDC_CONSTANT_MACROS LOCAL_C_INCLUDES LOCAL_PATH/../include LOCAL_SRC_FILES : utils.c Optional tag would mean it doesnt get installed by default LOCAL_MODULE_TAGS : optional If we dont add this we may get error : library libutils_drcom.so not in prelink map LOCAL_PRELINK_MODULE : false LOCAL_MODULE : libutils_drcom include BUILD_SHARED_LIBRARY 在此选择编译好的动态库的名称是libutils_drcom以与android自带的libutils.so进行区分。
之后在terminal中进入
android源码根目录输入 make libutils_drcom ONE_SHOT_MAKEFILEexternal/drcom/utils/Android.mk 即可编译完成。
2.编译drcomc Android.mk: LOCAL_PATH : call my-dir include CLEAR_VARS LOCAL_CFLAGS : -D__STDC_CONSTANT_MACROS LOCAL_C_INCLUDES LOCAL_PATH/../include LOCAL_SRC_FILES : drcomc.c Optional tag would mean it doesnt get installed by default LOCAL_MODULE_TAGS : optional LOCAL_SHARED_LIBRARIES : libutils_drcom LOCAL_MODULE : drcomc include BUILD_EXECUTABLE 之后输入make drcomc ONE_SHOT_MAKEFILEexternal/drcom/ drcomc /Android.mk 即可生成drcomc的可执行程序。
3.编译drcomd Android.mk LOCAL_PATH : call my-dir include CLEAR_VARS LOCAL_CFLAGS : -D__STDC_CONSTANT_MACROS LDFLAGS -lpthread LOCAL_C_INCLUDES LOCAL_PATH/../include LOCAL_SRC_FILES : drcomd.c dialog.c keepalive.c kmodule.c login.c logout.c md5.c misc.c passwd.c readconf.c signal.c watchport.c log.c Optional tag would mean it doesnt get installed by default LOCAL_MODULE_TAGS : optional LOCAL_SHARED_LIBRARIES : libutils_drcom libm libc LOCAL_MODULE : drcomd include BUILD_EXECUTABLE 之后输入make drcomd ONE_SHOT_MAKEFILEexternal/drcom/ drcomd /Android.mk 即可开始编译但会出错出错原因是因为android的c库里没有pthread_cancel、pthread_setcancelstate、pthread_setcanceltype 这三个函数所以要自己对源码进行改进还好用到这几个函数的地方不多只在keepalive.clogout.csignal.cwatchspot.c这四个文件中有自己用一个全局条件变量的办法来解决这个问题是最简单的一种办法。
还有要把drcomd/drcomd.c中的 load_kernel_module函数中的strcpys /sbin/modprobe drcom改成/system/bin/insmod drcom.ko 因为android没有modprobe命令。
4.编译kmod文件夹的drcom.ko驱动模块 首先编译android linux kernel 执行make make mudules make modules_install 把原来的Makefile的内容改成 obj-m drcom.o KDIR:/home/dada/project/android-2.2/common LOCAL_PATH :/home/dada/project/android-2.2/external/drcom PWD : shell pwd CROSS_COMPILE/home/dada/program/android-ndk-r4/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi- CCCROSS_COMPILEgcc LDCROSS_COMPILEld EXTRA_CFLAGS : -ILOCAL_PATH/include -IKDIR ARCHarm default: MAKE -C KDIR EXTRA_CFLAGS ARCHARCH CROSS_COMPILECROSS_COMPILE MPWD modules clean: RM -rf ..cmd .mod.c .o .ko .tmp .-order .symvers 之后进入kmod目录运行make即可。
注此时可能会出现很多错误而且很多是和netfilter有关的查了下是因为android默认linux内核配置没有包含netfilter所以要把内核关于netfilter的选项选上再把内核重新编译一下重新运行make就可以了。
运行 把drcomc drcomd drcom.ko libutils_drcom.so都推入模拟器里就可以了。
运行drcomd再运行drcomc login就可以运行了。
上面的步骤只是保证在模拟器里好用下面说一下怎么移植到真机 测试的机器是HTC的原版系统是Win mobile6.5之后刷到Android 2.3刷的是Nexus one的修改版系统Linux内核是2.6.32.15-gaa47876-dirty ARM版本是ARMv7这里因为涉及到驱动的关系所以Linux内核的版本和编译好的ARM的版本一定要一致否则会提示Exec format error就是检测版本一致性时发生错误。
1.从source.android.com上下载Linux kernel 2.6.32 步骤 git clone git://android.git.kernel.org/kernel/common.git git checkout origin/archive/android-2.6.32 之后打开目录下的Makefile查看下版本是2.6.32的就OK了。
2.编译该内核 此处最好是从真机上把config文件pull下来方法是连上真机 运行adb pull /proc/config.gz 再解压就好了把解压好的config文件改名为.config后放入内核根目录运行make menuconfig 先选择最下面的Load Kernel config 再选择 System Type - ARM system Type -选择第二项此处只进行了第二项的测试其他未测试。
注意若此处未进行ARM system Type的配置则系统默认选择的ARM system Type 是Qualcomm MSM 此配置是不支持ARMv7的。
此选项配置好之后运行make编译即可此时可能会出现很多询问选项大多是询问是否支持某些新特性因为我们只需要一个最小化的课编译通过的内核所以最好是选No。
之后运行make即可。
3.用新内核编译驱动模块。
只需要把drcom/kmod/Makefile里的KDIR: 改成新内核所在的文件夹之后运行make就可以了编译好了之后可以用modinfo命令查看驱动程序详细信息 例如modinfo drcom.ko filename: drcom.ko description: Drcom-Kernel 0.0.1 author: Wheelz license: GPL depends: vermagic: 2.6.32.15-gaa47876-dirty preempt mod_unload ARMv7 此处特别注意的是最后的vermagic必须要和真机上的相同。
更改自己的linux kernel的vermagic把根目录的Makefile中把EXTRAVERSION 置空在scripts/setlocalversion里只留一个printf函数把其他的都注释掉在保留的的printf的输出上写上自己想要的vermagic即可。
4.测试 adb push drcom.ko data/drcom.ko adb shell cd data insmod drcom.ko 再运行lsmod若能显示drcom模块则说明成功。
5.整合到apk中。
5.1 drcomd的执行 因为运行insmod需要root权限而android应用程序按照常规方式不可能获得root权限所以这里最简单的解决方法就是采用root过的机器再用su命令结合自己的命令运行。
下面是RootCommand源码该代码摘自 http://www.cnblogs.com/ycmoon/archive/2011/05/11/2042999.html / 应用程序运行命令获取 Root权限设备必须已破解获得ROOT权限 param command 命令 return 应用程序是/否获取Root权限 / public static boolean RootCommandString command Process process null DataOutputStream os null try process Runtime.getRuntime.execsu os new DataOutputStreamprocess.getOutputStream os.writeBytescommand n os.writeBytesexitn os.flush process.waitFor catch Exception e Log.d DEBUG ROOT REE e.getMessage return false finally try if os null os.close process.destroy catch Exception e Log.d DEBUG Root SUC return true 在Activity的 OnCreate函数中运行下列命令 String commond chmod 777 /data/data/net.drcom/files/drcomd RootCommandcommond commond rmmod drcom RootCommandcommond commond cp /data/data/net.drcom/files/libutils_drcom.so /system/lib/libutils_drcom.so RootCommandcommond commond cp /data/data/net.drcom/files/drcom.conf /etc/drcom.conf RootCommandcommond commond insmod /data/data/net.drcom/files/drcom.ko RootCommandcommond commond /data/data/net.drcom/files/drcomd RootCommandcommond 在这里把drcomd的权限修改为可运行的把drcomd运行时需要的 libutils_drcom.so文件复制到/system/lib下面把配置文件拷贝到相应的地方这里我们选择在java层把drcom.ko加载进来因为在drcomd里面运行会有堆栈错误可能这里本来就是调用java的system.runtime运行的若在drcomd里面再调用system函数会导致错误。
5.2 调用drcomc 在drcom的根目录建立了一个drcom_jni.c里面封装了drcomc的Login和Logout函数通过jni方式在java层调用详见Android NDK 开发。
上一篇:
android 启动程序分析
下一篇:
猪疥癣病的防治