Android7.1update.zip升级在system/bin下新增可执行文件没有可执行权限问题

Android7.1update.zip升级在system/bin下新增可执行文件没有可执行权限问题

 

外出的设备,只能通过update.zip方式升级,比如要在设备/system/bin目录下增加login,在需要时执行login,升级后发现login文件没有可执行权限

msm8937_64:/ # ls -l system/bin/login

-rw-r--r-- 1 root root 1256440 2008-08-0120:00 system/bin/login

第1个root是指UID(文件的owner),第2个root是指GID(Group ID)

 

但我们需要有可执行文件,怎么解决呢,下面给出解决过程的尝试及解决方法

1.    device\qcom\common\rootdir\etc\init.qcom.rc增加chmod来修改---无效

on boot

       …

chmod 0755/system/bin/login

 

2.    updater-script调用set_perm()设置权限---无效

更新失败,/cache/recovery/last_log提示

提示line 15 col 48: unknown function"set_perm",原因未知

这是因为bootable\recovery\updater\updater.cpp的没有实现set_perm(),下面给出android4.4版本下相关代码:

// Maybe, at some future point, we candelete these functions? They have been
   // replaced by perm_set and perm_set_recursive.
   RegisterFunction("set_perm", SetPermFn);
RegisterFunction("set_perm_recursive",SetPermFn);

我们代码是android7.1的,取而代之的是set_metadata_recursive和set_metadata命令,主要是修改文件或目录权限和属组等信息

比如:set_metadata("/system/bin/login","uid", 0, "gid", 0, "mode", 0755,"capabilities", 0x0, "selabel", "u:object_r:system_file:s0");-----------此方法可以解决此问题(推荐)

第1个0表示ROOT,上帝用户: ROOT, 他的UID= 0; 上帝用户永远属于任何UID

Uid和gid的值system\core\include\private\android_filesystem_config.h定义,比如:

/* This is the master Users and Groupsconfig for the platform.
 * DONOT EVER RENUMBER
 */
 
#define AID_ROOT             0 /* traditional unix root user */
 
#define AID_SYSTEM        1000 /* system server */
 
#define AID_RADIO         1001 /* telephony subsystem, RIL */
#define AID_BLUETOOTH     1002 /* bluetooth subsystem */
#define AID_GRAPHICS      1003 /* graphics devices */
#define AID_INPUT         1004 /* input devices */
#define AID_AUDIO         1005 /* audio devices */
…



set_metadata(filenamekey1value1[, key2 value2,...])

Sets the keys ofthe given filename to values. For example: set_metadata("/system/bin/netcfg","uid", 0, "gid", 3003, "mode", 02750,"selabel", "u:object_r:system_file:s0","capabilities", 0x0).

set_metadata_recursive(dirnamekey1value1[, key2value2,...])

Recursively setsthe keys of the given dirname and all its children to values.For example:set_metadata_recursive("/system","uid", 0, "gid", 0, "fmode", 0644,"dmode", 0755, "selabel","u:object_r:system_file:s0", "capabilities", 0x0).

 

3.    另一种解决方法(但不推荐)

package_extract_dir()对应的PackageExtractDirFn()调用mzExtractRecursive(),此函数bootable\recovery\minzip\Zip.c在中实现



把UNZIP_FILEMODE的值由0644改为0755即可,但是如果之前用0644方式的升级包升级过,在此基础上再升级,login权限还是0644其他,为了解决此问题,还需要在updater-script文件增加了delete("/system/bin/login");配合才能解决,但这种解决方法不是很合理,不推荐。

 

参考链接:

Android 5.x OTA Update官方文档(四、OTA更新包解读)

http://blog.csdn.net/huangyabin001/article/details/44873753

 

Flashing CM 11, I get`set_metadata_recursive: some changes failed`:

https://android.stackexchange.com/questions/62982/flashing-cm-11-i-get-set-metadata-recursive-some-changes-failed

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

loongembedded

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值