背景

有时候我们想创建一个程序,放在系统中,供其他APP执行。我们知道,在生成system.img的时候,编译系统会将out/target/product/[product]/system/bin目录打包进去。所以,我们想办法让编译系统在编译的过程中,把我们的程序编译了,并把编译生成的二进制文件自动放到out/target/product/[product]/system/bin。

做法

假如我们要创建一个mytest的程序

1.在external目录下创建名为mytest的文件夹,这个文件夹用于存放我们的程序代码和makefile文件以及这个程序的依赖库。

2.创建我们的程序代码和makefile文件,这里主要看看makefile文件怎么写,例子如下:

LOCAL_PATH := $(call my-dir)

common_cflags := \
-std=c99 \
-Os \
-Wall \
-Wextra \
-Wno-char-subscripts \
-Wno-sign-compare \
-Wno-string-plus-int \
-Wno-uninitialized \
-Wno-unused-parameter \
-funsigned-char \
-ffunction-sections -fdata-sections \
-fno-asynchronous-unwind-tables \ # static executable for use in limited environments
include $(CLEAR_VARS)
LOCAL_SRC_FILES := mytest.c
LOCAL_CFLAGS := $(common_cflags)
LOCAL_CXX_STL := none
LOCAL_CLANG := true
# LOCAL_MODULE_PATH and LOCAL_UNSTRIPPED_PATH do not equal
LOCAL_UNSTRIPPED_PATH := $(PRODUCT_OUT)/symbols/utilities
LOCAL_MODULE := mytest_static
LOCAL_MODULE_CLASS := UTILITY_EXECUTABLES
LOCAL_MODULE_PATH := $(PRODUCT_OUT)/system/bin
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_STEM := mytest
LOCAL_PACK_MODULE_RELOCATIONS := false
LOCAL_STATIC_LIBRARIES := libc libcurl libz libcrypto_static
LOCAL_SHARED_LIBRARIES := libssl
LOCAL_FORCE_STATIC_EXECUTABLE := true
include $(BUILD_EXECUTABLE)

上面的代码中,值得关注的几个内容:

LOCAL_SRC_FILES:要编译的源文件
LOCAL_CFLAGS:编译时所要使用的编译选项
LOCAL_UNSTRIPPED_PATH:生成的二进制文件临时存放目录。$(PRODUCT_OUT)是产品生成目录,等于上文提到的out/target/product/[product]
LOCAL_MODULE:模块的名称。这里我们生成的是静态可执行文件,所以后面加上'_static'
LOCAL_MODULE_PATH:模块生成后的存放的目录。$(PRODUCT_OUT)是产品生成目录,等于上文提到的out/target/product/[product]
LOCAL_MODULE_TAGS:设置模块标签,这影响在什么版本下编译该模块。
LOCAL_STATIC_LIBRARIES:依赖的静态库
LOCAL_SHARED_LIBRARIES:依赖的动态库
LOCAL_FORCE_STATIC_EXECUTABLE:是否强制生成静态可执行文件
include $(BUILD_EXECUTABLE):生成可执行文件

注意:创建可执行文件,源代码要有main函数

3.让编译系统运行后编译我们的模块

(1)在/build/target/product目录下,创建一个makefile文件,这里就取为mytest.mk

(2)在里面输入:

PRODUCT_PACKAGES := mytest_static

PRODUCT_PACKAGES是编译系统定义的变量,在后面写上我们模块名,这样我们的模块就会被编译。

(3)让编译系统找到我们的mytest.mk,在build/target/product/core.mk文件末尾追加一行:

$(call inherit-product, $(SRC_TARGET_DIR)/product/mytest.mk)

测试模块

生成我们自己的模块后,有两种方式测试。

1.只编译模块,然后把它push到我们的设备。这种方式是最方便的。在源码目录下执行下面两个命令:

(1)编译模块

mmm ./external/mytest

(2)将模块push到手机

adb push $OUT/system/bin/mytest /system/bin

注:如果提示couldn't create file: Read-only file system,先执行adb remount

(3)执行我们的编译好的模块

adb shell mytest

2.编译整个system.img,模块会打包进镜像中

(1)编译system.img

make systemimage

(2)刷入system.img

fastboot flash system $OUT/system.img

(3)执行我们的编译好的模块

adb shell mytest

Android编译自己的程序到/system/bin的更多相关文章

  1. 解决:Android编译源码根目录下/system/vold后,通过push命令将编译生成的vold文件push至system/bin下无法正常开机

    这段时间由于工作需要,在对android根目录下/system/vold进行修改编译的时候,在通过adb命令将vold文件push至/system/bin目录下,adb reboot重启手机却发现一直 ...

  2. 为 Android 编译并集成 FFmpeg 的尝试与踩坑

    前言与环境说明 随着 FFmpeg.NDK 与 Android Studio 的不断迭代,本文可能也会像我参考过的过期文章一样失效(很遗憾),但希望本文中提到的问题排查以及步骤说明能够帮到你,如果发现 ...

  3. android中:/system/bin/sh: : No such file or directory错误

    将一个raspberry下编译好的可执行文件放在android的system/bin下,修改为777权限,运行,出现下面的错误: /system/bin/sh: XXX: No such file o ...

  4. Ubuntu系统下实现Android工程调用独立编译的C++程序和GMP、PBC库

    目的: 实现使用C++编写代码供Android工程调用.C++代码中可以使用STL库,也可以使用常用的由源码编译生成的库,如PBC.因为PBC是基于GMP库的,所以这里只记录了GMP和PBC库的编译安 ...

  5. Android中实现对/system/bin/surfaceflinger进程进行拦截和注入

    对于Android for arm上的so注入(inject)和挂钩(hook),网上已有牛人给出了代码inject.由于实现中的ptrace函数是依赖于平台的,所以不经改动只能用于arm平台.本文将 ...

  6. Android 查看system/bin目录下支持哪些命令?

    C:\Users\yonghuming>adb shell "ls system/bin" >log acpiadbdamapp_processapp_process3 ...

  7. Android编译环境(1) - 编译Native C的模块

    Android编译环境本身比较复杂,且不像普通的编译环境:只有顶层目录下才有Makefile文件,而其他的每个component都使用统一标准的Android.mk. Android.mk文件本身是比 ...

  8. Android学习——移植tr069程序到Android平台

    原创作品,转载请注明出处,严禁非法转载.如有错误,请留言! email:40879506@qq.com 声明:本系列涉及的开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅 ...

  9. 如何让A20,android开机自动启动C程序【转】

    本文转载自:http://blog.csdn.net/u011258134/article/details/50749174 如何让A20,android开机自动启动C程序 2014-12-26 11 ...

随机推荐

  1. imgAreaSelect 中文文档

    http://www.cnblogs.com/boychenney/archive/2011/10/08/2201996.html 一.技术文档 1.介绍 ImgAreaSelect是一jQuery插 ...

  2. ASP.NET Core Api网关Ocelot的中文文档

    架构图 入门 不支持 配置 路由 请求聚合 GraphQL 服务发现 微服务ServiceFabric 认证 授权 Websockets 管理 流量控制 缓存 QoS服务质量 转换Headers 转换 ...

  3. 网站内容禁止复制和粘贴、另存为的js代码

    1.使右键和复制失效 方法1: 在网页中加入以下代码: 复制代码代码如下: <script language="Javascript"> document.oncont ...

  4. 关于react router 4 的小实践

    详细代码栗子:https://github.com/wayaha/react-dom-CY clone然后 npm install npm start 分割线 1.这个项目使用create-react ...

  5. Flask自带的常用组件介绍

    Flaskrender_templatesessionurl_forredirectflashmake_responsejsonifyblueprintrequestabortgsend_from_d ...

  6. 基于Python的数据分析:数据库索引效率探究

    索引在数据库中是一个很特殊的存在,它的目的就是为了提高数据查询得效率.同样,它也有弊端,更新一个带索引的表的时间比更新一个没有带索引的时间更长.有得有失.我希望做一些研究测试,搞清楚索引对于我们使用数 ...

  7. Spring MVC 的 XML 配置方式

    索引: 开源Spring解决方案--lm.solution 参看代码 GitHub: solution/pom.xml solution/webapi/pom.xml solution/mapper/ ...

  8. @Scheduled cron表达式

    一.Cron详解: Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: 1.Seconds Minutes Hours Dayof ...

  9. PHP 的 uniqid 函数产生的 id 真的是唯一的么?

    PHP 的 uniqid 函数产生的 id 真的是唯一的么? 最近使用到了 uniqid,就产生了疑问?uniqid 生成的 id 由什么组成?真的是唯一的么?什么情况下会产生冲突? 从文档中看到 u ...

  10. 修改WordPress后台默认登陆地址提高网站安全性

    作者:荒原之梦 原文链接:http://zhaokaifeng.com/?p=536 安装完WordPress后,默认的登陆地址就是: http://XXX.XXX/wordpress/wp-admi ...