是这样的,我准备写一个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的图标
解决方案 »
- 一个头疼了一周的问题,webview 监听最后一次页面加载结束
- . ./build/envsetup.sh执行问题
- 音乐播放器切歌什么的他们是怎么做到监听传感器同时还省电的?
- android 开发 网络IP 转发的问题
- 跪求 google 街景 实现技术!!!!!OpenGL ES? 3D?
- Android应用程序能否监听到手机有i/o数据传输与传输完毕的事件
- SOS!编程高手们.急救啊~~
- android 监控网络 ,有网上传数据,没有网络暂存本地。
- Andriod market PC端困惑吗
- 开机后桌面widget显示太慢
- 关于onListItemClick问题
- 基于Rexsee实现Android平台的推送与监听,附原生代码
apk是编译过的。。(具体真的还不是很懂)要想直接读 AndroidManifest.xml ,,还得先反编译。。
想单纯靠PHp实现还是不能的了。。
学习~~
后缀名改成 Rar 解压 试试~
\res\drawable-*dpi\icon.png 即图标
app_sample_code这个就是图标文件
2. 那第一步你得能解开.apk文件,这个因为apk就是zip,用PHP应该有相应函数可以解开的吧。
3. 然后你得到编译后的manifest.xml,还得能反编译它,具体可参考apktool,它就可以反编译androidmanifest.xml文件,而且是开源的,你可以参考,这一步估计得自己研究自己动手了。这样就OK了。
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文件中的AndroidManifest.xml文件是经过轮换的,这个可以转换回来。
但转换成文本的AndroidManifest.xml文件,资源都转换为一程编码了,如下:<application android:theme="@7F070001" android:label="@7F060004" android:icon="@7F020010" android:debuggable="true" >
而不是原来的的文件路径和文件名了。
这个又怎么转换呢?
我现在也是纠结在这里。
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仅供参考
PackageManager packageManager = context.getPackageManager();
return packageManager.getApplicationIcon(context.getApplicationInfo());
}
先找到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 欢迎来交流这个问题....我觉得做这好这个自动反编译的工具还是有点意义的
就直接取drawable-hdpi/icon.png好了几个都一样的,只所有有几个drawable是因为满足不同分辨率的需要,可以不用管,你说的别的log.png之类的图片,那是程序内用图,例如一个按纽啦等,不用关心
写个test.php
is_dir("./packge/drawable-hdpi/icon.png"){
fopen//或是直接输出也行了只要解开的话
//echo "<img src=\"".$url."\">";
}
<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" 的,但还是有可能碰到例外的情况的。。