APP开发过程中,有时会遇到一个需求:公司让开发两个客户端(比如买家端、卖家端),两个APP有很多共同点,开发者为了代码方便,于是在一个项目中开发,但,最终还是要打包成两个APP,就会遇到一些比较棘手的问题:
问题一、APP名字怎么办
1、将Manifest中application的label修改如下:
android:label="${app_name}" //占位写法,$是占位符,app_name是占位标签
2、在Module的build.gradle中增加下面代码:
productFlavors {
seller {
versionCode1
versionName"1.0.0"
applicationId"com.test.seller"
//app_name是上述label中的占位标签
//app_name_seller是res文件中的字符串资源id
manifestPlaceholders= [app_name:"@string/app_name_seller"]
}
buyer {
versionCode1
versionName"1.0.0"
applicationId"com.test.buyer"
//app_name是上述label中的占位标签
//app_name_buyer是res文件中的字符串资源id
manifestPlaceholders= [app_name:"@string/app_name_buyer"]
}
}
这样,打出来的release包就是两个不同名字。
问题二、APP包名怎么办
在“问题一”中,已经把该问题解决了,就是设置不同的applicationId。大家都知道,不同的applicationId代表不同的APP。
按照“问题一”配置后,开发过程中如果需要调试运行seller端,需要注释掉buyer{...}这段代码。反之调试buyer,注释掉sellerr{...}。
问题三、APP图标怎么办
方法类似“问题一”的换APP名字:
1、将Manifest中application的icon修改如下:
android:icon="${app_icon}"
2、在Module的build.gradle中增加下面代码(下面以seller端为例):
manifestPlaceholders= [app_icon:"@string/app_icon_seller"]
注:如果同时需替换APP名字和APP图标,那么manifestPlaceholders这么写:
manifestPlaceholders= [app_name:"@string/app_name_seller",app_icon:"@string/app_icon_seller"]
问题四、其他代码怎么办
有人会问,上面3个问题都是将Manifest中要用到的资源给提取出来,放在gradle中配置了。那,非Manifest中的资源怎么办?
比如:我想在项目中,不同端的登录,我只想用一个LoginActivity.java实现不同跳转;又比如:我想为不同端APP设置不同启动页图片,欢迎页图片等。
其实,这个问题我没有好办法。。。网上有说在与main文件夹同级的目录中,新建两个文件夹(seller、buyer),子文件夹结构和main都一样,只是,文件中资源采用同名不同内容的方法,这样编译打包时会根据"问题一"中2的配置来自动调用。但是,个人亲自尝试验证,此方法不可行。
所以,我只能采用了笨方法。因为两个项目的applicationId不同,所以我在需要区分APP端口的地方,用了如下的代码
if(getApplicationContext().getPackageName().equals("com.test.seller")) {
//TODO ...卖方
}else if(getApplicationContext().getPackageName().equals("com.test.buyer")) {
//TODO ...买方
}
好了,以上就是全部内容。谢谢!
文章末尾:如果大家看到我的文章,有关于问题 四 的好的解决方案,还麻烦评论里说一下,或发个链接。谢谢!