如何在android设备上insmod自己单独编译的.ko,解决签名问题
近期由于项目需要,需要自己写一个.ko文件,来操作寄存器,但是该.ko是不能跟整体工程在一起的,需要单独编译,这过成功遇到了大量的问题,现在终于解决,跟大家分享一下,很珍贵!!!
遇到的问题:
1. 在android设备中输入insmode hello.ko ,会提示"nsmod: error inserting 'hello.ko': -1 Required key not available" .这是签名问题,没有使用该设备android工程的密钥进行签名。
2. 使用正确的android工程密钥签名后,依然insmode失败,提示"exec format error", 这是由于版本不对。
网上提到的方法:此方法可以了解linux的内容,但是实际不好使!!!
1.将自己的hello文件夹(内部有Kconfig, Makefile, hello.c)复制到随便一个文件夹下,如xxx_self_project/linux_xxx/drivers/hello/
2. 修改xxx_self_project/linux_xxx/drivers/目录下的 Kconfig和Makefile,可参考其他模块。
3.Makefile中为obj-m(生成ko), 不是obj-y
4.在xxx_self_project/linux_xxx/下,make menuconfig, 将hello选项选为[M], 保存,这时会生成xxx_self_project/linux_xxx/.config文件。
5.此时一点要,make savedefconfig(注意 savedefconfig是一个命令,不是一个文件名),对当前.config进行保存合并到默认的配置文件中。 效果可以查看xxx_self_project/linux_xxx/arch/xx/configs/xxxxdefconfig,或xxx_self_project/linux_xxx/include/config/auto.conf.
6.make modules 生成hello.ko
7.对hello.ko签名, 在xxx_self_project/linux_xxx/路径下, perl ./scripts/sign-file sha512 signing_key.priv signing_key.x509 drivers/hello/hello.ko
查看是否签名成功:hexdump -C hello.ko | tail
8. adb push .....,然后insmod hello.ko ,此时安装的话,会出现错误"exec format error", 这是版本不对。
以上内容虽然没有解决问题,但是如果都经历一遍的话对linux的了解还是很好的。
下面是真正的正确的方法:
1.将整个android工程make一遍,
2.将hello文件夹(内部有Makefile, hello.c)拷贝到任一位置,我本人放在xxxx_self_project/ 的路径下,跟android和linux目录平行。
3.Makefile内容如下图,主要是KERNELDIR路径,该路径是android整个工程编译后临时文件的路径!!!!
4. 在hello路径下make
5. 签名,
5.1签名需要的密钥位于xxx_self_project/android/out/target/product/xxxxxx/kernel/下面,将signing_key.priv, signing_key.x509复制到hello下面。
5.2 使用xxx_self_project/linux_xxxx/scripts/sign-file 进行签名
perl ../linuxxxx_/scripts/sign-file sha512 signing_key.priv signing_key.x509 hello.ko
5.3使用hexdump -C hello.ko | tail查看
经过以上方法,就可以将自己单独编译的.ko文件insmod到android设备里边了!!!!!!!!
更多相关文章
- Eclipse如何打包生成Apk安装包实例(图)
- AndroidStudio中AVD虚拟机设备空间不足调试过程出现的黑屏问题及
- 自定义实现向量图标动画VectorDrawable
- android studio生成签名导打包的方法
- Android混淆代码proguard,内存溢出
- android中引用项目工程中的sqlite文件
- android App全局SD卡路径统一管理
- Android动态加载补充 加载SD卡中的SO库
- Android(安卓)APK DEX分包总结