标签:
下载aapt.exe反编译执行程序,放入Java工程资源文件夹下(具体路径自己可定义)
public class ApkUtil { public static final String VERSION_CODE = "versionCode"; public static final String VERSION_NAME = "versionName"; public static final String SDK_VERSION = "sdkVersion"; public static final String TARGET_SDK_VERSION ="targetSdkVersion"; public static final String USES_PERMISSION ="uses-permission"; public static final String APPLICATION_LABEL ="application-label"; public static final String APPLICATION_ICON = "application-icon"; public static final String USES_FEATURE = "uses-feature"; public static final String USES_IMPLIED_FEATURE ="uses-implied-feature"; public static final String SUPPORTS_SCREENS ="supports-screens"; public static final String SUPPORTS_ANY_DENSITY ="supports-any-density"; public static final String DENSITIES = "densities"; public static final String PACKAGE = "package"; public static final String APPLICATION = "application:"; //api ---- os static Map<String, String> OSVersion = new HashMap<String,String>(); static { OSVersion.put("3", "1.5"); OSVersion.put("4", "1.6"); OSVersion.put("5", "2.0"); OSVersion.put("6", "2.0.1"); OSVersion.put("7", "2.1"); OSVersion.put("8", "2.2"); OSVersion.put("9", "2.3"); OSVersion.put("10", "2.3.3"); OSVersion.put("11", "3.0"); OSVersion.put("12", "3.1"); OSVersion.put("13", "3.2"); OSVersion.put("14", "4.0"); OSVersion.put("15", "4.0.3"); OSVersion.put("16", "4.1.1"); OSVersion.put("17", "4.2"); OSVersion.put("18", "4.3"); OSVersion.put("19", "4.4"); OSVersion.put("20", "4.4w"); OSVersion.put("21", "5.0"); OSVersion.put("22", "5.1"); OSVersion.put("23", "6.0"); } private ProcessBuilder mBuilder; private static final String SPLIT_REGEX = "(: )|(=')|(')|'"; /** * aapt所在的目录。 */ // private String mAaptPath ="D:/sdk/sdk/platform-tools/aapt.exe"; private String mAaptPath; public ApkUtil(String mAaptPath) { this.mAaptPath=mAaptPath; mBuilder = new ProcessBuilder(); mBuilder.redirectErrorStream(true); } /** * 返回一个apk程序的信息。 * * @param apkPath * apk的路径。 * @return apkInfo 一个Apk的信息。 */ public ApkInfo getApkInfo(String apkPath) throws Exception { Process process =mBuilder.command(mAaptPath, "d", "badging",apkPath).start(); InputStream is = null; is = process.getInputStream(); BufferedReader br = new BufferedReader( new InputStreamReader(is,"utf8")); String tmp = br.readLine(); try { if (tmp == null || !tmp.startsWith("package")) { throw new Exception("参数不正确,无法正常解析APK包。输出结果为:"+ tmp + "..."); } ApkInfo apkInfo = new ApkInfo(); do { setApkInfoProperty(apkInfo,tmp); } while ((tmp = br.readLine()) != null); return apkInfo; } catch (Exception e) { throw e; } finally { process.destroy(); closeIO(is); closeIO(br); } } /** * 设置APK的属性信息。 * * @param apkInfo * @param source */ private void setApkInfoProperty(ApkInfo apkInfo, String source) { if (source.startsWith(PACKAGE)) { splitPackageInfo(apkInfo, source); } else if (source.startsWith(SDK_VERSION)) { apkInfo.setSdkVersion(getPropertyInQuote(source)); apkInfo.setMinSdkVersion(OSVersion.get(getPropertyInQuote(source))); } else if (source.startsWith(TARGET_SDK_VERSION)) { apkInfo.setTargetSdkVersion(getPropertyInQuote(source)); } else if (source.startsWith(USES_PERMISSION)) { apkInfo.addToUsesPermissions(getPropertyInQuote(source)); } else if (source.startsWith(APPLICATION_LABEL)) { apkInfo.setAppName(getPropertyInQuote(source)); } else if (source.startsWith(USES_FEATURE)) { apkInfo.addToFeatures(getPropertyInQuote(source)); } } /** * 返回出格式为name: 'value'中的value内容。 * * @param source * @return */ private String getPropertyInQuote(String source) { return source.substring(source.indexOf("'") + 1,source.length() - 1); } /** * 分离出包名、版本等信息。 * * @param apkInfo * @param packageSource */ private void splitPackageInfo(ApkInfo apkInfo, String packageSource){ String[] packageInfo = packageSource.split(SPLIT_REGEX); apkInfo.setPackageName(packageInfo[2]); apkInfo.setVersionCode(packageInfo[4]); apkInfo.setVersionName(packageInfo[6]); } /** * 释放资源。 * * @param c * 将关闭的资源 */ private final void closeIO(Closeable c) { if (c != null) { try { c.close(); } catch (IOException e) { e.printStackTrace(); } } } public String getmAaptPath() { return mAaptPath; } public void setmAaptPath(String mAaptPath) { this.mAaptPath = mAaptPath; } }
public class ApkInfo { /** * apk内部版本号 */ private String versionCode = null; /** * apk外部版本号 */ private String versionName = null; /** * apk的包名 */ private String packageName = null; /** * 支持的android平台最低版本号 */ private String minSdkVersion = null; /** * apk所需要的权限 */ private List<String> usesPermissions = null; /** * 支持的SDK版本。 */ private String sdkVersion; /** * 建议的SDK版本 */ private String targetSdkVersion; /** * 应用程序名 */ private String appName; /** * 所需设备特性。 */ private List<String> features; public ApkInfo() { this.usesPermissions = new ArrayList<String>(); this.features = new ArrayList<String>(); } /** * 返回版本代码。 * * @return 版本代码。 */ public String getVersionCode() { return versionCode; } /** * @param versionCode * the versionCode toset */ public void setVersionCode(String versionCode) { this.versionCode = versionCode; } /** * 返回版本名称。 * * @return 版本名称。 */ public String getVersionName() { return versionName; } /** * @param versionName * the versionName toset */ public void setVersionName(String versionName) { this.versionName = versionName; } /** * 返回支持的最小sdk平台版本。 * * @return the minSdkVersion */ public String getMinSdkVersion() { return minSdkVersion; } /** * @param minSdkVersion * the minSdkVersion toset */ public void setMinSdkVersion(String minSdkVersion) { this.minSdkVersion = minSdkVersion; } /** * 返回包名。 * * @return 返回的包名。 */ public String getPackageName() { return packageName; } public void setPackageName(String packageName) { this.packageName = packageName; } /** * 返回sdk平台版本。 * * @return */ public String getSdkVersion() { return sdkVersion; } public void setSdkVersion(String sdkVersion) { this.sdkVersion = sdkVersion; } /** * 返回所建议的SDK版本。 * * @return */ public String getTargetSdkVersion() { return targetSdkVersion; } public void setTargetSdkVersion(String targetSdkVersion) { this.targetSdkVersion = targetSdkVersion; } /** * 返回所需的用户权限。 * * @return */ public List<String> getUsesPermissions() { return usesPermissions; } public void setUsesPermissions(List<String> usesPermission) { this.usesPermissions = usesPermission; } public void addToUsesPermissions(String usesPermission) { this.usesPermissions.add(usesPermission); } /** * 返回程序的名称标签。 * * @return */ public String getAppName() { return appName; } public void setAppName(String appName) { this.appName = appName; } /** * 返回应用程序所需的特性。 * * @return */ public List<String> getFeatures() { return features; } public void setFeatures(List<String> features) { this.features = features; } public void addToFeatures(String feature) { this.features.add(feature); } @Override public String toString() { return "ApkInfo [versionCode=" + versionCode + ",\n versionName=" + versionName + ",\npackageName=" + packageName + ",\nminSdkVersion=" + minSdkVersion + ",\n usesPermissions=" + usesPermissions + ",\nsdkVersion=" + sdkVersion + ",\n targetSdkVersion="+ targetSdkVersion + ",\n appName=" +appName + ",\n features="+features + "]"; } }
//获取apk File appFile = apk文件路径; //解析apk ApkInfo apkInfo=null; if (appFile.exists()) { //具体路径根据自己情况更改 StringrealPath = request.getRealPath("/WEB-INF/resource/exe/aapt.exe"); ApkUtilapkUtil = new ApkUtil(realPath); try{ apkInfo=apkUtil.getApkInfo(appFile.getAbsolutePath()); }catch (Exception e) { e.printStackTrace(); } } //获取apk信息 String appName = apkInfo.getAppName(); String appVersionStr =apkInfo.getVersionName(); String appPackageName =apkInfo.getPackageName();
通过上面的思路即可获取用户上传的apk文件的相关信息,该技术主要应用在应用商店的开发,用于对用户上传的apk文件进行信息提取
通过上传的APK文件,解析APK文件内容,获取应用权限包名等
标签:
原文地址:http://blog.csdn.net/u010670151/article/details/51354202