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

一、多模块一起打包

在实际项目开发中,一个项目会有多个模块,那么如何用一个命令来依次生成多个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脚本来批量安装和批量卸载,完美!感谢朋友们支持~
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕容野野

需要你的肯定

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值