一些代码与命令行小工具

最近的一些code实践。
包括两个部分:基于ffmpeg的批量图片压缩,以及基于adb的软件安装包提取。

PART I. ffmpeg压缩图片

某天整理照片时,觉得照片占用的存储空间太多了,想要精简一下体积。

鉴于大多数照片都是生活中的随手拍,照片清晰度没有特别重要的意义,因此萌生了一个想法:把照片的长和宽都减小为原先的一半(整个图片面积减小为原先的1/4),是不是可以极大压缩文件体积,同时不会对生活的记录有太多影响呢?于是检索了压缩图片体积的方法,成果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!bash
# step1. 创建输出目录
mkdir resized_img

# step2. 进入原始图片的目录
cd original_img;

# step3. 对于每一张jpg格式的文件,循环调用ffmpeg指令进行画质压缩,并导出到输出目录
for img in *.jpg; do
ffmpeg -i "${img}" \
-vf "scale=iw/2:ih/2" \
-q:v 3\
-map_metadata 0 \
"../resized_img/${img}"
done
echo "DONE"

原理是通过ffpmeg这个工具的 vf 滤镜,重新调整图片的长和宽(全部减小为原图的1/2)。

有个缺点:这样处理过后的图片,meta信息会消失(也就是拍摄地点、相机镜头参数之类的信息会被抹掉),即使我听从AI的建议添加了 -map_metadata 参数也无济于事。不过如果meta信息不重要的话,这个缺点可以无视。

PART II. adb提取系统应用

最近换了荣耀的手机。发现了一个不太方便的事情:荣耀和华为现在数据没法互通了,也就是说,我在matepad上设置的日历日程、编辑的备忘录便签,在荣耀手机上没法查看,反之亦然。

于是想着移植一下app——把华为日历/华为便签移动到手机上。

我们知道,移动端的QQ可以分享已安装应用的apk。但是对于系统应用(例如日历、备忘录这种),QQ是无法提取apk并分享的。搜索了下相关教程,有人提到可以使用ADB(Android Debug Bridge)提取系统应用,于是我进行了一些尝试。

step1. 安装ADB

参考安卓开发者官网 :

image.png

我们可以在 这个网页 下载独立的Android SDK平台工具包——这个工具包体积不到10MB,包含了一系列命令行小工具(包括ADB),如下图所示。我们要做的是把这个工具包解压到一个合适的位置,并编辑系统环境变量(PATH路径),以便在命令行中调用 adb 指令。

image.png

step2. 通过USB debug连接到ADB

在安卓设备上开启USB debug的方法在网上有很多说明,有需要的读者朋友可以自行搜索相关教程。简单来说,就是 ”系统设置→连续点击7次系统版本号→开启开发者模式→在开发者模式中开启USB debug“。

接下来,使用USB数据线连接安卓设备与电脑,并在电脑端启动一个命令行,输入 adb devices 指令以进行连接。首次连接时,安卓设备端会弹出一个对话框进行验证,此处点同意就行。连接成功的输出如下所述:

image.png

接下来,要查找系统应用的包名。我们输入 adb shell 进入安卓设备内部的shell控制台,并运行 pm list packages 展示所有已安装的app的包名;运行 pm path <package name> 提取app路径。要想查找特定应用,可以配合grep工具。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# run `adb shell` first
HWBAH3:/ $ pm list packages | grep -i "calendar"
package:com.android.providers.calendar
package:com.huawei.calendar
HWBAH3:/ $ pm list packages | grep -i "note"
package:com.huawei.hinote
package:com.microsoft.office.onenote
package:cn.wps.note
package:com.huawei.notepad
HWBAH3:/ $ pm path com.huawei.calendar
package:/hw_product/app/HwCalendarHm/HwCalendarHm_signed_entry.apk
package:/hw_product/app/HwCalendarHm/entry_phone_calendar_widget_release_signed_feature.apk
HWBAH3:/ $ pm path com.android.providers.calendar
package:/system/priv-app/CalendarProvider/CalendarProvider.apk
HWBAH3:/ $ pm path com.huawei.notepad
package:/hw_product/app/HwNotePadHm/HwNotePadHm_signed_entry.apk
package:/hw_product/app/HwNotePadHm/notepad_release_signed_feature.apk
HWBAH3:/ $

接下来,我们根据前面获取到的路径,提取apk文件。此处要使用的指令是 adb pull <package path>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# in another session
H:\temp\temp-2025-10-17-EMUI-apk-extract>adb pull /hw_product/app/HwCalendarHm/HwCalendarHm_signed_entry.apk
/hw_product/app/HwCalendarHm/HwCalendarHm_signed_entry.apk: 1 file pulled, 0 skipped. 34.5 MB/s (14594002 bytes in 0.404s)

H:\temp\temp-2025-10-17-EMUI-apk-extract>adb pull /hw_product/app/HwCalendarHm/entry_phone_calendar_widget_release_signed_feature.apk
/hw_product/app/HwCalendarHm/entry_phone_calendar_widget_release_signed_feature.apk: 1 file pulled, 0 skipped. 17.3 MB/s (127511 bytes in 0.007s)

H:\temp\temp-2025-10-17-EMUI-apk-extract>adb pull /system/priv-app/CalendarProvider/CalendarProvider.apk
/system/priv-app/CalendarProvider/CalendarProvider.apk: 1 file pulled, 0 skipped. 33.0 MB/s (1315212 bytes in 0.038s)

H:\temp\temp-2025-10-17-EMUI-apk-extract>adb pull /hw_product/app/HwNotePadHm/HwNotePadHm_signed_entry.apk
/hw_product/app/HwNotePadHm/HwNotePadHm_signed_entry.apk: 1 file pulled, 0 skipped. 37.4 MB/s (15347304 bytes in 0.391s)

H:\temp\temp-2025-10-17-EMUI-apk-extract>adb pull /hw_product/app/HwNotePadHm/notepad_release_signed_feature.apk
/hw_product/app/HwNotePadHm/notepad_release_signed_feature.apk: 1 file pulled, 0 skipped. 13.0 MB/s (115268 bytes in 0.008s)

这样,就完成了系统app的安装包apk的提取。

image.png

(当然,最后我并没能成功在荣耀设备上安装成功这几个apk,推测是因为系统底层库的差异导致不兼容。这是后话了)