Gradle命令行打出多个apk包+共用一套资源
项目需求
因为公司的客户比较多,但是很多代码是共用的,总不能一个客户一个工程吧,这就想到,利用一套资源分别打出不同的包。
Demo项目
工程结构
需求分析:现在有两个公司分别是:alipay 和 wechat,项目工程结构如下:
src\main\AndroidManifest.xml
src\main\java\cn\appblog\MultiApk\MainActivity.java
src\main\res\layout\activity_home.xml
src\main\res\layout\activity_main.xml
src\main\res\mipmap-hdpi\ic_launcher.png
src\main\res\mipmap-mdpi\ic_launcher.png
src\main\res\mipmap-xhdpi\ic_launcher.png
src\main\res\mipmap-xxhdpi\ic_launcher.png
src\main\res\mipmap-xxxhdpi\ic_launcher.png
src\main\res\values\colors.xml
src\main\res\values\strings.xml
src\main\res\values\styles.xml
src\alipay\java\cn\appblog\MultiApk\HomeActivity.java
src\alipay\res\mipmap-hdpi\ic_launcher.png
src\alipay\res\mipmap-mdpi\ic_launcher.png
src\alipay\res\mipmap-xhdpi\ic_launcher.png
src\alipay\res\mipmap-xxhdpi\ic_launcher.png
src\alipay\res\mipmap-xxxhdpi\ic_launcher.png
src\alipay\res\values\strings.xml
src\wechat\java\cn\appblog\MultiApk\HomeActivity.java
src\wechat\res\mipmap-hdpi\ic_launcher.png
src\wechat\res\mipmap-mdpi\ic_launcher.png
src\wechat\res\mipmap-xhdpi\ic_launcher.png
src\wechat\res\mipmap-xxhdpi\ic_launcher.png
src\wechat\res\mipmap-xxxhdpi\ic_launcher.png
src\wechat\res\values\strings.xml
项目中的main是基本资源,也就是两个公司共用的资源,在src目录下新建alipay 和 wechat目录,然后建立和mian目录下相同的文件夹,暂且不放资源(xml,string)
Flavor配置
在app.bulid中进行如下配置(android 闭包下配置):
//签名配置
signingConfigs {
alipay {
keyAlias 'alipay'
keyPassword '******'
storeFile file('D:\\keyStore\\alipay.jks')
storePassword '******'
}
wechat {
keyAlias 'wechat'
keyPassword '******'
storeFile file('D:\\keyStore\\wechat.jks')
storePassword '******'
}
}
//翻译成中文就是做出不同的口味
flavorDimensions "app"
productFlavors {
alipay {
dimension "app"
applicationId "cn.appblog.MultiApk.alipay"
versionCode 1
versionName "1.0"
signingConfig signingConfigs.alipay
}
wechat {
dimension "app"
applicationId "cn.appblog.MultiApk.wechat"
versionCode 1
versionName "1.0"
signingConfig signingConfigs.wechat
}
}
lintOptions {
abortOnError false
}
可以看到我,我们为两个公司分别打包成不同的口味,然后分别配置不同的keystore,然后我在Terminal输入一下命令进行打包:
> gradle build
然后查看build中生成的apk包:
业务分离及资源共享
1、实现不同样式的需求,在mian的MainActivity里面写一个点击跳转到HomeActivity界面
package cn.appblog.MultiApk;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void toHome(View view) {
Intent intent = new Intent(MainActivity.this, HomeActivity.class);
startActivity(intent);
}
}
2、分别在alipay 和wechat 相同包下创建 HomeActivity,分别写上不同的代码:
src\alipay\java\cn\appblog\MultiApk\HomeActivity.java
package cn.appblog.MultiApk;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
public class HomeActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
((TextView) findViewById(R.id.tv)).setText("支付宝公司");
}
}
src\wechat\java\cn\appblog\MultiApk\HomeActivity.java
package cn.appblog.MultiApk;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
public class HomeActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
((TextView) findViewById(R.id.tv)).setText("微信公司");
}
}
3、在alipay 和wechat 的values目录下,创建string文件,然后分别添加
src\main\res\values\strings.xml
<string name="app_name">支付宝</string>
src\wechat\res\values\strings.xml
<string name="app_name">微信</string>
4、分别在两个目录的res/mipmap中放入两个公司的不同logo图片,命名都是相同,和main目录下的图标logo命名同样,目的就是达到替换作用
配置app.build的sourceSets
//资源配置
sourceSets {
alipay {
java.srcDir('src/alipay/java')
res.srcDir('src/alipay/res')
}
wechat {
java.srcDir('src/wechat/java')
res.srcDir('src/wechat/res')
}
}
配置app.build的apk输出目录及文件名
在android 闭包下配置:
//打包后应用名称
applicationVariants.all { variant ->
variant.outputs.all { output ->
def outputFile = output.outputFile
def fileName
if (outputFile != null && outputFile.name.endsWith('.apk')) {
if (variant.buildType.name.equals('release')) {
fileName = "${variant.productFlavors[0].name}_${variant.productFlavors[0].versionName}_release.apk"
} else if (variant.buildType.name.equals('debug')) {
fileName = "${variant.productFlavors[0].name}_${variant.productFlavors[0].versionName}_debug.apk"
}
//output.outputFile = new File(outputFile.parent, fileName)
//println fileName
outputFileName = new File('../../', fileName)
println outputFileName
}
}
}
//将打包后的apk复制到某个地方
tasks.getByName("build")<<{
copy {
from "build/outputs/apk"
into "C:\\Users\\yezhou\\Desktop\\apks"
include '*.apk'
}
}
打包构建
> gradle build
输出文件:
alipay_1.0_debug.apk
alipay_1.0_release.apk
wechat_1.0_debug.apk
wechat_1.0_release.apk
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/02/26/gradle-command-line-print-multiple-apk-packages-and-share-a-set-of-resources/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论