如何绕过Android 6.0中adb shell setprop的属性长度限制?
解决Android 6.0系统属性名称长度限制的变通方案
嘿,这个问题我之前碰到过类似的——Android系统属性的32字符限制是底层硬编码的(定义在system/core/init/property_service.c里的PROPERTY_NAME_MAX),没法直接绕过,但我们可以用几个变通方案来满足你支持任意长度应用名称的实验需求:
哈希映射长名称到短属性名
把你的长应用名称通过轻量哈希算法(比如CRC32、MD5取前8位)生成一个短字符串,用这个短串作为系统属性的名称。
举个例子:- 计算
com.example.shalidalkhaffabi.headerparser的CRC32得到0x12345678,取十六进制字符串12345678 - 设置属性:
setprop com.example.h.12345678 LD_PRELOAD=/data/local/tmp/libpreload.so - 你的预加载库或读取逻辑需要先对目标应用名称做相同的哈希计算,再读取对应的属性值。
这个方案的好处是不需要额外文件存储,只要保证哈希冲突概率足够低(实验场景下完全够用)。
- 计算
短别名+映射文件存储
用一个短的系统属性作为索引,再通过文件存储长名称和属性值的映射关系:- 设置短属性:
setprop com.example.app.id 001 - 在
/data/local/tmp下创建映射文件app_prop_map.txt,写入:001=com.example.shalidalkhaffabi.headerparser|LD_PRELOAD=/data/local/tmp/libpreload.so - 你的代码先读取短属性的索引值,再去映射文件里查找对应的长名称和配置内容。
这个方案适合需要管理多个长名称的场景,映射关系清晰易懂。
- 设置短属性:
直接用文件存储替代系统属性
如果你的实验场景不需要依赖系统属性的全局广播或系统级可见性,完全可以绕过系统属性,直接用文件存储配置:- 创建对应应用名称的配置文件,比如
/data/local/tmp/app_configs/com.example.shalidalkhaffabi.headerparser,写入内容LD_PRELOAD=/data/local/tmp/libpreload.so - 你的预加载库或逻辑直接读取这个文件的内容即可。
这个方案完全不受系统属性的长度限制,配置也更灵活。
- 创建对应应用名称的配置文件,比如
需要注意的是,如果你非要修改系统属性的长度限制,那只能重新编译Android系统源码,修改PROPERTY_NAME_MAX的值,但这显然不适合普通实验场景,上面的变通方案已经足够解决问题了。
内容的提问来源于stack exchange,提问作者kaloon




