当前位置:   article > 正文

经验:Android批量打包APK并批量安装_批量安装apk

批量安装apk

一、多模块一起打包

在实际项目开发中,一个项目会有多个模块,那么如何用一个命令来依次生成多个APK呢?

答案是通过gradlew命令进行批量打包

假如项目名称为AProject,模块分别有B、C、D,那么如果用命令单独打包分别执行以下命令,assembleRelease、assembleDebug和assembleAndroidTest分别是你实际场景需要打包的渠道,可自行编写

  1. ./gradlew :B:assembleRelease
  2. ./gradlew :C:assembleDebug
  3. ./gradlew :D:assembleAndroidTest

通过上面的命令分别打包,会在各模块的build目录生成apk

那么如何才能批量打包呢?还是用gradlew命令,整合以下即可:

合并以后命令:

./gradlew clean :B:assembleRelease :C:assembleRelease :D:assembleAndroidTest

结果依然会在各自模块的build目录生成各自的apk

二、将多个APK包拷贝到新生成的outputs目录下

在工程的./build.gradle文件中增加如下配置:

  1. subprojects() {
  2.  def releaseTasks = project.getTasksByName("assembleRelease", false)
  3. def debugTasks = project.getTasksByName("assembleDebug", false)
  4. def androidTestTasks = project.getTasksByName("assembleAndroidTest", false)
  5. copyApkFile(releaseTasks, project)
  6. copyApkFile(debugTasks, project)
  7. copyApkFile(androidTestTasks, project)
  8. }
  9. def copyApkFile(Set<Task> tasks, Project project) {
  10. for (task in tasks) {
  11. def dir = project.getProjectDir().getAbsolutePath()
  12. println "assemble release dir = $dir"
  13.  def file = new File(dir + "/build/outputs/apk")
  14. task.doLast {
  15.  if (file.exists()) {
  16. copy {
  17.  println "copy file -------------------"
  18.  from dir + "/build/outputs/apk/androidTest/debug"
  19.  into rootProject.getRootDir().getAbsolutePath() + "/outputs/"
  20.  from dir + "/build/outputs/apk/debug"
  21.  into rootProject.getRootDir().getAbsolutePath() + "/outputs/"
  22.  from dir + "/build/outputs/apk/release"
  23.  into rootProject.getRootDir().getAbsolutePath() + "/outputs/"
  24.  }
  25.  }
  26. }
  27.  }
  28. }

配置以后,在AProject工程当执行打包命令 ./gradlew clean :B:assembleRelease :C:assembleRelease :D:assembleAndroidTest

会自动创建outputs目录,并将所有生成的APK拷贝到outputs目录中

三、shell脚本批量安装

创建install_app.sh文件,文件内容:

  1. #! /bin/bash
  2. #install_app.sh
  3. echo '============= start install apk ============='
  4. #apkDir="$WORKSPACE/outputs"
  5. apkDir="/Users/xxx/outputs" //设置读取outupts目录
  6. path=""
  7. subDir=""
  8. cd $apkDir
  9. function readDir() {
  10. cd $apkDir
  11. filelist=$(ls $1)
  12. for file in $filelist; do
  13. # echo $file
  14. installApk $file
  15. done
  16. }
  17. function installApk() {
  18. file=$1
  19. extension="${file##*.}"
  20. if [ "$extension" = "apk" ]; then
  21. echo "install "$file" ..."
  22. adb install $file
  23. else
  24. echo "Error:"$file "is not apk file."
  25. fi
  26. }
  27. 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.被卸载的应用包名将输出在终端。

以下为编写好的脚本:

  1. #!/bin/bash
  2. # 第三方应用包名输出到list文件
  3. adb shell pm list packages -3 >list.txt
  4. # 等待3秒
  5. sleep 3s
  6. # 遍历手机里的第三方app的包名
  7. for line in $(cat list.txt); do
  8. # 将packagename截取出来
  9. name=${line:8}
  10. # 遍历要卸载的包名
  11. for line2 in $(cat all_list.txt); do
  12. # 判断是否包含
  13. if [[ $name =~ $line2 ]]; then
  14. # 删除包名结尾的\r
  15. package_name=$(echo $name | tr '\r' ' ')
  16. # 执行adb卸载命令
  17. adb uninstall $package_name
  18. # 打印已卸载的包名
  19. echo $package_name"已卸载"
  20. fi
  21. done
  22. done

四个步骤一气呵成,可以实现批量打包并将生成的多个APK通过gradle文件配置拷贝到outputs目录下,然后通过编写好的shell脚本来批量安装和批量卸载,完美!感谢朋友们支持~
 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/190360
推荐阅读
相关标签
  

闽ICP备14008679号