赞
踩
在实际项目开发中,一个项目会有多个模块,那么如何用一个命令来依次生成多个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
在工程的./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目录中
创建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

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脚本来批量安装和批量卸载,完美!感谢朋友们支持~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。