Android 在同一台手机上同时安装 正式包 和 测试包
要想使同一项目的不同环境下的apk安装在同一台手机上,它们的包名即applicationID一定不同。
- 修改app名称以区别apk的环境
- 删除res->values->strings <string name="app_name">XXXX</string>
- 使用 productFlavors 为不同环境分配不同属性, 在 app 下的buildGradle 中 android { } 添加 productFlavors
productFlavors{ //开发环境 zhengshi { applicationId 'xxx.xxx.xxxx'//你的正式环境下的applicationID manifestPlaceholders = [ application_id :"xxx.xxx.xxxx"] buildConfigField 'String', 'BASE_URL', '"http://xxx.xxx.xxxx"' //正式环境下的网络请求基地址 resValue "string", "app_name", "XXX"//正式环境下app名称 } //测试环境 ceshi { applicationId 'xxx.xxx.xxxx'//你的测试环境下的applicationID manifestPlaceholders = [ application_id :"xxx.xxx.xxxx"] buildConfigField 'String', 'BASE_URL', '"http://xxx.xxx.xxxx'////测试环境下的网络请求基地址 resValue "string", "app_name", "XXX_测试"//正式环境下app名称 } }
- applicationId 'xxx.xxx.xxxx' , 即修改不同环境下的包名
- buildConfigField 'String', 'BASE_URL', '"http://xxx.xxx.xxxx"' ,动态设置app网络请求基地址,取值方式:
BuildConfig.BASE_URL - resValue "string", "app_name", "XXX",动态在strings资源文件下添加 app_name=XXX,在清单文件中
同样可以通过 android:label="@string/app_name" 获取名称。
- 如果你的项目中适配了 Android7.0 的fileProvider,一定要同时修改清单文件中 provider 下的android:authorities值
<provider android:name="android.support.v4.content.FileProvider" android:authorities="${application_id}.fileProvider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths_public" /> </provider>
- 如果两个app的provider 下的 android:authorities 值相同,那么它们也不能安装在同一台手机上。
- 使用applicationID作为authorities 的部分,因为applicationId不同那么 authorities 一定不同,
- 使用${application_id} 在打不同包的时候动态更换application_id的值。
- manifestPlaceholders = [ application_id :"xxx.xxx.xxxx"] 即修改清单文件中${application_id} 的值。
- 修改完毕后 build 项目。