返回列表 发新帖

在mt管理器的终端中运行exiftool

[复制链接]

43

主题

453

回帖

2654

积分

大学生

Rank: 5Rank: 5

金币
54
好评
51
信誉
102
发表于 2023-9-5 12:27:57 来自手机  | 显示全部楼层 | 阅读模式  来自 广西
一、引言
通过搜索引擎了解到在处理 exif 时,通常使用的命令行程序是 exiftool,然后从 exiftool 的官网上可以看到,它是支持在安卓上使用的,如下图:


exif in Android



ExifTool for Android



EXIF Pro


这两个程序不但更新频率快,而且还提供了很多免费的实用功能,感觉都是很不错的软件。不过,由于按耐不住想要折腾的心思,所以在经过一些尝试后,发现它是可以在 mt 管理器的终端中使用的,如下图:
exiftool in mt manager









二、相关知识
1. perl
exiftool 官网上关于 exiftool 的描述如下:
  1. Requires Perl 5.004 or later. No other libraries or software required, but some optional Perl modules may be added to enable certain ExifTool features (for details, see the DEPENDENCIES section of the README file included in the full distribution).
复制代码

从中可知,exiftool 的运行只需要具有版本在 5.004 或之后的 perl 即可,所以需要了解一下什么是 perl

2. NDK
由于在 perl 的官网上没有找到(或者说没提供)在安卓上的可执行文件的下载地址,所以需要自行编译,而编译需要用到 NDK

3. configure
编译 perl 的方法是从网站 Cross-compiling perl 上看到的,在这个网站上,关于编译的页面中有说到可以怎么传一些参数给 configure 脚本来生成编译需要的 config.sh 文件(下图中的最后一段)
option


三、过程
由于我没有电脑,所以编译是通过 GitHub Action 完成的,而 GitHub Action 的运行只需要一个 yaml 格式的 workflow 文件,所以要做的工作只有一个,那就是编写出一份能用于编译 perl 的 yaml 格式的文件。

由于我不是 it 行业的人员,也没写过什么代码,所以,所有的工作基本上都交给了搜索引擎(实际上是互联网上那些具有分享精神的人)。在经过一定时间的搜索之后,找到一个网站 Cross-compiling perl,在这个网站上提供了如何编写脚本来交叉编译 perl 的笔记
cross-compile perl for android


而且,从 termux 的构建脚本上可以看到,termux 好像也是用的这个网站的资源(如下图中倒数第二行)
perl script in termux


在对应的 GitHub 仓库 perl-cross 上,也提供了更为具体的做法
perl-cross


所以,在参考以上内容之后,得到了一份仅供参考的用于编写 workflows 文件的代码
  1. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#name
  2. name: Test

  3. # https://docs.github.com/en/actions/learn-github-actions/variables#defining-environment-variables-for-a-single-workflow
  4. env:
  5.   TARGET: aarch64-linux-android
  6.   MINSDKVERSION: 24
  7.   API: 24
  8.   ABI: arm64-v8a
  9. #  MAKETO: /data/local/tmp/perl_cross
  10.   MAKETO: /data/user/0/bin.mt.plus/files/term/usr/perl_cross
  11.   PKGNAME: perl_cross
  12.   SRCPERLVERSION: 5.38.0
  13.   CROSSPERLVERSION: 1.5

  14. on:
  15.   watch: # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#watch
  16.     type: [started]

  17. jobs:
  18.   build: # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_id
  19.     name: Test Build # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idname
  20.     runs-on: ubuntu-latest # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#example-specifying-an-operating-system

  21. # every step must define a uses or run key
  22. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idsteps
  23. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsname
  24. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsuses
  25. # https://github.com/marketplace/actions/checkout
  26.     steps:
  27. #      - name: Checkout Code
  28. #        uses: actions/checkout@v3.6.0


  29. # https://github.com/marketplace/actions/setup-android-ndk
  30. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepswith
  31. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsid
  32. # https://docs.github.com/en/actions/learn-github-actions/contexts#steps-context
  33.       - name: Setup Android NDK
  34.         uses: nttld/setup-ndk@v1.3.1
  35.         id: setup-ndk
  36.         with:
  37.           ndk-version: r22b # https://github.com/android/ndk/wiki/Changelog-r22#r22b
  38.           local-cache: true
  39.           add-to-path: true

  40. # https://docs.github.com/en/actions/learn-github-actions/variables#defining-environment-variables-for-a-single-workflow
  41. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#env
  42. # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
  43. # https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-an-environment-variable
  44. # https://developer.android.com/ndk/guides/other_build_systems?hl=en#autoconf
  45.       - name: Setup Cross Compile Variable
  46.         env:
  47.           NDK: ${{ steps.setup-ndk.outputs.ndk-path }}
  48.           TOOLCHAIN: ${{ steps.setup-ndk.outputs.ndk-path }}/toolchains/llvm/prebuilt/linux-x86_64
  49.         run: |
  50.           echo "AR=$TOOLCHAIN/bin/llvm-ar" >> "$GITHUB_ENV"
  51.           echo "NM=$TOOLCHAIN/bin/llvm-nm" >> "$GITHUB_ENV"
  52.           echo "OBJCOPY=$TOOLCHAIN/bin/llvm-objcopy" >> "$GITHUB_ENV"
  53.           echo "OBJDUMP=$TOOLCHAIN/bin/llvm-objdump" >> "$GITHUB_ENV"
  54.           echo "RANLIB=$TOOLCHAIN/bin/llvm-ranlib" >> "$GITHUB_ENV"
  55.           echo "READELF=$TOOLCHAIN/bin/llvm-readelf" >> "$GITHUB_ENV"
  56.           echo "STRIP=$TOOLCHAIN/bin/llvm-strip" >> "$GITHUB_ENV"
  57.           echo "STRINGS=$TOOLCHAIN/bin/llvm-strings" >> "$GITHUB_ENV"
  58.           echo "LD=$TOOLCHAIN/bin/ld" >> "$GITHUB_ENV"
  59.           echo "CC=$TOOLCHAIN/bin/$TARGET$API-clang" >> "$GITHUB_ENV"
  60.           echo "CXX=$TOOLCHAIN/bin/$TARGET$API-clang++" >> "$GITHUB_ENV"
  61.           echo "SYSROOT=$TOOLCHAIN/sysroot" >> "$GITHUB_ENV"
  62.           echo "TOOLCHAIN=$TOOLCHAIN" >> "$GITHUB_ENV"
  63.           echo "NDK=$NDK" >> "$GITHUB_ENV"
  64.           echo "PATH=$TOOLCHAIN/bin:$PATH" >> "$GITHUB_ENV"



  65.       - name: Build perl_cross For Android
  66.         run: |
  67.           sudo wget https://github.com/arsv/perl-cross/releases/download/${CROSSPERLVERSION}/perl-cross-${CROSSPERLVERSION}.tar.gz
  68.           sudo wget https://www.cpan.org/src/5.0/perl-${SRCPERLVERSION}.tar.gz
  69.           sudo tar -zxf perl-${SRCPERLVERSION}.tar.gz
  70.           cd perl-${SRCPERLVERSION}
  71.           echo "---------- tar begin ----------"
  72.           sudo tar --strip-components=1 -zxvf ../perl-cross-${CROSSPERLVERSION}.tar.gz
  73.           echo "---------- end tar ----------"
  74.          
  75.           sudo mkdir -p $MAKETO
  76.           sudo ./configure \
  77.           --target=$TARGET \
  78.           --sysroot=$SYSROOT \
  79.           --prefix=$MAKETO \
  80.           --with-cc=$CC \
  81.           --with-cpp=$CXX \
  82.           --with-ranlib=$RANLIB \
  83.           --with-ar=$AR \
  84.           --with-as=$AS \
  85.           --with-ld=$LD \
  86.           --with-nm=$NM \
  87.           --with-readelf=$READELF \
  88.           --with-objdump=$OBJDUMP \
  89.           --with-obcopy=$OBJCOPY
  90.          
  91.           echo "---------- compile begin ----------"
  92.           sudo bash -c "make && make install"
  93.           echo "---------- compile end ----------"
  94.           echo "---------- file info ----------"
  95.           sudo find $MAKETO -name perl -executable -type f
  96.           sudo file $(find $MAKETO -name perl -executable -type f)
  97.           echo "---------- info end ----------"
  98.           sudo mkdir -p $GITHUB_WORKSPACE/output
  99.           cd $GITHUB_WORKSPACE/output
  100.           echo "---------- tar begin ----------"
  101.           sudo bash -c "find $MAKETO \
  102.           -printf '%P\n' \
  103.           -type f -o \
  104.           -type l -o \
  105.           -type d | \
  106.           tar -czvf perl_cross.tar.gz \
  107.           --no-recursion \
  108.           -C $MAKETO \
  109.           -T -"
  110.           echo "---------- tar end ----------"


  111. # using multiple this action to upload different or same file separately
  112. # https://github.com/marketplace/actions/upload-a-build-artifact
  113.       - name: Upload Artifact
  114.         uses: actions/upload-artifact@v3.1.2
  115.         with:
  116.           name: perl_cross
  117.           path: output/
复制代码



GitHub Action 大概需要运行 7 分钟左右就可以完成编译了
GitHub Action









从 Artifacts 中下载编译好的文件后,在目录 /data/user/0/bin.mt.plus/files/term/usr 下新建一个 perl_cross 目录,将文件中的三个目录都复制进去
copy to perl_cross



test


可以看到,perl 是可以运行起来的,而且版本是 5.38.0。至此,如果不出意外的话,运行 exiftool 的条件已经全部满足了。然后根据 exiftool 官网提供的使用方法,好像是有两种不同的运行方式,一种是解压源码包后,运行里边的 exiftool 程序,另一种就是类似于源码编译,通过 make 和 make install 将它安装到系统上
installing ExifTool







Unix Platforms


源码的下载地址为:Image-ExifTool-12.65.tar.gz,下载好之后,直接解压到目录 /data/user/0/bin.mt.plus/files/term/usr 下
untar to usr dir


然后,进入目录 Image-ExifTool-12.65,以文本方式打开程序 exiftool,将首行代码改为 perl 所在的路径,这里,我的是 /data/user/0/bin.mt.plus/files/term/usr/perl_cross/bin/perl
change interpreter


运行效果如下:


发现是正常的,不过,不知道为什么会出现 No such signal 的错误。在找了一些相关资料之后,了解到 SIG 在 perl 中是用于捕获一些信号并进行相关的处理
SIG









如果不想看到这个提示的话,可以将 exiftool 程序中的相关代码注释掉(看起来这两行分别是用于在按下 CTRL-C 和收到 SIGCONT 信号时做不同的处理)
comment signal in exiftool









不过,注释掉这两行代码会有什么后果我是不清楚的,如果改了有问题,我可负不起责任,所以改之前要自行阅读源码和了解 SIG 相关的知识

以上是通过运行源码包里的 exiftool 程序的例子,还有一种方法是通过 make 来运行,这里也做个示范。要做的就是在源码包里输入以下两个命令即可(因为 make test 可做可不做,所以就当成两个了)
  1. perl Makefile.PL
  2. make test
  3. make install
复制代码


install perl

这里,为了方便复制,改了一下代码


以下是一些在安装过程中输出的代码
perl Makefile.PL
  1. Checking if your kit is complete...
  2. Looks good
  3. Generating a Unix-style Makefile
  4. Writing Makefile for Image::ExifTool
复制代码







make test
  1. All tests successful.
  2. Files=107, Tests=575, 72 wallclock secs ( 0.95 usr  0.36 sys + 65.35 cusr  4.29 csys = 70.95 CPU)
  3. Result: PASS
复制代码







make install
  1. Manifying 1 pod document
  2. Manifying 194 pod documents
  3. Installing /data/user/0/bin.mt.plus/files/term/usr/perl_cross/lib/perl5/site_perl/5.38.0/File/RandomAccess.pm
  4. Installing /data/user/0/bin.mt.plus/files/term/usr/perl_cross/lib/perl5/site_perl/5.38.0/File/RandomAccess.pod
  5. Installing /data/user/0/bin.mt.plus/files/term/usr/perl_cross/lib/perl5/site_perl/5.38.0/Image/ExifTool.pod
复制代码


这种方式的运行效果如下


可以看到,这样安装的程序,可以直接在需要的目录下直接运行 exiftool,相对来说是方便了不少

四、参考
本篇笔记参考的文章如下:
1. perl信号处理
2. %SIG
3. perl_cross
4. perl_cross
回复

使用道具 举报

4

主题

6254

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
3952
好评
5
信誉
96

考神MT论坛帅哥MT论坛新人

发表于 2023-9-5 12:30:41 来自手机  | 显示全部楼层  来自 江苏
沙发
回复

使用道具 举报

137

主题

3475

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4509
好评
45
信誉
103

MT论坛帅哥考神MT论坛最佳新人MT论坛活跃会员MT论坛新人

发表于 2023-9-5 12:56:16 来自手机  | 显示全部楼层  来自 浙江
这个有啥用
回复

使用道具 举报

21

主题

4069

回帖

7762

积分

硕士生

Rank: 6Rank: 6

金币
662
好评
2
信誉
84
发表于 2023-9-5 13:04:43 来自手机  | 显示全部楼层  来自 内蒙古
这个帖子代码真多呀,谢谢分享
回复

使用道具 举报

24

主题

3979

回帖

8275

积分

禁止发言

金币
5084
好评
3
信誉
90

考神MT论坛新人MT论坛帅哥

发表于 2023-9-5 13:09:46 来自手机  | 显示全部楼层  来自 四川
感谢分享
回复

使用道具 举报

69

主题

3233

回帖

9428

积分

硕士生

Rank: 6Rank: 6

金币
4169
好评
14
信誉
99
发表于 2023-9-5 13:27:47 来自手机  | 显示全部楼层  来自 贵州
exiftool这个拿来干什么呀
回复

使用道具 举报

2

主题

5982

回帖

1万

积分

博士生

尊贵的VIP用户

Rank: 7Rank: 7Rank: 7

金币
2174
好评
1
信誉
100

考神

发表于 2023-9-5 13:47:38 | 显示全部楼层  来自 安徽
小白看不懂
回复

使用道具 举报

8

主题

1万

回帖

2万

积分

博士后

Rank: 8Rank: 8

金币
5147
好评
1
信誉
100
发表于 2023-9-5 17:16:03 来自手机  | 显示全部楼层  来自 山东
感谢分享
回复

使用道具 举报

2

主题

3099

回帖

7267

积分

硕士生

Rank: 6Rank: 6

金币
1623
好评
3
信誉
104
发表于 2023-9-5 19:06:10 | 显示全部楼层  来自 广西
感谢分享
回复

使用道具 举报

0

主题

1787

回帖

3650

积分

大学生

Rank: 5Rank: 5

金币
16
好评
0
信誉
100
发表于 2023-9-5 19:06:22 来自手机  | 显示全部楼层  来自 广西
感谢分享
回复

使用道具 举报

39

主题

5420

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4486
好评
18
信誉
108
发表于 2023-9-11 15:16:36 来自手机  | 显示全部楼层  来自 河北
看不懂
回复

使用道具 举报

104

主题

6205

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
874
好评
4
信誉
99
发表于 2023-10-1 11:14:41 来自手机  | 显示全部楼层  来自 四川
内容太多
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表