最近的一些code实践。
包括两个部分:基于ffmpeg的批量图片压缩,以及基于adb的软件安装包提取。
PART I. ffmpeg压缩图片
某天整理照片时,觉得照片占用的存储空间太多了,想要精简一下体积。
鉴于大多数照片都是生活中的随手拍,照片清晰度没有特别重要的意义,因此萌生了一个想法:把照片的长和宽都减小为原先的一半(整个图片面积减小为原先的1/4),是不是可以极大压缩文件体积,同时不会对生活的记录有太多影响呢?于是检索了压缩图片体积的方法,成果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
mkdir resized_img
cd original_img;
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
参考安卓开发者官网 :

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

step2. 通过USB debug连接到ADB
在安卓设备上开启USB debug的方法在网上有很多说明,有需要的读者朋友可以自行搜索相关教程。简单来说,就是 ”系统设置→连续点击7次系统版本号→开启开发者模式→在开发者模式中开启USB debug“。
接下来,使用USB数据线连接安卓设备与电脑,并在电脑端启动一个命令行,输入 adb devices
指令以进行连接。首次连接时,安卓设备端会弹出一个对话框进行验证,此处点同意就行。连接成功的输出如下所述:

接下来,要查找系统应用的包名。我们输入 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的提取。

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