是否可以在同一个apk中集成不同的参数/样式/图像/代码?

时间:2017-05-09 21:24:42

标签: java android apk updates

我知道问题不是自我解释,所以让我详细说明。

我有一个应用程序,我提供给我的客户,现在他们的工作相同,他们只有图标,图像,颜色和一些字符串参数的差异,如应用程序名称,Web服务的特定链接,用于检查更新的代码等。

我将它们放在不同的项目中,我将更改合并到一起并将这些更改合并到其余项目中,生成apks然后将它们上传到服务器进行更新。

我认为这从长远来看并不是非常有效,因为如果我最终得到100个,1000个客户更新某些东西的工作,这将是一个非常漫长而乏味的过程。

除此之外,一些客户可以要求为应用添加特定功能,以便考虑其他因素。

我想知道是否可以在不牺牲自定义的情况下使用1个项目:

  • 我在考虑在用户第一次打开应用程序并登录时从数据库中检索特定参数,但我认为这对于所有媒体资源都不够,包括自定义图标
  • 关于我考虑下载它们并替换默认文件的特定功能,但我认为甚至不可能
  • 所以我考虑将所有脚本保留在代码中,但这可能是不安全的,考虑到大多数用户不会使用这些脚本而浪费空间。

我对android比较陌生,所以我不知道我是否缺少其他选项,所以这就是为什么我问你最好什么,在哪里学会实现它们,希望你能帮助我。 / p>

提前致谢

3 个答案:

答案 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();