今天在公司上班,因项目需求需要,同一套源码只是修改软件图标,以及服务器访问ip,端口等基础配置,编译出不同的定制版本。因为apk的唯一性是由工程包名来标记的,包名相同的apk不能够在同一台设备上安装,这就造成了项目演示不便,那么同事就抛出这个问题给我,并且也给我提供了几个方案:
方案一:修改包名,这无疑是最直接的,但却是工作量最大的,改完AndroidManifest.xml下package="包名"配置,还要修改整个项目的类导包,以及R.java的重新生成。
结果:我没有尝试,直接否定了。
方案二:在同一工程中建两个包,一个是主项目包,另一个是定制部分,AndroidManifest.xml下用定制包命名,但经考虑这个方案只解决了普通类的导包问题,并不能解决R.jave的路径,而R却是大量的在工程中引用的类。
结果:相比方案一进步不大,也否定了。
方案三:建立两个工程,一个主工程,保持原来的代码结构,改成library工程,通过工程依赖来实现项目关联。
具体实施:Base工程为非定制工程,改为library工程(只在eclipse中有用),新建A工程添加依赖Base工程,去掉所有res及其子目录下的文件(目的是为了防止定制工程中的资源文件生成的R.java与Base工程不同),将所有需要定制的资源放到Base工程内引用。然后将Base工程的AndroidManifest.xml复制一份到A工程中,修改package为A工程包名,然后将Base工程中用到的类库libs贴到A工程下并且添加buildpath,新建入口Activity使入口Activity在完成定制工作后(比如修改Base工程中的服务器配置),跳转到Base工程的入口Activity。大功告成,成功在同一台设备安装运行多个相同源码apk。