一、多模块一起打包
在实际项目开发中,一个项目会有多个模块,那么如何用一个命令来依次生成多个APK呢?
答案是通过gradlew命令进行批量打包
假如项目名称为AProject,模块分别有B、C、D,那么如果用命令单独打包分别执行以下命令,assembleRelease、assembleDebug和assembleAndroidTest分别是你实际场景需要打包的渠道,可自行编写
./gradlew :B:assembleRelease
./gradlew :C:assembleDebug
./gradlew :D:assembleAndroidTest
通过上面的命令分别打包,会在各模块的build目录生成apk
那么如何才能批量打包呢?还是用gradlew命令,整合以下即可:
合并以后命令:
./gradlew clean :B:assembleRelease :C:assembleRelease :D:assembleAndroidTest
结果依然会在各自模块的build目录生成各自的apk
二、将多个APK包拷贝到新生成的outputs目录下
在工程的./build.gradle文件中增加如下配置:
subprojects() {
def releaseTasks = project.getTasksByName("assembleRelease", false)
def debugTasks = project.getTasksByName("assembleDebug", false)
def androidTestTasks = project.getTasksByName("assembleAndroidTest", false)
copyApkFile(releaseTasks, project)
copyApkFile(debugTasks, project)
copyApkFile(androidTestTasks, project)
}
def copyApkFile(Set<Task> tasks, Project project) {
for (task in tasks) {
def dir = project.getProjectDir().getAbsolutePath()
println "assemble release dir = $dir"
def file = new File(dir + "/build/outputs/apk")
task.doLast {
if (file.exists()) {
copy {
println "copy file -------------------"
from dir + "/build/outputs/apk/androidTest/debug"
into rootProject.getRootDir().getAbsolutePath() + "/outputs/"
from dir + "/build/outputs/apk/debug"
into rootProject.getRootDir().getAbsolutePath() + "/outputs/"
from dir + "/build/outputs/apk/release"
into rootProject.getRootDir().getAbsolutePath() + "/outputs/"
}
}
}
}
}
配置以后,在AProject工程当执行打包命令 ./gradlew clean :B:assembleRelease :C:assembleRelease :D:assembleAndroidTest
会自动创建outputs目录,并将所有生成的APK拷贝到outputs目录中
三、shell脚本批量安装
创建install_app.sh文件,文件内容:
#! /bin/bash
#install_app.sh
echo '============= start install apk ============='
#apkDir="$WORKSPACE/outputs"
apkDir="/Users/xxx/outputs" //设置读取outupts目录
path=""
subDir=""
cd $apkDir
function readDir() {
cd $apkDir
filelist=$(ls $1)
for file in $filelist; do
# echo $file
installApk $file
done
}
function installApk() {
file=$1
extension="${file##*.}"
if [ "$extension" = "apk" ]; then
echo "install "$file" ..."
adb install $file
else
echo "Error:"$file "is not apk file."
fi
}
readDir $apkDir
四、批量卸载APK
1、准备要卸载的包名文件,创建txt文件:all_list.txt,内容如下:
com.aa.aaa
com.bb.bbb
注意:all_list文件名在脚本中会用到
2、创建 uninstall_pre.sh脚本文件,
脚本的编写思路是这样的:
1.先将需要卸载的应用的包名(Package_Name)写入到一个 all_list 文件中;
2.通过 adb shell pm list packages -3 命令取出测试机中已安装的所有第三方应用的包名并将其输出到 list 文件;
3.通过 for line in list 语句遍历 list 文件,取出每行字符串并截取出包名;
4.将截取出的包名和 all_list 文件中的内容进行对比,如果有相同或者包含的关系,则通过 adb uninstall 命令进行卸载;
5.被卸载的应用包名将输出在终端。
以下为编写好的脚本:
#!/bin/bash
# 第三方应用包名输出到list文件
adb shell pm list packages -3 >list.txt
# 等待3秒
sleep 3s
# 遍历手机里的第三方app的包名
for line in $(cat list.txt); do
# 将packagename截取出来
name=${line:8}
# 遍历要卸载的包名
for line2 in $(cat all_list.txt); do
# 判断是否包含
if [[ $name =~ $line2 ]]; then
# 删除包名结尾的\r
package_name=$(echo $name | tr '\r' ' ')
# 执行adb卸载命令
adb uninstall $package_name
# 打印已卸载的包名
echo $package_name"已卸载"
fi
done
done
四个步骤一气呵成,可以实现批量打包并将生成的多个APK通过gradle文件配置拷贝到outputs目录下,然后通过编写好的shell脚本来批量安装和批量卸载,完美!感谢朋友们支持~