0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Android 14→15内置可执行程序:从“野路子”到“正规军”的进化

jf_44130326 来源:Linux1024 2026-02-01 16:54 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、先看两组代码的直观区别

Android 14方案(PRODUCT_COPY_FILES):

wKgZO2kancKAZFfeAACFH6I8aDg852.png

核心逻辑:直接把文件从源码目录拷贝到系统分区(如/system/bin),像复制粘贴一样简单。

Android 15方案(PRODUCT_PACKAGES):

wKgZO2kancKAR4viAACczlg43Vg869.png

核心逻辑:先通过Android.bp定义模块(如canconfig是一个预构建可执行程序模块),再把模块名加入打包清单,由构建系统统一管理。

终端路径:

wKgZO2kancKAc9fuAAAEWSDYanI290.png

二、为什么Android 15淘汰直接拷贝?

这不是功能删减,而是Android系统安全、构建效率、硬件适配三重进化的必然结果:

1.安全升级:从放养强监管

Android 14时代:直接拷贝文件,系统不会校验这个程序能不能在设备上运行(比如x86程序拷贝到ARM设备),也不管程序有没有危险权限(比如偷偷读写系统文件)。

Android 15时代:强制要求模块化声明,构建系统会自动检查:

架构兼容性:程序必须是设备支持的架构(如RK3576arm64);

权限合法性:通过SELinux上下文配置,限制程序能做什么(比如只允许访问串口);

依赖完整性:如果程序依赖其他库(如libcan.so),必须明确声明,否则编译报错。

2.构建系统进化:Soong取代传统Make

Android 15全面拥抱Soong构建系统(用Android.bp替代Android.mk),它像智能管家

传统方式(PRODUCT_COPY_FILES:只管拷贝,不管程序是否能运行”“依赖是否完整,出问题全靠开发者人肉排查;

模块方式(PRODUCT_PACKAGES:通过cc_prebuilt_binary等规则,自动处理权限、依赖、架构问题,甚至能帮你发现程序是x86格式,设备是arm64”这种低级错误。

3.硬件适配:瑞芯微等芯片厂商的倒逼

以瑞芯微RK3576为例:

芯片的ISP、串口、摄像头等硬件,对驱动和工具的依赖管理要求更严格;

直接拷贝的程序,可能因没加载依赖库”“权限不够导致硬件功能失效;

模块化声明能强制关联驱动、库、权限,确保硬件功能正常工作。

三、开发者必须注意的3个核心点

1.必须学会写Android.bp(模块声明)

cansend为例,需在同级目录创建Android.bp

cc_prebuilt_binary {

name: "cansend", //模块名,必须和PRODUCT_PACKAGES里的名字一致

srcs: ["cansend"], //可执行程序的路径

installable: true, //允许安装到系统分区

file_contexts: "cansend_contexts", // SELinux上下文配置

target: {

android_arm64: { enabled: true }, //只编译到arm64架构

},

}

关键作用:告诉构建系统这个程序是谁、能装在哪、该有什么权限

wKgZO2kancKABIyxAACuwutTSLY224.png

2.SELinux配置是必答题

Android 15SELinux严格拦截未授权操作,必须为程序配置上下文:

# cansend_contexts文件内容

/system/bin/cansend usystem_file:s0

若程序要访问串口(如/dev/ttyS8),还需额外添加SELinux策略(如allow cansend serial_device:chr_file write;),否则会报avc: denied错误。

3.动态库依赖要明明白白

如果cansend依赖libcan.so,不能只拷贝cansend,还需:

1.cc_prebuilt_library_shared声明libcan.so模块;

2.cansendAndroid.bp中通过shared_libs关联:

shared_libs: ["libcan"],

否则设备运行时会报错cannot load library: libcan.so

四、实战建议:从Android 14迁移到15的步骤

1.整理可执行程序:把canconfigcandump等程序放到统一目录(如device/rockchip/cantools)。

2.为每个程序写Android.bp:按模块规则声明,配置架构、权限、SELinux

3.修改PRODUCT_PACKAGES:替换原来的文件路径,改为模块名。

4.编译验证

系统配置:

export LC_ALL=C

source javaenv.sh

source build/envsetup.sh

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

export PATH=$JAVA_HOME/bin:$PATH

export PATH=$ANDROID_BUILD_TOP/prebuilts/clang/host/linux-x86/clang-r487747c/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar

lunch rk3576_u-ap4a-userdebug

一键编译:

./build.sh -AUCKu -d rk3576-evb1-v10 -J 16

若报错,优先检查架构是否匹配SELinux策略是否缺失依赖是否声明

结语:系统越严,开发越规范

Android 15对可执行程序的模块化要求,本质是系统安全和开发效率的双向奔赴

对用户:避免非法程序破坏系统;

对开发者:减少运行时崩溃Debug成本。

跟上这个变化,你会发现:曾经的野路子虽然快,但正规军的方式更稳、更可持续。

(觉得有用?欢迎转发给需要适配Android 15的同行~)



声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    4035

    浏览量

    134448
  • 程序
    +关注

    关注

    117

    文章

    3847

    浏览量

    85450
  • 代码
    +关注

    关注

    30

    文章

    4975

    浏览量

    74349
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    用于分析可执行程序和内存转储的命令行工具介绍

    Axf Tool 是桃芯科技一个用于分析可执行程序和内存转储的命令行工具。该工具已集成 ingWizard 的项目快捷菜单里。
    的头像 发表于 11-03 17:00 2400次阅读
    用于分析<b class='flag-5'>可执行程序</b>和内存转储的命令行工具介绍

    office 版本不同,到处可执行程序出错

    本帖最后由 opticalchang 于 2025-12-29 12:41 编辑 编写程序所用的office 是2016版, 可执行程序在安装了office 2007版本的电脑上运行时,就会出错。在office 版本没法更新的情况下,怎么解决?
    发表于 12-29 10:32

    labview生成的可执行程序的反编译

    坛子里有没有哪位大神知道关于labview生成的可执行程序的反编译问题,如何反编译exe的应用程序
    发表于 07-17 14:19

    各位大大,vxworks能否直接调用可执行程序

    的脚本或方法,可以直接调用可执行程序。ps:我看网上的一些资料说python可以运行在vxworsk下,同时在linux下python可以直接调用可执行程序,只是不知道这套方法在vxworks下是否
    发表于 04-29 12:13

    what!!! 10分钟做出Labview可执行程序!!!

    可执行程序!https://mp.weixin.qq.com/s?__biz=MzI3MDIzMDQwNQ==&mid=100000411&idx=2&sn
    发表于 04-16 22:04

    在RV1126上怎样去运行rknn_yolo_demo可执行程序

    怎样生成rknn_yolo_demo可执行程序呢?在RV1126上怎样去运行rknn_yolo_demo可执行程序呢?
    发表于 02-21 07:42

    怎样移植qt可执行程序rk3399开发板上运行呢

    aarch64-linux-gnu-gcc是什么?怎样移植qt可执行程序rk3399开发板上运行呢?
    发表于 03-07 07:37

    LabVIEW中VISA可执行程序不能在非开发机上运行

    LabVIEW中VISA可执行程序不能在非开发机上运行在自己的LabVIEW开发机上写了一个可以工作的VISA VI,然后把它创建为可执行程序(.exe)用来发布。当我在目标机上运行该可执行程序连接
    发表于 05-19 21:12

    16KEY-B的可执行程序

    16KEY-B的可执行程序 /*******************************************************************/ /* */ /* 单片机开发
    发表于 11-22 18:02 14次下载

    Setup软件安装可执行程序工具免费下载

    本文档的主要内容详细介绍的是Setup软件安装可执行程序工具免费下载。 etup.exe是电脑的可执行进程文件,在正常情况下setup.exe表示为系统的安装文件setup.exe,遇到系统文件
    发表于 11-13 08:00 11次下载

    国产数据库游击队正规军

    长期被国外同行远远抛在身后,近年来通过产学结合快速崛起,人大金仓成为了国产数据库这一历程的见证者和推动者。 游击队正规军的转变 众所
    的头像 发表于 11-24 10:28 1410次阅读

    任正非:华为还不是“正规军

    华为心声社区发表了一封“任总与2020年金牌员工代表座谈会上的讲话”;任正非:华为还不是“正规军”;任正非说,“你们最主要是将外部经验带入华为,对“游击队”进行整改,让我们逐步转为“正规军”。” 图
    的头像 发表于 06-27 14:10 3056次阅读
    任正非:华为还不是“<b class='flag-5'>正规军</b>”

    在标准C语言中编译出来的可执行程序

    在标准C语言中,编译出来的可执行程序分为代码区(text)、数据区(data)和未初始化数据区(bss)3个部分。如下代码
    的头像 发表于 06-16 09:01 2839次阅读
    在标准C语言中编译出来的<b class='flag-5'>可执行程序</b>

    如何嵌入第三方可执行程序

    你可能碰到过这种需求:需要在自己开发的应用程序中嵌入某个第三方的可执行程序,那么该如何实现呢?其实是很简单的,借助Windows API,简单几步即可完成。
    的头像 发表于 11-01 09:54 7261次阅读

    labview生成可执行程序后vi都在同一路径下吗

    在LabVIEW中,当您生成可执行程序(exe文件)后,VI(虚拟仪器)并不直接以文件的形式存在于可执行文件的同一物理路径下。实际上,LabVIEW的可执行文件构建过程涉及将多个VI和相关的资源
    的头像 发表于 09-04 17:06 2209次阅读