是这样的,我准备写一个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的图标

解决方案 »

  1.   

    你这个php是运行在手机上?通过java代码获得icon 然后放到临时路径下 你的php再去拿
      

  2.   

    完全是用PHP读apk 文件的 昨晚查了下资料。。发现可能实现不了吧 。。 
    apk是编译过的。。(具体真的还不是很懂)要想直接读 AndroidManifest.xml  ,,还得先反编译。。
    想单纯靠PHp实现还是不能的了。。
      

  3.   

    其实apk文件就是一个压缩包,可以直接用winrar解压的,跟java的jar一样,图标就在里面了,接下来就是正常文件操作了,但我不会php,所以我不知道怎么通过php获得。
      

  4.   


    学习~~
    后缀名改成 Rar  解压 试试~
      

  5.   

    将.apk文件修改为.zip,然后,解压缩,相信你会找到你所需要的东东。。
      

  6.   

    将.apk文件修改为.zip,然后,解压缩,
    \res\drawable-*dpi\icon.png 即图标
      

  7.   

    要在php程序里获取的话,也是先将文件名格式改为zip的,然后条用系统命令将其解压吧
      

  8.   

    AndroidManifest.xml <application android:icon="@drawable/app_sample_code" >
    app_sample_code这个就是图标文件
      

  9.   

    icon.png 这个名称不准确,不是所有的软件,都是用 icon.png比如google自己的软件都不用这个名称,2.2以前可以很好的读取,但是2.2有个改变,你可能需要研究android自有的二进制xml算法,从androidmanifest.xml提取icon的真正路径,然后显示了
      

  10.   

    楼上兄弟们说的都不错了,我整理一下吧:1. 最准确的方法是从AndroidManifest.xml里取这个信息,所以,你必须能读到它。
    2. 那第一步你得能解开.apk文件,这个因为apk就是zip,用PHP应该有相应函数可以解开的吧。
    3. 然后你得到编译后的manifest.xml,还得能反编译它,具体可参考apktool,它就可以反编译androidmanifest.xml文件,而且是开源的,你可以参考,这一步估计得自己研究自己动手了。这样就OK了。
      

  11.   

    豌豆夹就一个 html+js写出来的垃圾,拿到个毛啊。你还是看看aapt的源码吧,问题比较弱智
      

  12.   

    把.apk改成.zip然后就可以解压拿了,我干过..
      

  13.   

    这是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;
        }
      

  14.   

    把apk包按zip解开 然后找到AndroidManifest.xml <application android:icon="">这个就是你要找的icon的名字  然后去res/drawable/目录下去取出这个图片即可
      

  15.   

    可以参考ApplicationsAdapter.java
    它里面已经有实现了
      

  16.   

    以上的解决方法都还有问题。
    apk文件中的AndroidManifest.xml文件是经过轮换的,这个可以转换回来。
    但转换成文本的AndroidManifest.xml文件,资源都转换为一程编码了,如下:<application android:theme="@7F070001" android:label="@7F060004" android:icon="@7F020010" android:debuggable="true" >
    而不是原来的的文件路径和文件名了。
    这个又怎么转换呢?
    我现在也是纠结在这里。
      

  17.   

    1.将aapt工具搬到你的服务器上,并添加至环境变量
    2.直接调用命令“aapt dump badging <file_path.apk>”,会输出apk中一系列的信息,其中有楼主要的:
    icon='res/drawable-mdpi/logo.png'
    3.好了,知道应用程序图标是哪个了,那么,直接开Zip读取流,将其ZipEntry数据读出,即为APK图标。至于怎么读zip数据流,楼主加油啊。
    唉,CSDN越来越沦落了...
      

  18.   

    附:
    1.php调用linux命令举例,用于执行aapt命令,当然楼主也要获取该命令的返回字符流
    http://blog.526net.com/?p=1704
    2.php读取zip
    http://hi.baidu.com/wdguohui/blog/item/b9c2c8fb48ddbd254e4aea69.html仅供参考
      

  19.   

    public static Drawable getApkIcon(Context context) {
    PackageManager packageManager = context.getPackageManager();
    return packageManager.getApplicationIcon(context.getApplicationInfo());
    }
      

  20.   

    我最近也在研究这这个问题,用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 欢迎来交流这个问题....我觉得做这好这个自动反编译的工具还是有点意义的
      

  21.   

    漏了一点Main.main(argss);这个导入的包是import brut.apktool.Main;
      

  22.   

    你所说的包是个怎样的包,若是一个apk扩展名的文件,得必须解包,有工具的(apktools)若是普通的压缩包或是源码码,右健就能解开,解开后放入测试目录下
    就直接取drawable-hdpi/icon.png好了几个都一样的,只所有有几个drawable是因为满足不同分辨率的需要,可以不用管,你说的别的log.png之类的图片,那是程序内用图,例如一个按纽啦等,不用关心
    写个test.php
    is_dir("./packge/drawable-hdpi/icon.png"){
       fopen//或是直接输出也行了只要解开的话
       //echo "<img src=\"".$url."\">";
    }
      

  23.   

    楼上的兄弟,一般来说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" 的,但还是有可能碰到例外的情况的。。
      

  24.   

    直接解压文件,很难做到,必须依靠android提供的工具,不过我也忘记是哪个了