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

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

Android 14方案(PRODUCT_COPY_FILES):

wKgZO2kancKAZFfeAACFH6I8aDg852.png

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

Android 15方案(PRODUCT_PACKAGES):

核心逻辑:先通过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架构

},

}

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

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的同行~)


  • 随机文章
  • 热门文章