2. [代码][Java]代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
package
lab.sodino.fetchapkicon;
import
java.io.File;
import
java.lang.reflect.Constructor;
import
java.lang.reflect.Field;
import
java.lang.reflect.Method;
import
android.app.Activity;
import
android.content.Context;
import
android.content.pm.ApplicationInfo;
import
android.content.pm.PackageInfo;
import
android.content.pm.PackageManager;
import
android.content.res.Resources;
import
android.graphics.drawable.Drawable;
import
android.os.Bundle;
import
android.util.DisplayMetrics;
import
android.util.Log;
import
android.view.View;
import
android.widget.ImageView;
public
class
FetchAPKIconAct
extends
Activity {
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
showUninstallAPKIcon(
"/sdcard/APK/JarodYv.FishPool.apk"
);
getUninatllApkInfo(
this
,
"/sdcard/APK/JarodYv.FishPool.apk"
);
}
public
void
getUninatllApkInfo(Context context, String archiveFilePath) {
PackageManager pm = context.getPackageManager();
PackageInfo info = pm.getPackageArchiveInfo(archiveFilePath, PackageManager.GET_ACTIVITIES);
if
(info !=
null
) {
ApplicationInfo appInfo = info.applicationInfo;
Drawable icon = pm.getApplicationIcon(appInfo);
ImageView image = (ImageView) findViewById(R.id.apkIconByTradition);
image.setVisibility(View.VISIBLE);
image.setImageDrawable(icon);
}
}
//
private
void
showUninstallAPKIcon(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();
// PackageParser.Package mPkgInfo = packageParser.parsePackage(new
// File(apkPath), apkPath,
// metrics, 0);
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);
// Resources pRes = getResources();
// AssetManager assmgr = new AssetManager();
// assmgr.addAssetPath(apkPath);
// Resources res = new Resources(assmgr, pRes.getDisplayMetrics(),
// pRes.getConfiguration());
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 = 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);
}
// if (label == null) {
// label = (info.nonLocalizedLabel != null) ? info.nonLocalizedLabel
// : info.packageName;
// }
Log.d(
"ANDROID_LAB"
,
"label="
+ label);
// 这里就是读取一个apk程序的图标
if
(info.icon !=
0
) {
Drawable icon = res.getDrawable(info.icon);
ImageView image = (ImageView) findViewById(R.id.apkIconBySodino);
image.setVisibility(View.VISIBLE);
image.setImageDrawable(icon);
}
}
catch
(Exception e) {
e.printStackTrace();
}
}
}
|