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
相关产品推荐
相关产品推荐

