java 解析ipa apk

安装maven 插件

 <!-- https://mvnrepository.com/artifact/com.googlecode.plist/dd-plist -->
 <dependency>
     <groupId>com.googlecode.plist</groupId>
     <artifactId>dd-plist</artifactId>
     <version>1.23</version>
 </dependency>

上代码


import com.dd.plist.NSDictionary;
import com.dd.plist.NSString;
import com.dd.plist.PropertyListParser;
import net.dongliu.apk.parser.ApkFile;
import net.dongliu.apk.parser.bean.ApkMeta;

import java.io.*;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class ApkAndIpaUtil {

    /**
     * 解析Apk文件
     *
     * @param file Apk的文件路径
     * @return
     */
    public static Map<String, Object> parseApk(File file) {
        Map<String, Object> map = new HashMap();
        try {
            // File file = new File(url);
            ApkFile apkFile = new ApkFile(file);
            ApkMeta apkMeta = apkFile.getApkMeta();
            map.put("appName", apkMeta.getLabel());
            map.put("appId", apkMeta.getPackageName());
            map.put("versionCode", apkMeta.getVersionCode());
            map.put("versionName", apkMeta.getVersionName());
            map.put("packetSize", (double) (file.length() * 100 / 1024 / 1024) / 100 + " MB");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }


    /**
     * 解析ipa文件
     *
     * @param file ipa的文件路径
     * @return
     */
    public static Map<String, Object> parseIpa(File file) {
        Map<String, Object> map = new HashMap();
        try {
            // File file = new File(url);
            InputStream is = new FileInputStream(file);
            ZipInputStream zipIns = new ZipInputStream(is);
            ZipEntry ze;
            InputStream infoIs = null;
            while ((ze = zipIns.getNextEntry()) != null) {
                if (!ze.isDirectory()) {
                    String name = ze.getName();
                    if (null != name && name.toLowerCase().contains(".app/info.plist")) {
                        ByteArrayOutputStream _copy = new ByteArrayOutputStream();
                        int chunk = 0;
                        byte[] data = new byte[1024];
                        while (-1 != (chunk = zipIns.read(data))) {
                            _copy.write(data, 0, chunk);
                        }
                        infoIs = new ByteArrayInputStream(_copy.toByteArray());
                        break;
                    }
                }
            }

            NSDictionary rootDict = (NSDictionary) PropertyListParser.parse(infoIs);

            //如果想要查看有哪些key ,可以把下面注释放开
            for (String keyName : rootDict.allKeys()) {
                System.out.println(keyName + ":" + rootDict.get(keyName).toString());
            }

            // 应用包名CFBundleDisplayNameCFBundleIdentifier
            NSString parameters = (NSString) rootDict.get("CFBundleIdentifier");
            map.put("appId", parameters.toString());
            // 应用版本名
            parameters = (NSString) rootDict.objectForKey("CFBundleShortVersionString");
            map.put("versionName", parameters.toString());
            // 应用版本号
            parameters = (NSString) rootDict.get("CFBundleVersion");
            map.put("versionCode", parameters.toString());
            parameters = (NSString) rootDict.get("CFBundleDisplayName");
            map.put("appName", parameters.toString());
            map.put("packetSize", (double) (file.length() * 100 / 1024 / 1024) / 100 + " MB");
            infoIs.close();
            is.close();
            zipIns.close();

        } catch (Exception e) {
            System.out.println("ipa包解析异常!");
        }
        return map;
    }

    /**
     * String url = "https://img.cheguakao.com/prodimg/20200927/__UNI__99584F9_0106120442.ipa";
     * 网络资源下载到项目
     *
     * @param url
     * @return
     */
    public static File openStream(String url) {
        //对本地文件命名
        String fileName = url.substring(url.lastIndexOf("."), url.length());
        File file = null;
        URL urlfile;
        InputStream inStream = null;
        OutputStream os = null;
        try {
            file = File.createTempFile("net_url", fileName);
            //下载
            urlfile = new URL(url);
            inStream = urlfile.openStream();
            os = new FileOutputStream(file);

            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = inStream.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != os) {
                    os.close();
                }
                if (null != inStream) {
                    inStream.close();
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //可返回File  对象  这里只返回文件的路径
        return file;
    }

}

调用方法

   @GetMapping("/apk-parser")
    public R apkParser(String url) {
        // 获取文件名
        String fileName = url.substring(url.lastIndexOf("."),url.length());
        // 获取文件后缀
        String prefix = fileName.substring(fileName.lastIndexOf("."));
        File file = ApkAndIpaUtil.openStream(url);
        Map<String, Object> map = null;
        if (prefix.equals(".apk")){
           map = ApkAndIpaUtil.parseApk(file);
        }else if (prefix.equals(".ipa")){
            map = ApkAndIpaUtil.parseIpa(file);
        }else{
            return R.error("请上传.apk /.ipa文件");
        }
        return R.ok(map);
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unity可以将游戏项目导出为iOS和Android平台的应用程序,分别为ipaapk格式。 ipaiOS平台的应用程序格式,可以在iPhone、iPad等iOS设备上安装和运行。在Unity中导出ipa文件的方法是:在Unity中选择Build Settings,选择iOS平台,然后选择Build,等待Unity编译打包完成后,就可以得到ipa文件。 apk是Android平台的应用程序格式,可以在各种安卓设备上安装和运行。在Unity中导出apk文件的方法是:在Unity中选择Build Settings,选择Android平台,然后选择Build,等待Unity编译打包完成后,就可以得到apk文件。 需要注意的是,导出ipaapk文件之前,需要在Unity中进行一些设置和配置,例如选择适当的分辨率、屏幕方向、权限等等。还需要对游戏进行测试和优化,确保应用程序在各种设备上都能够正常运行,并且应用程序的大小不会过大,否则可能会影响用户的下载和使用体验。 ### 回答2: Unity是一种跨平台的游戏开发引擎,可以用于开发iOS和Android两个主要移动平台的游戏。为了在不同的操作系统上运行游戏,Unity引擎提供了两种不同的发布格式:IPAAPKIPAiOS上的一种应用程序格式,它是为在iPhone、iPad和iPod Touch设备上安装的应用程序而设计的。当我们使用Unity构建iOS项目时,Unity会自动将游戏打包成一个IPA文件。这个文件包含了所有游戏资源、代码和必要的信息,以便在iOS设备上运行。 APK是Android上的一种应用程序格式,它是为在Android设备上安装的应用程序而设计的。当我们使用Unity构建Android项目时,Unity会自动将游戏打包成一个APK文件。这个文件也包含了所有游戏资源、代码和必要的信息,用于在Android设备上安装和运行游戏。 无论是IPA还是APK,它们都可以在相应的设备上通过安装文件来将游戏部署到目标平台上。用户只需下载并安装这些文件,就能在自己的设备上开始游戏。由于Unity的跨平台特性,开发者可以使用同一份代码和资源在不同的平台上构建和发布游戏,大大简化了开发工作。 总之,Unity的IPAAPK是用于在iOS和Android设备上安装和运行游戏的文件格式,开发者可以根据需要选择相应的格式进行打包和发布。 ### 回答3: Unity是一种跨平台的游戏引擎,它允许开发者使用一套代码编写游戏,并在不同的平台上进行部署和发布。它支持多种平台,包括iOS和Android。 在Unity中,当我们完成了游戏的开发后,我们需要将其打包为可在具体平台上运行的文件。对于iOS平台,打包成的文件格式为IPAiOS App Store Package),而对于Android平台,打包成的文件格式为APK(Android Package Kit)。 IPAp指的是针对iOS设备(如iPhone或iPad)的应用程序打包文件,可以在App Store上进行分发和下载。它是一个包含了应用程序代码、资源文件和其他必要信息的压缩文件。通常,我们需要在Xcode中进行签名和定制,然后通过iTunes Connect提交给苹果审核,最终由苹果发布到App Store。 APK是用于Android设备的应用程序打包文件。与IPAp相似,APK也是一个包含了应用程序代码、资源文件和其他必要信息的压缩文件。通常,我们需要使用Android Studio或其他打包工具进行签名和定制,然后将APK文件安装到Android设备上。 无论是IPAp还是APK,它们都是游戏在具体平台上运行所必需的文件格式。通过将游戏项目打包为IPAp或APK,开发者可以将游戏发布到对应的应用商店,供用户下载和使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值