`
一岁打过熊
  • 浏览: 14237 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

如何制作一款APK管理器

阅读更多
今天研究了一下APK管理器代码,发现还是比较简单的,主要就是两个列表,一个显示SD卡上面的APK文件的list,一个显示已经安装的app的list。
1.获取SD卡上的APK安装文件后,要用代码读出APK里面的信息,如icon等,的主要代码如下:
private void getUninatllApkInfo(Context context, String apkPath) {
		String PATH_PackageParser = "android.content.pm.PackageParser";
		String PATH_AssetManager = "android.content.res.AssetManager";
		try {
			// apk包的文件路径
			// 这是一个Package 解释器, 是隐藏的
			// 构造函数的参数只有一个, apk文件的路径
			// PackageParser packageParser = new PackageParser(apkPath);
			Class pkgParserCls = Class.forName(PATH_PackageParser);
			Class[] typeArgs = new Class[1];
			typeArgs[0] = String.class;
			Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs);
			Object[] valueArgs = new Object[1];
			valueArgs[0] = apkPath;
			Object pkgParser = pkgParserCt.newInstance(valueArgs);
			Log.d("ANDROID_LAB", "pkgParser:" + pkgParser.toString());
			// 这个是与显示有关的, 里面涉及到一些像素显示等等, 我们使用默认的情况
			DisplayMetrics metrics = new DisplayMetrics();
			metrics.setToDefaults();
			typeArgs = new Class[4];
			typeArgs[0] = File.class;
			typeArgs[1] = String.class;
			typeArgs[2] = DisplayMetrics.class;
			typeArgs[3] = Integer.TYPE;
			Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod(
					"parsePackage", typeArgs);
			valueArgs = new Object[4];
			valueArgs[0] = new File(apkPath);
			valueArgs[1] = apkPath;
			valueArgs[2] = metrics;
			valueArgs[3] = 0;
			Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser,
					valueArgs);
			// 应用程序信息包, 这个公开的, 不过有些函数, 变量没公开
			// ApplicationInfo info = mPkgInfo.applicationInfo;
			Field appInfoFld = pkgParserPkg.getClass().getDeclaredField(
					"applicationInfo");
			ApplicationInfo info = (ApplicationInfo) appInfoFld
					.get(pkgParserPkg);
			// uid 输出为"-1",原因是未安装,系统未分配其Uid。
			Log
					.d("ANDROID_LAB", "pkg:" + info.packageName + " uid="
							+ info.uid);
			Class assetMagCls = Class.forName(PATH_AssetManager);
			Constructor assetMagCt = assetMagCls.getConstructor((Class[]) null);
			Object assetMag = assetMagCt.newInstance((Object[]) null);
			typeArgs = new Class[1];
			typeArgs[0] = String.class;
			Method assetMag_addAssetPathMtd = assetMagCls.getDeclaredMethod(
					"addAssetPath", typeArgs);
			valueArgs = new Object[1];
			valueArgs[0] = apkPath;
			assetMag_addAssetPathMtd.invoke(assetMag, valueArgs);
			Resources res = context.getResources();
			typeArgs = new Class[3];
			typeArgs[0] = assetMag.getClass();
			typeArgs[1] = res.getDisplayMetrics().getClass();
			typeArgs[2] = res.getConfiguration().getClass();
			Constructor resCt = Resources.class.getConstructor(typeArgs);
			valueArgs = new Object[3];
			valueArgs[0] = assetMag;
			valueArgs[1] = res.getDisplayMetrics();
			valueArgs[2] = res.getConfiguration();
			res = (Resources) resCt.newInstance(valueArgs);
			CharSequence label = null;
			if (info.labelRes != 0) {
				label = res.getText(info.labelRes);
			}
			Log.d("ANDROID_LAB", "label=" + label);
			// 这里就是读取一个apk程序的图标
			if (info.icon != 0) {
				this.icon = res.getDrawable(info.icon);
				appName = label.toString();
				packageName = info.packageName;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}


icon就是这个APK的图标,appName就是这个apk的名称,packageName就是这个apk的包名。
2.下面是如何获取所有的已经安装的非系统app的代码:
private ArrayList<InstalledAppInfo> getInstalledApps() {
		ArrayList<InstalledAppInfo> res = new ArrayList<InstalledAppInfo>();
		List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);
		for (int i = 0; i < packs.size(); i++) {
			PackageInfo p = packs.get(i);
			if((p.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0){
				continue;
			}

			InstalledAppInfo newInfo = new InstalledAppInfo();
			newInfo.setAppname(p.applicationInfo.loadLabel(getPackageManager())
					.toString());
			newInfo.setPname(p.packageName);
			newInfo.setVersionName(p.versionName);
			newInfo.setVersionCode(p.versionCode);
			newInfo.setIcon(p.applicationInfo.loadIcon(getPackageManager()));
			res.add(newInfo);
		}
		return res;
	}


其中的
if((p.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0){
				continue;
			}

作用是过滤掉system app。


如果需要整个Application源码的可以发邮件到bear.huangzhen@gmail.com索取。
分享到:
评论
1 楼 hejinya 2012-02-28  
非常受用,正在做一个文件管理器,已经给你gmail邮箱发了一封邮件,可以提供下源码不,万分感谢

相关推荐

    APk 编辑器 Android

    - 带文件管理器功能,支持常用的复制、重命名、删除等功能;支持安装APK文件(长按文件名); - 可以解压、压缩、替换jar/zip/apk/ear/war文件中的单个文件以及整个目录(长按文件或目录)。 - 资源分支选择功能,可...

    手把手教你打造apk安装器

    下载提供的文档和资源,你可以跟随教程逐步实践,从而掌握自定义apk安装器的制作技巧。 【知识点详解】 1. **APK文件结构**:首先,你需要了解APK的基本组成,包括AndroidManifest.xml(应用元数据)、.dex...

    详解如何制作APK安装器_源代码_MFC_VC

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库和Visual C++ (VC++) 开发一个APK安装器。APK安装器是一种应用程序,它允许用户在Android设备上方便地安装和卸载APK文件。通过学习如何制作...

    old.apk and new.apk

    总的来说,"old.apk and new.apk"涉及的知识点主要包括Android应用的版本管理、增量更新技术、补丁制作和应用、以及跨平台兼容性。理解这些概念和技术对于Android开发者来说至关重要,能够提升用户体验,同时降低...

    安卓制作apk签名

    在安卓应用开发中, APK 签名是一个关键步骤,它确保了应用的完整性和安全性。签名过程使得开发者能够对应用程序进行唯一标识,同时也保护应用免受恶意篡改。以下是关于“安卓制作apk签名”的详细知识讲解: 1. **...

    Android手机系统软件apk开发制作

    在Android手机系统软件apk开发制作过程中,首先需要搭建一个完整的开发环境。这通常涉及到以下几个关键步骤: 1. **JDK安装**:Java Development Kit (JDK)是Android开发的基础,因为Android应用程序是用Java语言...

    KM盒子(安卓手机APK电子书制作软件)V4.0绿色版

    KM盒子是一款支持文字、图片、表格混合排版的安卓手机APK电子书制作软件,编辑器支持插入超文本链接和视频链接,生成的APK电子书支持同时播放音频文件实现边看边听。软件支持APK相册生成、微书刊制作、生成chm电子书...

    H5打包apk工具

    3. **权限管理**:将Web应用打包为APK时,需要明确申请必要的Android权限,如网络访问、存储访问等。 4. **更新机制**:HTML5应用通常易于更新,但作为APK发布后,更新可能需要用户手动升级,或者通过内置的自动更新...

    Android成成.apk应用程序(图解)

    用户可以通过Android设备上的文件管理器找到下载的`.apk`文件,点击安装。安装过程中,系统会验证签名,确认无误后,应用将被安装到设备上。 7. **调试与优化**: 对于开发者来说,也可以创建未签名的`.apk`用于...

    apk包解包工具,可以用来获取游戏包中的资源

    “AssetStudio”是提到的特定解包工具之一,它是一个开源的图形化工具,专门用于提取和管理Android游戏及应用的资源。AssetStudio能解析APK文件,显示其中的资源,包括图片、音频、3D模型等,并提供导出功能,让用户...

    XposedInstaller_3.1.1.apk

    Xposed框架是一款可以在不修改APK的情况下影响程序运行(修改系统)的框架服务,基于Xposed框架可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。Xposed 框架安装器可以看成是个Xposed 框架的管理工具...

    一键提取游戏APK包音乐

    "一键提取游戏APK包音乐"是一个实用工具,专门针对那些想要轻松获取游戏背景音乐或者音效的用户。这个工具的独特之处在于它允许用户直接从APK文件中提取音乐,而不需要进行复杂的反编译或解包过程,大大简化了操作...

    Android签名用keytool和jarsigner制作apk文件.doc

    首先,`keytool`是Java Development Kit (JDK)自带的一个命令行工具,用于管理和创建数字证书,包括生成密钥对(公钥和私钥)以及存储这些密钥的Keystore文件。在Android应用签名的过程中,我们需要生成一个包含私钥...

    手电筒项目源码和APK

    在这个“手电筒项目源码和APK”中,我们有机会深入研究如何构建这样一个应用,并通过源码学习Android开发的相关知识。 首先,我们要理解Android应用的基本结构。在Android开发中,一个应用程序通常包含多个组件,如...

    手把手教你DIY-属于自己的专属APK程序

    ”以及部分提供的内容,详细介绍如何制作自己的专属APK程序。 #### 二、准备工作 在开始制作专属APK程序之前,我们需要准备一些必要的工具和环境: 1. **安装Java环境**:APK程序的开发主要基于Java语言。因此,...

    安卓头像制作图片圆角剪裁相关-Android拍照剪裁示例代码内附APK.rar

    这份“安卓头像制作图片圆角剪裁相关-Android拍照剪裁示例代码内附APK.rar”资源包含了一个Android应用的示例代码,用于演示如何实现这一功能。以下将详细介绍其中可能包含的关键知识点: 1. **Intent启动相机**:...

    HTML一键打包APK工具1.3.4.zip

    总的来说,HTML一键打包APK工具为非程序员提供了一种简单快捷地将Web内容转化为移动应用的途径,降低了Android开发的门槛,有助于快速原型制作和轻量级应用的部署。然而,对于复杂和高性能需求的项目,还是推荐采用...

    Maui在制作安卓程序的时候如何找到apk签名

    2. **配置管理器**:调整项目设置,以便为每个目标平台(如Android)生成正确的输出。 3. **发布应用**:右键点击项目,选择“发布”选项,然后按照Microsoft官方文档()的指引进行操作。 4. **寻找keystore文件**...

    安卓密码管理本APK

    于是利用Android自带的sqlite制作了一款小型密码管理工具。 此资源用安卓手机能直接安卓。绿色无病毒。我还没有能做病毒那么厉害哈哈 代码包在https://download.csdn.net/download/mountain_hua/10455152,下载后用...

    Xender Prime 4.4.2.apk

    ☆文件管理器 可以查看,移动或删除您收到的文件,甚至可以在需要清理手机存储空间时制作备份副本。 ☆查看已连接的朋友的移动应用 程序成功连接后,您朋友的手机中的各种应用程序将被引入您自己的手机,只需点击...

Global site tag (gtag.js) - Google Analytics