lyccsu 2015-05-15
参见:http://xhmj12.blogspot.com/2015/05/android-appappappgoogle-playgoogle_15.html
在做Android app开发时,经常遇到需要修改app包名的情况。例如,你发布了一个app到google play市场,由于其他不符合google play政策很被下架,而你又想重新上架你的app,那么你就不得不更换你的app包名。或者测试时也经常遇到这样的需求。那么如何在现有app的代码继承上快速修改你的app包名呢?
我们可能标准的做法是:假设我们是eclipse等IDE开发环境,那么,我们可以点击到主包名上,然后右键——> "refactor" ——> "rename" ——> 在弹出的对话框修改包名,同时勾选"Upate references"或者"Renanme subpackages"。这样IDE环境就会帮你修改完成app包名,同时manifest.xml文件里的等包名相关的地方也改动过来了。而代码中写死的包名字符串的地方需要你手动改动下。这样你就完成了修改包名。
这样做,可能有几个缺点:
1.比较麻烦;
2.有时需要手动更改硬编码到代码中的包名字符串;
3.再改回来比较麻烦,因为需要改动源代码的包名;
4.当依赖工程较多时,这种改动的麻烦就更显麻烦。
有没有更快更好更便捷的方法呢?只让我们改动标识应用的包名,而不改变原来程序源代码的包名呢?
有,首先,我们要改变一个固有思维:包名唯一标识一个app,但这个包名指的是manifest.xml的<manifest>根标签下的package = "com.xxx.xxx";和程序源代码的包名没有任何关系,可以和组织程序源代码的包名相同也可以不同。但一般相同。
有了上面的认识,我们就可以轻松的修改一个app的包名了。只需修改manifest.xml的<manifest>根标签下的package = "com.xxx.xxx"的package属性就可以了,而不需要修改src源代码文件夹下的类的包了。这是gen中生成的R文件的包名就修改了,这是就需要修改类里引用到R文件的import语句。然后修改mainifest文件里的组件(如<Activity>)声明的"name"属性里的相对路径声明的地方改成绝对路径声明,然后这样你的应用就相当于另外一个app了。
这样改动回来也很方便,修改回manifest.xml的<manifest>根标签下的package = "com.xxx.xxx"的package属性,然后修改工程里的import语句的R文件引用错误就ok了。
还有,有时我们可能遇到这样的争论:在manifest文件里声明activity等组件时,是配置成绝对路径(全引用包名)还是相对路径好?这方面可能给我们一点答案。我们知道声明成相对路径需要src/文件下类的包名和manifest里根标签下的package属性值一致。