我知道问题不是自我解释,所以让我详细说明。
我有一个应用程序,我提供给我的客户,现在他们的工作相同,他们只有图标,图像,颜色和一些字符串参数的差异,如应用程序名称,Web服务的特定链接,用于检查更新的代码等。
我将它们放在不同的项目中,我将更改合并到一起并将这些更改合并到其余项目中,生成apks然后将它们上传到服务器进行更新。
我认为这从长远来看并不是非常有效,因为如果我最终得到100个,1000个客户更新某些东西的工作,这将是一个非常漫长而乏味的过程。
除此之外,一些客户可以要求为应用添加特定功能,以便考虑其他因素。
我想知道是否可以在不牺牲自定义的情况下使用1个项目:
我对android比较陌生,所以我不知道我是否缺少其他选项,所以这就是为什么我问你最好什么,在哪里学会实现它们,希望你能帮助我。 / p>
提前致谢
答案 0 :(得分:2)
我认为你正在寻找的是口味。你在Android文档中有很好的文档。见https://developer.android.com/studio/build/build-variants.html
考虑到这允许为每个变体定制许多不同的东西:资源,Gradle脚本中的变量,甚至是代码。
答案 1 :(得分:0)
适合您情况的最佳解决方案是让您的应用尽可能充满活力。您必须将所有内容放在服务器上,如图标,字符串,颜色代码,图像等。对于每个屏幕,您必须从服务器中提取所有这些内容并在应用中显示。 您必须创建管理面板,或者可以将数据直接更改为数据库。您必须为每个应用程序创建一个唯一的管理员用户,您将在其中上传数据,应用程序将获得具有用户ID的数据,这意味着您的应用程序也需要身份验证。
如果我没弄错的话,你愿意在以下链接中创建类似app的东西:
https://play.google.com/store/apps/details?id=com.xpous.myapps&hl=en
如果是这种情况,那么你需要做很多艰苦的工作。因为这是一个庞大的帝国建设。
答案 2 :(得分:0)
可能的解决方案之一是将项目划分为模块。
通过这种方式,您可以将核心功能集中到单个可重用(核心)模块中,然后将其作为依赖项包含在您为每个客户创建的每个新模块中。
这种方法维护起来也很棘手,但是通过一些gradle任务和良好的分支(使用CI / CD管道),这将是我的方法。
有点兴趣,但这样的事情可以让你前进:
你的app build.gradle文件中的
android {
compileSdkVersion 25
buildToolsVersion '25.0.2'
defaultConfig {
applicationId 'com.my.app'
minSdkVersion 16
targetSdkVersion 25
versionCode 1003
versionName '0.1.3'
}
signingConfigs {
release {
//Dummy
storeFile file('keystore/debug.keystore')
keyAlias 'androiddebugkey'
storePassword 'android'
keyPassword 'android'
}
debug {
storeFile file('keystore/debug.keystore')
keyAlias 'androiddebugkey'
storePassword 'android'
keyPassword 'android'
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField "String", "API_URL", '"http://my_api.com/"'
manifestPlaceholders = [appName: "Awesome App", appNameSuffix: ""]
}
debug {
debuggable true
buildConfigField "String", "API_URL", "http://my_api_staging.com/"'
manifestPlaceholders = [appName: "Awesome App", appNameSuffix: ".Development"]
applicationIdSuffix = ".debug"
versionNameSuffix " Debug"
}
}
}
<application
android:icon="@mipmap/ic_launcher"
android:label="${appName}${appNameSuffix}"
android:theme="@style/AppTheme">
在构建时,您的清单占位符将替换为gradle文件中提供的值。
您还可以访问您声明的字段。 例如,让我们采取API_URL。
您可以为您拥有的每个客户指定不同的API,然后使用它:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BuildConfig.API_URL)
.build();