C#调用aapt获取apk文件的包名等信息
作者:admin 发布于:2014-7-2 9:42 Wednesday 分类:网络转载
前言
很早以前做《淘金乐园》时,为了判断某个App是否已经安装在了手机上,就需要服务器端记录这个App的包名。当时的解决方案是让运维人员自己输入包名(都是年轻犯的错啊……),很不方便。后来,接触到了一些大牛写的东西,便有了思路要彻底解决这个问题。问题的解决得益于两个知识点:AAPT和C#运行批处理或者bat文件并且得到输出
AAPT
aapt即Android Asset Packaging Tool , 在SDK的platform-tools目录下. 该工具可以查看, 创建, 更新ZIP格式的文档附件(zip, jar, apk).
以上是百度百科中的解释,我们可以通过这个Android已经提供好的工具获取App的相关信息。
注:AAPT是一个绿色软件,无外部依赖。
使用aapt d badging *.apk可以查看apk文件的程序名、包名、所用的sdk,程序版本以及权限信息等等。
如果执行如下命令:
1
|
aapt d badging qq.apk
|
则可能有如下结果:
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
|
package: name='com.tencent.mobileqq' versionCode='66' versionName='4.2.1'
sdkVersion:'7'
uses-permission:'com.android.launcher.permission.INSTALL_SHORTCUT'
uses-permission:'android.permission.INTERNET'
uses-permission:'android.permission.VIBRATE'
uses-permission:'android.permission.ACCESS_NETWORK_STATE'
uses-permission:'android.permission.CHANGE_CONFIGURATION'
uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED'
uses-permission:'android.permission.WAKE_LOCK'
uses-permission:'android.permission.SYSTEM_ALERT_WINDOW'
uses-permission:'android.permission.RECORD_AUDIO'
uses-permission:'com.tencent.msf.permission.account.sync'
uses-permission:'android.permission.MODIFY_AUDIO_SETTINGS'
uses-permission:'android.permission.CAMERA'
uses-permission:'android.permission.CHANGE_WIFI_STATE'
uses-permission:'android.permission.ACCESS_WIFI_STATE'
uses-permission:'android.permission.READ_PHONE_STATE'
uses-permission:'android.permission.KILL_BACKGROUND_PROCESSES'
uses-permission:'android.permission.CALL_PHONE'
uses-permission:'com.android.launcher.permission.READ_SETTINGS'
uses-permission:'com.android.launcher.permission.UNINSTALL_SHORTCUT'
uses-permission:'android.permission.PERSISTENT_ACTIVITY'
uses-permission:'android.permission.WRITE_SETTINGS'
uses-permission:'android.permission.SEND_SMS'
uses-permission:'android.permission.GET_TASKS'
uses-permission:'com.tencent.permission.VIRUS_SCAN'
uses-permission:'android.permission.READ_LOGS'
uses-permission:'android.permission.READ_CONTACTS'
uses-permission:'android.permission.FLASHLIGHT'
uses-permission:'android.permission.DISABLE_KEYGUARD'
uses-feature-not-required:'android.hardware.camera'
uses-feature-not-required:'android.hardware.camera.autofocus'
application-label:'QQ'
application-label-en:'QQ'
application-icon-120:'res/drawable-ldpi/icon.png'
application-icon-160:'res/drawable-hdpi/icon.png'
application-icon-240:'res/drawable-hdpi/icon.png'
application-icon-320:'res/drawable-hdpi/icon.png'
application-icon-480:'res/drawable-hdpi/icon.png'
application-icon-65535:'res/drawable-hdpi/icon.png'
application: label='QQ' icon='res/drawable-hdpi/icon.png'
launchable-activity: name='com.tencent.mobileqq.activity.SplashActivity' label=
'QQ' icon=''
uses-library-not-required:'com.google.android.maps'
uses-library-not-required:'com.google.android.media.effects'
uses-library-not-required:'com.motorola.hardware.frontcamera'
uses-permission:'com.tencent.photos.permission.DATA'
uses-permission:'com.tencent.msf.permission.account.sync'
uses-permission:'com.tencent.msf.permission.ACCOUNT_NOTICE'
uses-permission:'android.permission.CHANGE_WIFI_STATE'
uses-permission:'android.permission.INTERNET'
uses-permission:'android.permission.ACCESS_WIFI_STATE'
uses-permission:'android.permission.ACCESS_NETWORK_STATE'
uses-permission:'android.permission.ACCESS_FINE_LOCATION'
uses-permission:'android.permission.ACCESS_COARSE_LOCATION'
uses-permission:'android.permission.CAMERA'
uses-permission:'android.permission.READ_PHONE_STATE'
uses-permission:'android.permission.WAKE_LOCK'
uses-permission:'com.android.launcher.permission.INSTALL_SHORTCUT'
uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE'
uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED'
uses-permission:'com.tencent.msg.permission.pushnotify'
uses-permission:'com.tencent.msf.permission.account.sync'
uses-permission:'android.permission.READ_EXTERNAL_STORAGE'
uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WR
ITE_EXTERNAL_STORAGE'
uses-permission:'android.permission.READ_CALL_LOG'
uses-implied-permission:'android.permission.READ_CALL_LOG','targetSdkVersion < 1
6 and requested READ_CONTACTS'
uses-feature:'android.hardware.location'
uses-implied-feature:'android.hardware.location','requested a location access pe
rmission'
uses-feature:'android.hardware.location.gps'
uses-implied-feature:'android.hardware.location.gps','requested android.permissi
on.ACCESS_FINE_LOCATION permission'
uses-feature:'android.hardware.location.network'
uses-implied-feature:'android.hardware.location.network','requested android.perm
ission.ACCESS_COURSE_LOCATION permission'
uses-feature:'android.hardware.microphone'
uses-implied-feature:'android.hardware.microphone','requested android.permission
.RECORD_AUDIO permission'
uses-feature:'android.hardware.wifi'
uses-implied-feature:'android.hardware.wifi','requested android.permission.ACCES
S_WIFI_STATE, android.permission.CHANGE_WIFI_STATE, or android.permission.CHANGE
_WIFI_MULTICAST_STATE permission'
uses-feature:'android.hardware.telephony'
uses-implied-feature:'android.hardware.telephony','requested a telephony-related
permission or feature'
uses-feature:'android.hardware.touchscreen'
uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch
screen unless explicitly made optional'
uses-feature:'android.hardware.screen.landscape'
uses-implied-feature:'android.hardware.screen.landscape','one or more activities
have specified a landscape orientation'
uses-feature:'android.hardware.screen.portrait'
uses-implied-feature:'android.hardware.screen.portrait','one or more activities
have specified a portrait orientation'
main
app-widget
other-activities
search
other-receivers
other-services
supports-screens: 'small' 'normal' 'large'
supports-any-density: 'true'
locales: '--_--' 'en'
densities: '120' '160' '240' '320' '480' '65535'
native-code: 'armeabi'
|
这么一大堆信息,其实我们需要的也就只有几个。所以我们只需要将这个操作模拟出来并读取控制台的输出流然后解析字符串即可。
ApkReader
注:本项目参考了https://code.google.com/p/cfuture09-apkutil/
ApkReader解决方案包含两个项目:ApkReader和ApkUtil。其中ApkReader是展示界面,主要的功能实现在ApkUtil中,如果要复用功能,只需引用ApkUtil即可(aapt文件也已经以资源文件的形式附着在ApkUtil项目中,无需格外下载)。
通过ApkInfo类型,我们就可以知道可获取的信息有哪些
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
|
public class ApkInfo
{
public ApkInfo()
{
UsesPermissions = new List<string>();
ApplicationIcons = new Dictionary<string, string>();
ImpliedFeatures = new List<ImpliedFeature>();
Features = new List<string>();
}
/// <summary>
/// 获取或设置 内部版本号
/// </summary>
public String VersionCode { get; set; }
/// <summary>
/// 获取或设置 外部版本号
/// </summary>
public String VersionName { get; set; }
/// <summary>
/// 获取或设置 包名
/// </summary>
public String PackageName { get; set; }
/// <summary>
/// 获取或设置 所需要的权限
/// </summary>
public List<String> UsesPermissions { get; set; }
/// <summary>
/// 获取或设置 支持的SDK版本
/// </summary>
public String SdkVersion { get; set; }
/// <summary>
/// 获取或设置 建议的SDK版本
/// </summary>
public String TargetSdkVersion { get; set; }
/// <summary>
/// 获取或设置 应用程序名
/// </summary>
public String ApplicationLabel { get; set; }
/// <summary>
/// 获取或设置 各个分辨率下的图标路径
/// </summary>
public Dictionary<String, String> ApplicationIcons { get; set; }
/// <summary>
/// 获取或设置 程序的图标
/// </summary>
public String ApplicationIcon { get; set; }
/// <summary>
/// 获取或设置 暗指的特性
/// </summary>
public List<ImpliedFeature> ImpliedFeatures { get; set; }
/// <summary>
/// 获取或设置 所需设备特性
/// </summary>
public List<String> Features { get; set; }
/// <summary>
/// 获取或设置 启动界面
/// </summary>
public String LaunchableActivity { get; set; }
public override string ToString()
{
return "ApkInfo [VersionCode=" + VersionCode + ",\n VersionName="
+ VersionName + ",\n PackageName=" + PackageName
+ ",\n UsesPermissions="
+ UsesPermissions.Count + ",\n SdkVersion=" + SdkVersion
+ ",\n TargetSdkVersion=" + TargetSdkVersion
+ ",\n ApplicationLabel=" + ApplicationLabel
+ ",\n ApplicationIcons=" + ApplicationIcons.Count
+ ",\n ApplicationIcon=" + ApplicationIcon
+ ",\n ImpliedFeatures=" + ImpliedFeatures.Count + ",\n Features="
+ Features.Count + ",\n LaunchableActivity=" + LaunchableActivity + "\n]";
}
}
|
开源项目
ApkReader目前为1.0版本,现在在此开源。
开发工具:VS2010
.NET 版本:.NET 2.0
后记
随着开源软件的增多和源码的维护升级,做包上传的方式肯定是不能满足需求的。考虑在GitHub或CodePlex中创建开源项目,这样大家就可以及时跟踪代码的更新了。
相关日志: