一、概述
要想修改android工程的默认包名,我们需要对eclipse安装目录下的android开发套件(即ADT,可直接解压得到其中的class文件)中的NewProjectPage.class进行轻微修改。这是一个java编译文件,理论上要对其修改需要先对其进行反编译,然后修改,再编译就能达到目的,但由于该class文件import了大量类,而这大量类还import了更多类,所以这种方法理论可行。
而这次我们要使用的是另一种方法,就是不进行反编译直接对.class文件的目标字节进行修改。
工具:JClassLib
JClassLib是一个java编译文件代码查看工具,并且还是一个字节码阅读器,可以通过该软件查看到class文件的方法表,和常量池,而我们要修改的 com.example. 就是常量池中的一个。
需要注意的是,JClassLib应用不能直接对class文件进行修改,只提供了可用于修改class字节的库函数,可以在JClassLib安装目录下找到。所以我们首先要使用JClassLib打开目标class文件,然后找到要修改的常量位置,代码中调用JClassLib库函数对相应位置常量进行修改,最后将该class文件放回原.Jar包中。
JClassLib文件请自行下载。
二、具体步骤
- 在eclipse安装目录下找到adt插件
C:\eclipse_mars\plugins\com.android.ide.eclipse.adt_(版本号).jar
由于可能会修改失败,所以强烈建议备份adt插件!
将adt插件解压到一文件夹中,并在解压后文件夹
…\com.android.ide.eclipse.adt_(版本号)\com\android\ide\eclipse\adt\internal\wizards\templates下找到NewProjectPage.class文件
安装JclassLib应用
使用JclassLib打开NewProjectPage.class
在Constant Pool中找到com.example. 常量,并记下序号 N,通常为18,后面代码中会用到N
使用eclipse创建一个Java Project,导入JclassLib工具库,该工具包位于JclassLib应用安装目录,编译时记得在Java Build Path - Order and Export - 下勾选引入的库文件,代码如下:
import java.io.DataInput; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import org.gjt.jclasslib.io.ClassFileWriter; import org.gjt.jclasslib.structures.CPInfo; import org.gjt.jclasslib.structures.ClassFile; import org.gjt.jclasslib.structures.constants.ConstantUtf8Info; publicclass ClassFileModify { publicstaticvoid main(String[]args)throws Exception { String filePath ="...<span style="color:#ff0000;">(文件路径)</span>\\NewProjectPage.class"; FileInputStream fileInput =new FileInputStream(filePath); DataInput dataInput =new DataInputStream(fileInput); ClassFile cf =new ClassFile(); cf.read(dataInput); CPInfo[] infos =cf.getConstantPool(); intcount =infos.length; for (inti = 0;i <count;i++) { if (infos[i] != null) { System.out.print(i); System.out.print(" = "); System.out.print(infos[i].getVerbose()); System.out.print(" = "); System.out.println(infos[i].getTagVerbose()); if(i == <span style="color:#ff0000;">N(前述序号)</span>){ ConstantUtf8Info uInfo = (ConstantUtf8Info)infos[i]; uInfo.setBytes("<span style="color:#ff0000;">com.joshua.(自定义默认包名)</span>".getBytes()); infos[i] =uInfo; } } } cf.setConstantPool(infos); fileInput.close(); File f=new File(filePath); ClassFileWriter.writeToFile(f,cf); } }
8. 将原com.android.ide.eclipse.adt_(版本号).jar文件用解压软件直接打开(注意:不用解压出来)在里面找到NewProjectPage.class所在文件夹,直接添加修改过的NewProjectPage.class,覆盖原文件。如果将adt文件解压然后再压缩文件内容可能会变动;
9. 完成,如果失败,反复尝试整个步骤。