如何从apk包获得一个程序的图标
是这样的,我准备写一个PHP程序获得一个APK文件的图标
目标我还不知道,,apk文件的图标 是放在哪个位置 ??
通过读 AndroidManifest.xml 文件能获得它的图标文件路径吗?? 有些 AndroidManifest.xml 又是加了密的。。
好些APK文件的图标默认路径是 \res\drawable\icon.png
但是有些又是 \res\drawable\logo.png
有些又是 \res\drawable-hdpi\icon.png
通过 单纯的纯文本读取apk包,,能够获得一个apk的图标文件吗?? 求帮助 。。
最终目的是 我想通过PHP程序 提取一个APK的图标
--------------------编程问答-------------------- 你这个php是运行在手机上?通过java代码获得icon 然后放到临时路径下 你的php再去拿 --------------------编程问答-------------------- apk打包结构是什么样的? --------------------编程问答-------------------- 完全是用PHP读apk 文件的
昨晚查了下资料。。发现可能实现不了吧 。。
apk是编译过的。。(具体真的还不是很懂)
要想直接读 AndroidManifest.xml ,,还得先反编译。。
想单纯靠PHp实现还是不能的了。。 --------------------编程问答--------------------
其实apk文件就是一个压缩包,可以直接用winrar解压的,跟java的jar一样,图标就在里面了,接下来就是正常文件操作了,但我不会php,所以我不知道怎么通过php获得。 --------------------编程问答--------------------
学习~~
后缀名改成 Rar 解压 试试~ --------------------编程问答-------------------- 是zip,不是rar --------------------编程问答-------------------- 将.apk文件修改为.zip,然后,解压缩,相信你会找到你所需要的东东。。 --------------------编程问答-------------------- 将.apk文件修改为.zip,然后,解压缩,
\res\drawable-*dpi\icon.png 即图标 --------------------编程问答-------------------- 要在php程序里获取的话,也是先将文件名格式改为zip的,然后条用系统命令将其解压吧 --------------------编程问答-------------------- AndroidManifest.xml <application android:icon="@drawable/app_sample_code" >
app_sample_code这个就是图标文件。。。 --------------------编程问答-------------------- icon.png 这个名称不准确,不是所有的软件,都是用 icon.png比如google自己的软件都不用这个名称,2.2以前可以很好的读取,但是2.2有个改变,你可能需要研究android自有的二进制xml算法,从androidmanifest.xml提取icon的真正路径,然后显示了 --------------------编程问答-------------------- 楼上兄弟们说的都不错了,我整理一下吧:
1. 最准确的方法是从AndroidManifest.xml里取这个信息,所以,你必须能读到它。
2. 那第一步你得能解开.apk文件,这个因为apk就是zip,用PHP应该有相应函数可以解开的吧。
3. 然后你得到编译后的manifest.xml,还得能反编译它,具体可参考apktool,它就可以反编译androidmanifest.xml文件,而且是开源的,你可以参考,这一步估计得自己研究自己动手了。
这样就OK了。 --------------------编程问答--------------------
嗯!这种很有用。 --------------------编程问答-------------------- 这个有难度的。豌豆荚都没拿到哦 --------------------编程问答-------------------- 豌豆夹就一个 html+js写出来的垃圾,拿到个毛啊。你还是看看aapt的源码吧,问题比较弱智
--------------------编程问答-------------------- 把.apk改成.zip然后就可以解压拿了,易做图过.. --------------------编程问答-------------------- 这是android里面获取APK應用图标的方法,在Launcher的源码LauncherModel.java下,返回的是一个Drawable对象,可以轉換成Bitmap.
static Drawable getIcon(PackageManager manager, Context context, ActivityInfo activityInfo) {
String themePackage=AlmostNexusSettingsHelper.getThemePackageName(context, Launcher.THEME_DEFAULT);
Drawable icon = null;
if(themePackage.equals(Launcher.THEME_DEFAULT)){
icon = Utilities.createIconThumbnail(activityInfo.loadIcon(manager), context);
}else{
// get from theme
Resources themeResources = null;
if(AlmostNexusSettingsHelper.getThemeIcons(context)){
activityInfo.name=activityInfo.name.toLowerCase().replace(".", "_");
try {
themeResources = manager.getResourcesForApplication(themePackage);
} catch (NameNotFoundException e) {
//e.printStackTrace();
}
if(themeResources!=null){
int resource_id = themeResources.getIdentifier(activityInfo.name, "drawable", themePackage);
if(resource_id!=0){
icon=themeResources.getDrawable(resource_id);
}
// use IconShader
if(icon==null){
if (compiledIconShaderName==null ||
compiledIconShaderName.compareTo(themePackage)!=0){
compiledIconShader = null;
resource_id = themeResources.getIdentifier("shader", "xml", themePackage);
if(resource_id!=0){
XmlResourceParser xpp = themeResources.getXml(resource_id);
compiledIconShader = IconShader.parseXml(xpp);
}
}
if(compiledIconShader!=null){
icon = Utilities.createIconThumbnail(activityInfo.loadIcon(manager), context);
try {
icon = IconShader.processIcon(icon, compiledIconShader);
} catch (Exception e) {}
}
}
}
}
if(icon==null){
icon = Utilities.createIconThumbnail(activityInfo.loadIcon(manager), context);
}else{
icon = Utilities.createIconThumbnail(icon, context);
}
}
return icon;
} --------------------编程问答-------------------- 应该有相应的工具 或者按楼上的方法试试 --------------------编程问答-------------------- 把apk包按zip解开 然后找到AndroidManifest.xml <application android:icon="">这个就是你要找的icon的名字 然后去res/drawable/目录下去取出这个图片即可 --------------------编程问答-------------------- 可以参考ApplicationsAdapter.java
它里面已经有实现了 --------------------编程问答-------------------- 以上的解决方法都还有问题。
apk文件中的AndroidManifest.xml文件是经过轮换的,这个可以转换回来。
但转换成文本的AndroidManifest.xml文件,资源都转换为一程编码了,如下:
<application android:theme="@7F070001" android:label="@7F060004" android:icon="@7F020010" android:debuggable="true" >
而不是原来的的文件路径和文件名了。
这个又怎么转换呢?
我现在也是纠结在这里。 --------------------编程问答-------------------- 1.将aapt工具搬到你的服务器上,并添加至环境变量
2.直接调用命令“aapt dump badging <file_path.apk>”,会输出apk中一系列的信息,其中有楼主要的:
icon='res/drawable-mdpi/logo.png'
3.好了,知道应用程序图标是哪个了,那么,直接开Zip读取流,将其ZipEntry数据读出,即为APK图标。至于怎么读zip数据流,楼主加油啊。
唉,CSDN越来越沦落了... --------------------编程问答-------------------- 附:
1.php调用linux命令举例,用于执行aapt命令,当然楼主也要获取该命令的返回字符流
http://blog.526net.com/?p=1704
2.php读取zip
http://hi.baidu.com/wdguohui/blog/item/b9c2c8fb48ddbd254e4aea69.html
仅供参考 --------------------编程问答--------------------
这帖子还没结啊,几个月前我说过的,呵呵 --------------------编程问答-------------------- public static Drawable getApkIcon(Context context) {
PackageManager packageManager = context.getPackageManager();
return packageManager.getApplicationIcon(context.getApplicationInfo());
} --------------------编程问答-------------------- 我最近也在研究这这个问题,用java自己写了一个。说说自己的想法吧
先找到apktool工具,找到apktool.jar
将这个包导入自己的工程中。用法如下:
final String[] argss = new String[]{
"d",apkfile,targetDir
};
System.out.println(apkfile);
System.out.println(targetDir);
Main.main(argss);
argss是参数,这个参数可以参考apktool的参数说明.
反编译得到的文件都存放在targetDir中。
然后读取AndroidManifest.xml,一行一行读,直到读到包含"android:icon="这一行,就可以读出图标文件名。然后扫描targetDir目录,查找文件名为"icon.png"的文件。有可能找到多个文件,分别对应不同的分辨率。最后将这些文件复制到指定的目录。
注意,如果用winrar直接解压...AndroidManifest.XML文件貌似是乱码,所以要用apktool反编译才能读。
QQ 418666305 欢迎来交流这个问题....我觉得做这好这个自动反编译的工具还是有点意义的。。。 --------------------编程问答-------------------- 漏了一点
Main.main(argss);
这个导入的包是
import brut.apktool.Main;--------------------编程问答-------------------- 你所说的包是个怎样的包,若是一个apk扩展名的文件,得必须解包,有工具的(apktools)若是普通的压缩包或是源码码,右健就能解开,解开后放入测试目录下
就直接取drawable-hdpi/icon.png好了几个都一样的,只所有有几个drawable是因为满足不同分辨率的需要,可以不用管,你说的别的log.png之类的图片,那是程序内用图,例如一个按纽啦等,不用关心
写个test.php
is_dir("./packge/drawable-hdpi/icon.png"){
fopen//或是直接输出也行了只要解开的话
//echo "<img src=\"".$url."\">";
} --------------------编程问答-------------------- 楼上的兄弟,一般来说apk的图标是在AndroidManifest.xml中指定的:
<application android:icon="@drawable/logo_as" android:theme="@android:style/Theme.NoTitleBar" android:label="@string/app_title">
这是我的项目的manifest,图标就不是icon.png了,应用名也不是@string/app_name".
当然默认的图标是指定为"@drawable/icon" 的,但还是有可能碰到例外的情况的。。
--------------------编程问答-------------------- 直接解压文件,很难做到,必须依靠android提供的工具,不过我也忘记是哪个了
补充:移动开发 , Android