Nix 表达式语言 介绍

本文介绍了Nix表达式语言的基础知识,包括其惰性、函数式和纯粹的特性。讲解了语言的范式,如惰性求值和函数式编程,并阐述了如何在Nix中定义和使用函数。此外,还讨论了语言的特点,如表达式、类型、解构、默认参数、操作符优先级以及加载机制。重点介绍了`with`、`let`、`inherit`和`rec`等重要构造函数的用法。
摘要由CSDN通过智能技术生成

        近期在解决Nix包管理框架上一些问题,顺便整理一下关于Nix函数表达式语言的一些基础,本文涵盖 Nix 表达式语言的语法、语义、类型、编译、工具和库。

Nix 手册中这样概述 Nix表达式语言:
        Nix 表达式语言是一种纯粹的、惰性的、函数式语言。纯粹意味着语言中的操作没有副作用(例如,没有变量赋值)。 惰性意味着函数的参数仅在需要时才进行评估。 函数式意味着“函数”也是“正常”值,可以以有趣的方式传递和操作。
       注意: 该语言不是功能齐全的通用语言。 它的主要工作是描述包、包的组成以及包内的可变性。

1. 语言的范式

    1) Lazy 惰性。用时触发定义和赋值。如下 a 没有被使用,所以可以认为a 不存在,abort lamda表达式从没有被调用过。

       let 

            a = abort “will never called”;

            b = “hi”;

             c = “world”;

       in b + c

    2)Functional 函数式

          函数式编程是一种构建计算机程序结构和元素的风格——将计算视为对数学函数的赋值,并避免使用变化的状态和可变的数据。 它是一种声明式编程范式,这意味着编程是用表达式或声明来实现,而不是语句。

    3)Pure 纯粹,函数调用干净无污染。

        纯函数是一种函数,其返回值仅由其输入值确定,而没有可观察到的副作用。 在 Nix 中,所有构建操作都试图尽可能纯粹以实现可重现的构建。 这意味着无论您在何处构建包,都应尽可能减少副作用对构建的影响。

2. 语言特点

    1)表达式

当 Nix 教程谈论 Nix 表达式时,它们通常是指具有多个输入的函数的定义,这些输入是推导的结果。然而,Nix 表达式可以是任何东西,从简单的字符串到函数再到一组表达式。

    2)类型

Type Description Example
Strings Strings either start with double quotes or double single quotes. They also support antiquotation (templating). Leading spaces are stripped with double single quotes. "Say ${pkgs.hello.name}"

Multiline String:

''first line
  second line
''
Integers A whole number without fractional component. 5
Floating-point numbers Decimal numbers. Precision is limited. 1.2
Path Relative paths will become absolute when evaluated, paths must contain a slash. <
说明: =================================================================== 1). dex 转 jar 用的 enjarify,比目前常用的 dex2jar(d2j) 要稳定可靠得多,尤其是在处理重度混淆过的apk时 2). 用于对apk进行代码修改,扫描目标apk中函数,并在指定函数的开头部分 添加 调用自定义静态函数的代码 3). 省略 jar 转 smali 再回转的步骤,转而使用 objectweb.asm(ow2) 直接对 jar 文件进行 smali 注入 4). dex2jar 的步骤使用的是 google 自家的 enjarify 工具,没使用老掉牙的、对部分混淆apk处理极不准确极不稳定的 dex2jar(d2j) 5). jar2dex 使用的是 android studio 自带的 dx.bat 工具,貌似 dex2jar(d2j) 在做jar回转的时候也是调用dx.jar 6). 手机无需 root 要求: =================================================================== 已安装 jdk1.7 或 jdk1.8 已安装 Android Studio 已安装 pypy3 或者 python,pypy3 下载地址:http://download.csdn.net/detail/jizhitp/9902691 步骤: =================================================================== 1). 使用 jeb、jadx、jd 等静态分析工具分析源apk,确定要注入代码的类及函数 2). 用记事本打开 main.bat,设置正确的路径,以及源apk文件名 3). 在当前文件夹空白处点一下,然后按 shift + 右击,选择 "在此处打开命令行窗口" 4). 编辑静态类源文件:SmaliInjector\android\StaticClass.java,这个类将会被包进目标apk中 5). 编辑注入器源文件:SmaliInjector\pc\Injector.java,这是注入器关键文件,作用是调用ow2.asm来对目标jar中特定类的特定函数进行代码注入 6). 运行 main.bat即可 错误处理: =================================================================== 1). 此工具默认使用pypy来运行py脚本,若想使用 python 请打开 google_enjarify\enjarify.bat 把 pypy 改成 python 2). 安装重包后的apk时,若出现 INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES 错误,请将手机中原有的应用卸载后再安装 3). android.jar 最好选用跟目标手机版本一致的,否则重包后的apk几乎100%闪退 4). 若在 jar 转加 dex 的过程中出现 java.lang.OutOfMemoryError: GC overhead limit exceeded 的错误,请调大 main.bat 中的 -Xmx 和 -Xss 其它: =================================================================== 1). pypy3 比 python 快蛮多,推荐使用 2). enjarify 有两种模式: 默认的模式,转换出来的代码阅读性比较好,但比较慢 --fast 快速模式 3). main.bat 内有两个便捷开关,赋值表示启用,参数留空表示开关不启用 Resign_Only 是否只做 重签名 的动作,可用于验证目标 apk 有没有做签名保护 SkipDex2jar 是否跳过 dex 转 jar 的步骤,转换很耗时,第二次调用 main.bat 时可以选择跳过,能省蛮多时间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值