1.安卓
<dependency>
<groupId>net.dongliu</groupId>
<artifactId>apk-parser</artifactId>
</dependency>
import net.dongliu.apk.parser.ApkFile;
import net.dongliu.apk.parser.bean.ApkMeta;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
public class APKUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(APKUtil.class);
public static Map<String, String> getApkInfo(File file) {
try {
Map<String, String> apkInfo = new HashMap<>();
ApkFile apkFile = new ApkFile(file);
ApkMeta apkMeta = apkFile.getApkMeta();
apkInfo.put("appName", apkMeta.getName());
apkInfo.put("packName", apkMeta.getPackageName());
apkInfo.put("versionCode", String.valueOf(apkMeta.getVersionCode()));
apkInfo.put("versionName", apkMeta.getVersionName());
return apkInfo;
} catch (Exception e) {
LOGGER.error("获取apk信息错误:", e);
return null;
}
}
public static void inputStreamToFile(InputStream ins, File file) {
try {
OutputStream os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
} catch (Exception e) {
LOGGER.error("转换文件错误:", e);
}
}
}
2.ios
<dependency>
<groupId>com.googlecode.plist</groupId>
<artifactId>dd-plist</artifactId>
</dependency>
import com.dd.plist.NSDictionary;
import com.dd.plist.NSString;
import com.dd.plist.PropertyListParser;
import java.io.*;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
public class IPAUtils {
/**
* 解压IPA文件,只获取IPA文件的Info.plist文件存储指定位置
*
* @param file zip文件
* @param unzipDirectory 解压到的目录
* @throws Exception
*/
private static File getZipInfo(File file, String unzipDirectory) throws Exception {
// 定义输入输出流对象
InputStream input = null;
OutputStream output = null;
File result = null;
File unzipFile = null;
ZipFile zipFile = null;
try {
// 创建zip文件对象
zipFile = new ZipFile(file);
// 创建本zip文件解压目录
String name = file.getName().substring(0, file.getName().lastIndexOf("."));
unzipFile = new File(unzipDirectory + "/" + name);
if (unzipFile.exists()) {
unzipFile.delete();
}
unzipFile.mkdir();
// 得到zip文件条目枚举对象
Enumeration<? extends ZipEntry> zipEnum = zipFile.entries();
// 定义对象
ZipEntry entry = null;
String entryName = null;
String names[] = null;
int length;
// 循环读取条目
while (zipEnum.hasMoreElements()) {
// 得到当前条目
entry = zipEnum.nextElement();
entryName = new String(entry.getName());
// 用/分隔条目名称
names = entryName.split("\\/");
length = names.length;
for (int v = 0; v < length; v++) {
if (entryName.endsWith(".app/Info.plist")) { // 为Info.plist文件,则输出到文件
input = zipFile.getInputStream(entry);
result = new File(unzipFile.getAbsolutePath() + "/Info.plist");
output = new FileOutputStream(result);
byte[] buffer = new byte[1024 * 8];
int readLen = 0;
while ((readLen = input.read(buffer, 0, 1024 * 8)) != -1) {
output.write(buffer, 0, readLen);
}
break;
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (input != null) {
input.close();
}
if (output != null) {
output.flush();
output.close();
}
// 必须关流,否则文件无法删除
if (zipFile != null) {
zipFile.close();
}
}
// 如果有必要删除多余的文件
if (file.exists()) {
file.delete();
}
return result;
}
/**
* IPA文件的拷贝,把一个IPA文件复制为Zip文件,同时返回Info.plist文件 参数 oldfile 为 IPA文件
*/
private static File getIpaInfo(File oldfile) throws IOException {
try {
int byteread = 0;
String filename = oldfile.getAbsolutePath().replaceAll(".ipa", ".zip");
File newfile = new File(filename);
if (oldfile.exists()) {
// 创建一个Zip文件
InputStream inStream = new FileInputStream(oldfile);
FileOutputStream fs = new FileOutputStream(newfile);
byte[] buffer = new byte[1444];
while ((byteread = inStream.read(buffer)) != -1) {
fs.write(buffer, 0, byteread);
}
if (inStream != null) {
inStream.close();
}
if (fs != null) {
fs.close();
}
// 解析Zip文件
return getZipInfo(newfile, newfile.getParent());
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 通过IPA文件获取Info信息
*/
public static Map<String, String> getVersionInfo(File ipa) throws Exception {
File file = getIpaInfo(ipa);
Map<String, String> info = new HashMap<>();
// 需要第三方jar包dd-plist
NSDictionary rootDict = (NSDictionary) PropertyListParser.parse(file);
// 应用包名
NSString parameters = (NSString) rootDict.objectForKey("CFBundleIdentifier");
info.put("CFBundleIdentifier", parameters.toString());
// 应用名称
parameters = (NSString) rootDict.objectForKey("CFBundleName");
info.put("CFBundleName", parameters.toString());
// 应用版本
parameters = (NSString) rootDict.objectForKey("CFBundleVersion");
info.put("CFBundleVersion", parameters.toString());
// 应用展示的名称
parameters = (NSString) rootDict.objectForKey("CFBundleDisplayName");
info.put("CFBundleDisplayName", parameters.toString());
// 应用所需IOS最低版本
parameters = (NSString) rootDict.objectForKey("MinimumOSVersion");
info.put("MinimumOSVersion", parameters.toString());
parameters = (NSString) rootDict.objectForKey("CFBundleShortVersionString");
info.put("CFBundleShortVersionString", parameters.toString());
// 如果有必要,应该删除解压的结果文件
file.delete();
file.getParentFile().delete();
return info;
}
}