当前位置:编程学习 > wap >>

如何从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实现还是不能的了。。 --------------------编程问答--------------------
引用 3 楼 myismymxd 的回复:
完全是用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了。 --------------------编程问答--------------------
引用 12 楼 sharetop 的回复:
楼上兄弟们说的都不错了,我整理一下吧:

1. 最准确的方法是从AndroidManifest.xml里取这个信息,所以,你必须能读到它。
2. 那第一步你得能解开.apk文件,这个因为apk就是zip,用PHP应该有相应函数可以解开的吧。
3. 然后你得到编译后的manifest.xml,还得能反编译它,具体可参考apktool,它就可以反编译androidmanifest.xml文件,……

嗯!这种很有用。 --------------------编程问答-------------------- 这个有难度的。豌豆荚都没拿到哦 --------------------编程问答-------------------- 豌豆夹就一个 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

仅供参考 --------------------编程问答--------------------
引用 15 楼 drsmart 的回复:
豌豆夹就一个 html+js写出来的垃圾,拿到个毛啊。你还是看看aapt的源码吧,问题比较弱智




这帖子还没结啊,几个月前我说过的,呵呵 --------------------编程问答-------------------- 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
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,