获取 Android 应用签名 SHA1 值、MD5 值、SHA256 值的流程

为了获取 Android 应用签名的 SHA1 值、MD5 值和 SHA256 值,可以按照以下步骤进行操作:

步骤 操作
1 找到应用的签名文件路径
2 使用 Java Keytool 工具获取签名文件的 SHA1 值
3 使用 Keytool 获取签名文件的 MD5 值
4 使用 OpenSSL 获取签名文件的 SHA256 值

下面将详细介绍每一步需要做什么,并提供相应的代码和注释。

1. 找到应用的签名文件路径

// 获取应用的包名
String packageName = getPackageName();
// 获取应用的签名文件路径
String apkPath = getPackageManager().getApplicationInfo(packageName, 0).sourceDir;

在上述代码中,使用 getPackageName() 方法获取当前应用的包名,然后通过包名和 getPackageManager().getApplicationInfo() 方法获取应用的签名文件路径。

2. 使用 Java Keytool 工具获取签名文件的 SHA1 值

// 创建执行命令的 ProcessBuilder 对象
ProcessBuilder processBuilder = new ProcessBuilder(
        "keytool",
        "-list",
        "-printcert",
        "-jarfile",
        apkPath
);
// 设置命令执行的工作目录
processBuilder.directory(new File(System.getProperty("user.home")));
// 重定向错误流输出
processBuilder.redirectErrorStream(true);
// 开始执行命令
Process process = processBuilder.start();
// 获取命令执行的输出流
InputStream is = process.getInputStream();
// 读取输出流内容
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
StringBuilder output = new StringBuilder();
while ((line = br.readLine()) != null) {
    output.append(line + "\n");
}
br.close();
// 获取 SHA1 值
String sha1 = parseSHA1FromOutput(output.toString());

在上述代码中,使用 Java 的 ProcessBuilder 类来执行命令行操作,通过执行 keytool -list -printcert -jarfile [apkPath] 命令来获取签名文件的信息。parseSHA1FromOutput() 方法用于从命令输出中解析出 SHA1 值。

3. 使用 Keytool 获取签名文件的 MD5 值

// 创建执行命令的 ProcessBuilder 对象
ProcessBuilder processBuilder = new ProcessBuilder(
        "keytool",
        "-list",
        "-v",
        "-keystore",
        "~/.android/debug.keystore",
        "-alias",
        "androiddebugkey",
        "-storepass",
        "android",
        "-keypass",
        "android"
);
// 设置命令执行的工作目录
processBuilder.directory(new File(System.getProperty("user.home")));
// 重定向错误流输出
processBuilder.redirectErrorStream(true);
// 开始执行命令
Process process = processBuilder.start();
// 获取命令执行的输出流
InputStream is = process.getInputStream();
// 读取输出流内容
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
StringBuilder output = new StringBuilder();
while ((line = br.readLine()) != null) {
    output.append(line + "\n");
}
br.close();
// 获取 MD5 值
String md5 = parseMD5FromOutput(output.toString());

在上述代码中,使用 Java 的 ProcessBuilder 类来执行命令行操作,通过执行 keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android 命令来获取签名文件的信息。parseMD5FromOutput() 方法用于从命令输出中解析出 MD5 值。

4. 使用 OpenSSL 获取签名文件的 SHA256 值

// 创建执行命令的 ProcessBuilder 对象
ProcessBuilder processBuilder = new ProcessBuilder(
        "openssl",
        "sha256",
        "-binary",
        apkPath
);
// 设置命令执行的工作目录
processBuilder.directory(new File(System.getProperty("user.home")));
// 重定向错误流输出
processBuilder.redirectErrorStream(true);
// 开始执行命令
Process process = processBuilder.start();
// 获取命令执行的输出流
InputStream is = process.getInputStream();
// 读取输出流内容
byte[] buffer = new byte[4096];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
while ((bytesRead = is.read(buffer)) != -1) {
    output.write