在android环境下,可以通过反射机制获取。
在PC环境下就麻烦了,一般是手动解压apk,在res/drawable中可以找到图标文件.反编译的话,用apktool比较多。
这里是自动调用apktool中反编译的代码,然后读取androidManifest.xml和strings.xml来获取apk应用的名称和图标.
...上代码吧,抛砖引玉,小弟初学不久,各位多批评指正。
注意要有apktool.jar,这个下载一个apktool工具就找到了。import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;import brut.androlib.AndrolibException;
import brut.apktool.Main;
public class Unzip {
public static void main(String[] args){
File   directory =   new   File(".");   
//获取当前工作目录
String currentPath = null;
try {
currentPath = directory.getCanonicalPath();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// String[] apkFilearr = searchApk("d:\\apkssdf", ".apk");
String[] apkFilearr = searchApk(currentPath, ".apk");
for(String file:apkFilearr){
System.out.println(file);
getIcons(file);
}
// String f = "d:\\apks\\digua.apk";
// getIcons(f);
}

public static String[] getIconfile(String targetDir){
String manifestFilepath = targetDir+""+File.separator+"AndroidManifest.xml";
String keyLine = "android:icon=";
String nameLine = "android:label";
String iconFilePath[] = new String[2];
try{
File file = new File(manifestFilepath);
// BufferedInputStream bin = new BufferedInputStream(new FileInputStream(appDatafilePath));
// byte[] buff = new byte[(int)file.length()];

InputStreamReader read = new InputStreamReader(new FileInputStream(file),"UTF-8"); 
String fileContent = ""; 
BufferedReader reader = new BufferedReader(read);
String lineContent;
while ((lineContent = reader.readLine()) != null) {
fileContent = fileContent+lineContent+"\n";
}   
String[] lines = fileContent.split("\n");    
System.out.println("lines.length   "+lines.length);
// bin.read(buff);
OutputStreamWriter fout = new OutputStreamWriter(new FileOutputStream(file),"UTF-8");
// String str = new String(buff);
// String[] lines = str.split("\n");
for(String line : lines){
String line_changed = line;
if(line.contains(keyLine)){
System.out.println(line);
int fi = line.indexOf("drawable");
int end = line.indexOf("\"",fi);
while(end<fi){
end = line.indexOf("\"", end);
}
System.out.println(fi);
System.out.println(end);
iconFilePath[0] = line.substring(fi+9,end)+".png";
System.out.println(iconFilePath[0]);
}
if(line.contains(nameLine)){
System.out.println(line);
int fi = line.indexOf("string");
int end = line.indexOf("\"",fi);
while(end<fi){
end = line.indexOf("\"", end);
}
System.out.println(fi);
System.out.println(end);
iconFilePath[1] = line.substring(fi+7,end);
System.out.println(iconFilePath[1]);
}
fout.write(line_changed+"\n");
}
fout.flush();
fout.close();
reader.close();
// bin.close();
}catch(FileNotFoundException ex){
ex.printStackTrace();
}catch(IOException ioe){
ioe.printStackTrace();
}
String stringsPath = targetDir+""+File.separator+"res"+File.separator+"values"+File.separator+"strings.xml";
try{
File file = new File(stringsPath);
InputStreamReader read = new InputStreamReader(new FileInputStream(file),"UTF-8"); 
String fileContent = ""; 
BufferedReader reader = new BufferedReader(read);
String lineContent;
while ((lineContent = reader.readLine()) != null) {
fileContent = fileContent+lineContent+"\n";
}   
String[] lines = fileContent.split("\n");    
System.out.println("lines.length   "+lines.length);
OutputStreamWriter fout = new OutputStreamWriter(new FileOutputStream(file),"UTF-8");
for(String line : lines){
String line_changed = line;
if(line.contains(iconFilePath[1])){
System.out.println(line);
int fi = line.indexOf(">");
int end = line.indexOf("<",fi);
System.out.println(fi);
System.out.println(end);
iconFilePath[1] = line.substring(fi+1,end);
System.out.println(iconFilePath[1]);
break;
}
fout.write(line_changed+"\n");
}
fout.flush();
fout.close();
reader.close();
// bin.close();
}catch(FileNotFoundException ex){
ex.printStackTrace();
}catch(IOException ioe){
ioe.printStackTrace();
}
return iconFilePath;
}

public static String[] getfilepaths(String dir, String searchname){
String[] results = findFileInDir(dir, searchname).toString().split(",");
return results;
} public static StringBuffer findFileInDir(String dir, String searchname) {
StringBuffer temp = new StringBuffer();
File root = new File(dir);
File[] filesOrDirs = root.listFiles();
if (filesOrDirs == null)
return temp;

String[] result = new String[filesOrDirs.length];
for (int i = 0; i < filesOrDirs.length; i++) {

if (filesOrDirs[i].isDirectory()) {
StringBuffer t = findFileInDir(filesOrDirs[i].getAbsolutePath(), searchname);
if(t!=null&&!t.equals(""))
temp.append(t);
} else {
result[i] = filesOrDirs[i].getName();
if(result[i].equals(searchname)){
temp.append(filesOrDirs[i]);
temp.append(",");
}
}
}
return temp;
}
  private static boolean deleteDir(File dir) {         if (dir.isDirectory()) {
            String[] children = dir.list();
            for (int i=0; i<children.length; i++) {
                boolean success = deleteDir(new File(dir, children[i]));
                if (!success) {
                    return false;
                }
            }
        }         // The directory is now empty so now it can be smoked
        return dir.delete();
    }
  public static void getIcons(final String apkfile){
  
  try {
  File apkFile = new File(apkfile);
  String fileName = apkFile.getName();
  String path = apkFile.getParent();
  final String targetDir = path+File.separator+fileName.substring(0,fileName.lastIndexOf("."))+"Dir";
  final String iconDir = path+File.separator+"iconsDir";
  File dir = new File(targetDir);
  File iconsdir = new File(iconDir);
  if(dir.exists()){
  deleteDir(dir);
  }
  if(!iconsdir.exists()){
  iconsdir.mkdir();
  }
  final String[] argss = new String[]{
  "f",apkfile,targetDir
  };
  System.out.println(apkfile);
  System.out.println(targetDir);
  long time1 = System.currentTimeMillis();
  Main.main(argss);
  String result[] = getIconfile(targetDir);
  String[] iconfilepath = getfilepaths(targetDir,result[0]);
  File iconDirfile = new File(iconDir+File.separator+result[1]);
  if(!iconDirfile.exists()){
  boolean b = iconDirfile.mkdir();
  System.out.println("创建目录   "+b);
  }
  AutoCopyFiles copyFiles = new AutoCopyFiles();
  for(int i=0;i<iconfilepath.length;i++){
  copyFiles.copyFile(iconfilepath[i], iconDirfile.getAbsolutePath()+File.separator+i+"_"+result[0]);
  }
//   deleteDir(new File(targetDir));
  long time2 = System.currentTimeMillis();
  System.out.println("反编译提取图标耗时     "+(time2-time1));
  } catch (AndrolibException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  } catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
  }
  
// 扫描.APK文件
public static String[] searchApk(String dir, String suf) {
StringBuffer sb = sApk(dir, suf);
if(sb.length()==0)
return null;
String[] result = sb.toString().split(",");
return result;
} public static StringBuffer sApk(String dir, String suf) {
StringBuffer temp = new StringBuffer();
File root = new File(dir);
File[] filesOrDirs = root.listFiles();
if (filesOrDirs == null)
return temp;

String[] result = new String[filesOrDirs.length];
for (int i = 0; i < filesOrDirs.length; i++) {

//add by Dengjy @2011-10-26, 把sina/weibo目录从扫描路径中去掉(因为里面有太多的临时文件)
if (filesOrDirs[i].isDirectory()) {
 StringBuffer t =sApk(filesOrDirs[i].getAbsolutePath(), suf);
// serachApk(filesOrDirs[i].getAbsolutePath()).append(",");
// StringBuffer k = (t!=null)? ((!t.equals(""))?t.append(","):null): null;
 if(t!=null&&!t.equals(""))
temp.append(t);
} else {
result[i] = filesOrDirs[i].getName();
if((suf == null)&&(!result[i].equals(""))){
temp.append(filesOrDirs[i].getAbsolutePath()).append(",");
}else if (result[i].endsWith(suf)) { // 取与suf匹配后缀的文件名
temp.append(filesOrDirs[i].getAbsolutePath()).append(",");
}
}
}
if(temp.length()>1&&temp.charAt(temp.length()-2)==','&&temp.charAt(temp.length()-1)==','){
// LogUtils.e(AppData.tag, "TEMP"+ temp.charAt(temp.length()-2)+"         "+ temp.charAt(temp.length()-1));
temp.delete(temp.length()-2, temp.length()-1);
}
return temp;
}
}

解决方案 »

  1.   

    接楼上,下面这个类是在网上找到的...关于文件和目录的复制等操作import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.io.Reader;
    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;public class AutoCopyFiles { /**
     * 新建目录
     * 
     * @param folderPath
     *            String 如 c:/fqf
     * @return boolean
     */
    public void newFolder(String folderPath) {
    try {
    String filePath = folderPath;
    filePath = filePath.toString();
    java.io.File myFilePath = new java.io.File(filePath);
    if (!myFilePath.exists()) {
    myFilePath.mkdir();
    }
    } catch (Exception e) {
    System.out.println("新建目录操作出错");
    e.printStackTrace();
    }
    } /**
     * 新建文件
     * 
     * @param filePathAndName
     *            String 文件路径及名称 如c:/fqf.txt
     * @param fileContent
     *            String 文件内容
     * @return boolean
     */
    public void newFile(String filePathAndName, String fileContent) { try {
    String filePath = filePathAndName;
    filePath = filePath.toString();
    File myFilePath = new File(filePath);
    if (!myFilePath.exists()) {
    myFilePath.createNewFile();
    }
    FileWriter resultFile = new FileWriter(myFilePath);
    PrintWriter myFile = new PrintWriter(resultFile);
    String strContent = fileContent;
    myFile.println(strContent);
    resultFile.close(); } catch (Exception e) {
    System.out.println("新建文件操作出错");
    e.printStackTrace(); } } /**
     * 删除文件
     * 
     * @param filePathAndName
     *            String 文件路径及名称 如c:/fqf.txt
     * @param fileContent
     *            String
     * @return boolean
     */
    public void delFile(String filePathAndName) {
    try {
    String filePath = filePathAndName;
    filePath = filePath.toString();
    java.io.File myDelFile = new java.io.File(filePath);
    myDelFile.delete(); } catch (Exception e) {
    System.out.println("删除文件操作出错");
    e.printStackTrace(); } } /**
     * 删除文件夹
     * 
     * @param filePathAndName
     *            String 文件夹路径及名称 如c:/fqf
     * @param fileContent
     *            String
     * @return boolean
     */
    public void delFolder(String folderPath) {
    try {
    delAllFile(folderPath); // 删除完里面所有内容
    String filePath = folderPath;
    filePath = filePath.toString();
    java.io.File myFilePath = new java.io.File(filePath);
    myFilePath.delete(); // 删除空文件夹 } catch (Exception e) {
    System.out.println("删除文件夹操作出错");
    e.printStackTrace(); } } /**
     * 删除文件夹里面的所有文件
     * 
     * @param path
     *            String 文件夹路径 如 c:/fqf
     */
    public void delAllFile(String path) {
    File file = new File(path);
    if (!file.exists()) {
    return;
    }
    if (!file.isDirectory()) {
    return;
    }
    String[] tempList = file.list();
    File temp = null;
    for (int i = 0; i < tempList.length; i++) {
    if (path.endsWith(File.separator)) {
    temp = new File(path + tempList[i]);
    } else {
    temp = new File(path + File.separator + tempList[i]);
    }
    if (temp.isFile()) {
    temp.delete();
    }
    if (temp.isDirectory()) {
    delAllFile(path + "/" + tempList[i]);// 先删除文件夹里面的文件
    delFolder(path + "/" + tempList[i]);// 再删除空文件夹
    }
    }
    } /**
     * 复制单个文件
     * 
     * @param oldPath
     *            String 原文件路径 如:c:/fqf.txt
     * @param newPath
     *            String 复制后路径 如:f:/fqf.txt
     * @return boolean
     */
    public void copyFile(String oldPath, String newPath) {
    try {
    int bytesum = 0;
    int byteread = 0;
    File oldfile = new File(oldPath);
    if (oldfile.exists()) { // 文件存在时
    InputStream inStream = new FileInputStream(oldPath); // 读入原文件
    FileOutputStream fs = new FileOutputStream(newPath);
    byte[] buffer = new byte[1444];
    while ((byteread = inStream.read(buffer)) != -1) {
    bytesum += byteread; // 字节数 文件大小
    System.out.println(bytesum);
    fs.write(buffer, 0, byteread);
    }
    inStream.close();
    }
    } catch (Exception e) {
    System.out.println("复制单个文件操作出错");
    e.printStackTrace(); } } /**
     * 复制整个文件夹内容
     * 
     * @param oldPath
     *            String 原文件路径 如:c:/fqf
     * @param newPath
     *            String 复制后路径 如:f:/fqf/ff
     * @return boolean
     */
    public void copyFolder(String oldPath, String newPath) { try {
    (new File(newPath)).mkdirs(); // 如果文件夹不存在 则建立新文件夹
    File a = new File(oldPath);
    String[] file = a.list();
    File temp = null;
    for (int i = 0; i < file.length; i++) {
    if (oldPath.endsWith(File.separator)) {
    temp = new File(oldPath + file[i]);
    } else {
    temp = new File(oldPath + File.separator + file[i]);
    } if (temp.isFile()) {
    FileInputStream input = new FileInputStream(temp);
    FileOutputStream output = new FileOutputStream(newPath
    + "/" + (temp.getName()).toString());
    byte[] b = new byte[1024 * 5];
    int len;
    while ((len = input.read(b)) != -1) {
    output.write(b, 0, len);
    }
    output.flush();
    output.close();
    input.close();
    }
    if (temp.isDirectory()) {// 如果是子文件夹
    copyFolder(oldPath + "/" + file[i], newPath + "/" + file[i]);
    }
    }
    } catch (Exception e) {
    System.out.println("复制整个文件夹内容操作出错");
    e.printStackTrace(); } } /**
     * 移动文件到指定目录
     * 
     * @param oldPath
     *            String 如:c:/fqf.txt
     * @param newPath
     *            String 如:d:/fqf.txt
     */
    public void moveFile(String oldPath, String newPath) {
    copyFile(oldPath, newPath);
    delFile(oldPath); } /**
     * 移动文件到指定目录
     * 
     * @param oldPath
     *            String 如:c:/fqf.txt
     * @param newPath
     *            String 如:d:/fqf.txt
     */
    public void moveFolder(String oldPath, String newPath) {
    copyFolder(oldPath, newPath);
    delFolder(oldPath); }
    /**
     * 以字符为单位读取文件,常用于读文本,数字等类型的文件
     */
    public static void readFileByChars(String fileName) {
    File file = new File(fileName);
    Reader reader = null;
    try {
    System.out.println("以字符为单位读取文件内容,一次读一个字节:");
    // 一次读一个字符
    reader = new InputStreamReader(new FileInputStream(file));
    int tempchar;
    while ((tempchar = reader.read()) != -1) {
    // 对于windows下,\r\n这两个字符在一起时,表示一个换行。
    // 但如果这两个字符分开显示时,会换两次行。
    // 因此,屏蔽掉\r,或者屏蔽\n。否则,将会多出很多空行。
    if (((char) tempchar) != '\r') {
    System.out.print((char) tempchar);
    }
    }
    reader.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    try {
    System.out.println("以字符为单位读取文件内容,一次读多个字节:");
    // 一次读多个字符
    char[] tempchars = new char[30];
    int charread = 0;
    reader = new InputStreamReader(new FileInputStream(fileName));
    // 读入多个字符到字符数组中,charread为一次读取字符数
    while ((charread = reader.read(tempchars)) != -1) {
    // 同样屏蔽掉\r不显示
    if ((charread == tempchars.length)
    && (tempchars[tempchars.length - 1] != '\r')) {
    System.out.print(tempchars);
    } else {
    for (int i = 0; i < charread; i++) {
    if (tempchars[i] == '\r') {
    continue;
    } else {
    System.out.print(tempchars[i]);
    }
    }
    }
    } } catch (Exception e1) {
    e1.printStackTrace();
    } finally {
    if (reader != null) {
    try {
    reader.close();
    } catch (IOException e1) {}
    }
    }
    } /**
     * 以行为单位读取文件,常用于读面向行的格式化文件
     */
    public static StringBuffer readFileByLines(String fileName) {
    File file = new File(fileName);
    StringBuffer sb = new StringBuffer();
    BufferedReader reader = null;
    try {
    System.out.println("以行为单位读取文件内容,一次读一整行:");
    reader = new BufferedReader(new FileReader(file));
    String tempString = null;
    int line = 1;
    // 一次读入一行,直到读入null为文件结束
    while ((tempString = reader.readLine()) != null) {
    // 显示行号
    sb.append(tempString);
    line++;
    }
    reader.close();
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    if (reader != null) {
    try {
    reader.close();
    } catch (IOException e1) {}
    }
    }
    return sb;
    } /**
     * 
     * @param str
     * @return 编码
     */
    public static String encode(String str) {
    if (null == str)
    return null;
    if ("".equals(str))
    return "";
    try {
    return URLEncoder.encode(str, "UTF-8");
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    }
    return null;
    }
    }