Gradle-----通过Gradle实现同一套代码开发生成不同的apk

来源:互联网 发布:ubuntu 配置dns 编辑:程序博客网 时间:2024/05/03 18:30

抛出问题:

 需求:

     在开发工作中,有时候经常会遇到一套代码要求开发出2个相似的应用 ,只需要改一些名称,改一下主题颜色,或者部分逻辑处理修改等等。 

解决办法:

  以前的解决办法: 

因为以前是eclipse项目,所以做法是项目复制一份,根据需要,去修改对应的颜色 应用名称等等,做起来很繁杂,而且出了bug,或者新的需求,每次一套代码改了 还要去改另一套代码。

现在的解决办法:

通过Gradle完成不同应用之间的代码或者颜色样式的的自动引用,简直牛叉到不行啊。 别问我怎么做的,看下面吧。


解决问题:

1, 之前看见公司有代码这样写,然后注释掉一个 就可以安装成没有注释掉的那个app

<pre name="code" class="java">apply plugin: 'com.android.application'android {    compileSdkVersion 24    buildToolsVersion "24.0.2"    defaultConfig {        applicationId "com.testgradle"        minSdkVersion 15        targetSdkVersion 24        versionCode 1        versionName "1.0"        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }    productFlavors{       gradleTestA{            applicationId "com.testgradle.testa"        }        gradleTestB{            applicationId "com.testgradle.testb"        }    }}dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {        exclude group: 'com.android.support', module: 'support-annotations'    })    compile 'com.android.support:appcompat-v7:24.2.1'    testCompile 'junit:junit:4.12'}

注意这一段
productFlavors{       gradleTestA{            applicationId "com.testgradle.testa"        }        gradleTestB{            applicationId "com.testgradle.testb"        }    }


gradle 代码如上,注意上面提取出来的这部分 通过productFlavors, gradleTestA 我称为应用A,  gradleTestB 我称为应用B ,可以看见应用A和应用B的applicationId是不一样的,这里应该就是区分了不同程序之间的包名,在Gradle 0.11.1版本之后,用applicationId 替代了 packageName 。
然后我们这里设置完了以后可以去验证,这一套代码是否可以安装2个app在手机上,为了区分,我们修改一下他的appName
注意:如果这里不注释掉第一个或者不在其他地方修改,默认安装的gradleTestA这个应用,你可以通过注释掉第一个然后 安装第二个应用,也可以通过Gradle命令的方式去安装你需要安装的那个程序。命令方式我也不知道大笑 ,但是也可以不用注释的方式,通过点一下就可以了,看下图
可以通过这里去切换你需要安装的版本,这里可以看见 自动会生成debug版本和Release版本,可以通过这里选择你想要安装的版本。还是挺方便的,Gradle命令我也还不是很熟,慢慢了解吧,大笑
现在我们为了区别不同应用程序,为每个程序添加不同的APPName,我们为不同的程序建立不同的strings.xml 修改里面的app_Name
这里也可以看到 可以建立在你指定的目录中,因为我们在Gradle中配置了productFlavors,所以这里可以分别为GradleTestA和GradleTestB创建strings.xml,
这里我们切换到了应用A
   
<resources>    <string name="app_name">TestGradleA</string></resources>


然后切换到B 


<?xml version="1.0" encoding="utf-8"?><resources>    <string name="app_name">TestGradleB</string></resources>


然后分别安装



可以发现都可以安装到手机上。 这里我们通过分别设置了app_name 所以对应修改了不同的应用程序名,所以颜色样式类的修改,只需要创建对应的文件即可,需要注意的是文件名或者应用的名称都应该保持一致。 


然后我们再看看代码之间是怎么区分的 一套代码,对应不同的处理

这里我添加一个这样一个类

public class ToashUtils {    public static void showToash(Context context) {        Toast.makeText(context, "xxxxx", Toast.LENGTH_SHORT).show();    }}

其中xxxxx 是不同程序之间弹出不同的提示,简单模拟下同一套代码不同程序之间不同的地方的代码处理

这里我A程序弹出的是 aaa,B程序弹出的是bbb 就不贴了 主要是看看目录结构




这里通过MainActivity里面调用ToashUtils.showToash() 方法,A里面你可以处理A的逻辑 ,B可以处理B的逻辑。 这里安装的时候Gradle会自动引用你说构建的类或者类。

这里因为我是切换到B应用,所以上图中A里面的ToashUtils.java 会出现感叹号,不影响程序正常安装。



到此为止就over了,主要是构建代码的时候也要保证你需要调用的类名和方法保持一致即可。然后看上图中保证src文件夹里面gradleTestA和gradleTestB里面的文件夹下面的包名和main文件夹里面的包名要一致,这样才能正常引用。需要注意。



参考贴:Gradle中文指南 和   如何通过Gradle实现一套代码开发不同特性的APK



项目下载:
https://github.com/zhangiqlin/TestGradle








0 0
原创粉丝点击