You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nix环境下Android SDK符号链接转换权限问题求助

解决Nix构建Android SDK时符号链接转换的权限问题

问题背景

使用Python脚本将Android SDK中的符号链接转换为硬拷贝,在GitLab CI的nixpkgs/nix镜像中执行时,出现Permission denied错误:无法修改androidenv.composeAndroidPackages生成的derivation文件。无论是直接复制到$out还是临时目录,都没有写入权限,导致脚本无法删除符号链接并替换为目录。

解决方案

问题根源在于从Nix Store复制的文件默认保留了只读权限,即使复制到临时目录或$out,当前构建用户也没有修改权限。需要在复制后为目标目录添加写入权限,再执行转换脚本。

修改nix/android-sdk.nix的installPhase

将复制后的目录权限改为当前用户可写,再运行Python脚本:

with (import <nixpkgs> {});
let
  android-composition = import ./android-composition.nix;
in
stdenv.mkDerivation {
  name = "androidsdk";

  buildInputs = [
    python3Full
  ];

  src = "${android-composition.androidsdk}";

  dontUnpack = true;

  installPhase = ''
    # 复制源文件到out目录
    cp -r $src $out
    # 赋予当前用户对out目录的写入权限
    chmod -R u+w $out
    # 执行符号链接转换脚本
    python ${./androidsdk-fixup.py} "$out/libexec/android-sdk"
  '';
}

如果使用临时目录,同样需要添加权限修改步骤:

installPhase = ''
  mkdir -p $PWD/tmp
  cp -r $src/* $PWD/tmp/
  # 为临时目录添加写入权限
  chmod -R u+w $PWD/tmp
  python ${./androidsdk-fixup.py} "$PWD/tmp/libexec/android-sdk"
  cp -r $PWD/tmp $out
'';

原理说明

Nix Store中的所有文件都是只读的(权限通常为r-xr-xr-x),使用cp -r复制时会保留这些权限。通过chmod -R u+w为当前构建用户添加目录及所有文件的写入权限,就能让Python脚本正常执行os.unlink和shutil.copytree操作。


内容的提问来源于stack exchange,提问作者dweipert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 17:02:23