本文记录如何利用aapt命令批量获取与apk文件相对应的包名。
1. 配置aapt环境变量,aapt.exe存在于SDK–build-tools目录中。
2. 编写批处理bat脚本getPackageName.bat,获取某一文件夹内所有apk的包名,输出至E:\软件样本库\apkpackagename.txt。
getPackageName.bat内容如下(注两个连续冒号后为注释):
@echo off
::%cd%表示当前目录,ApkPath为apk所在目录
set ApkPath=%cd%\benign
::进入apk所在目录
cd %ApkPath%
::获取apk包名并输出至 E:\软件样本库\apkpackagename.txt(目录自定)
for %%i in (*.apk) do (
echo 正在获取: %%i
:: >nul 表示屏蔽操作成功的显示信息,但是显示操作失败的信息
echo "%%i" > nul >> E:\软件样本库\apkpackagename.txt
aapt dump badging "%%i" | findstr "package:" >nul>>E:\软件样本库\apkpackagename.txt
)
pause
3. 将apk文件名与其包名相对应
写了一个java输入输出程序,完成这一功能。
通过上一步获取的apkpackagename.txt部分截图如下:
从图中可以看出,apk文件名被双引号""引起,包名则被单引号’'引起。若以"作为分隔符分割每一行得到字符串数组,*.apk文件名为字符串数组中的第二个元素。以’作为分隔符分割,包名为字符串数组中的第二个元素。
代码如下:
package test2;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
public class GetPackageName {
public static void main(String[] args) throws Exception {
//指定读取目录
File file = new File("E:/FinalDesign/DataProcessing/GetData/apkpackagename.txt");
//制定输出目录
File ofile = new File("E:/FinalDesign/DataProcessing/GetData/onlypackagename.txt");
//输入流
FileInputStream fis = new FileInputStream(file);
//输出流
FileOutputStream fos = new FileOutputStream(ofile);
//将输入字节流转换为字符流
InputStreamReader isr = new InputStreamReader(fis);
//将输出字节流转为字符流
OutputStreamWriter osw = new OutputStreamWriter(fos);
//提供缓冲功能,加快读取效率
BufferedReader buffr = new BufferedReader(isr);
BufferedWriter buffw = new BufferedWriter(osw);
String nextline = null;
//int num = 0;
//System.out.println(nextline);
while((nextline= buffr.readLine()) != null) {
//System.out.println(nextline);
//以'作为分隔符将每一行分割得到第二个字符串
String[] splitstr1 = nextline.split("\'");
//以"作为分隔符将每一行分割得到第二个字符串
String[] splitstr2 = nextline.split("\"");
//System.out.println(splitstr2[0]);
if(splitstr2.length > 1) {
buffw.write(splitstr2[1]);
}
if(splitstr1.length > 1) {
buffw.write(" "+splitstr1[1]);
//num ++;
buffw.newLine();
}
else
continue;
}
buffr.close();
buffw.close();
//System.out.println(num);
}
}
运行程序后得到的txt文件截图: