之前写 shell 脚本的几篇文章都是先大致介绍脚本的功能和写法, 然后一股脑的给出完整的代码. 并没有细致入微的解释脚本中的每一行是如何思考如何编写的.
今天反其道而行之, 只介绍一行代码. 争取能讲的清楚明白, 让大家了解我在写这行代码时的思路.
说说这行代码的作用吧: 通过反编译工具 apktool 将 apk 文件反编译后, 得到的文件中有一份 AndroidManifest.xml. 希望从这份文件中获取到 apk 的包名 (Package Name).
首先, 我需要确定每个 apk 反编译后拿到的 AndroidManifest.xml 格式是否一致. 所以, 我选了 BAT 三家大厂的代表作品, 通过 apktool 将它们的 apk 反编译后, 发现 AndroidManifest.xml 都是一样的格式. 并且包名就在首行. 这下就好办了.
鉴于它们三家的 AndroidManifest.xml 格式都一样, 我就随便选了 QQ 的 AndroidManifest.xml 当作模版进行脚本编写吧.
以下是编写思路:
1, 因为包名在首行, 所以先把第一行字符给提取出来;
sed -n '1p' AndroidManifest.xml
2, 包名所在列和其他几列通过空格隔开的, 那就可以把每一列转成单独的行;
sed -n '1p' AndroidManifest.xml | awk '{for(i=1;i<=NF;i++){print $i;}}'
3, 因为只有包名这一列含有 "package" 一词, 所以可以过滤出这行;
sed -n '1p' AndroidManifest.xml | awk '{for(i=1;i<=NF;i++){print $i;}}' | grep "package"
4, 过滤后的这行, 包名包含在两个双引号之间, 通过将双引号作为截取字符即可将这行分为三部分, 输出第二部分即为包名.
sed -n '1p' AndroidManifest.xml | awk '{for(i=1;i<=NF;i++){print $i;}}' | grep "package" | awk -F '"''{print $2}'
第四步结束, 这个截取包名的脚本也就写完了.
来源: https://www.cnblogs.com/liushengchieh/p/10695308.html