通过ADB实现Android通知

7
我正在编写一个shell脚本,可以使用终端在连接到电脑上的所有Android手机上并行安装.apk文件。在我们公司,我们需要在许多设备上进行测试,因此这使得安装部分更快。
问题:我正在寻找一种快速识别哪些手机已经通过某种反馈/通知安装了.apk文件的方法。理想情况下,您应该能够通过观察手机(例如发出声音或屏幕闪烁)或仅仅通过解锁设备(例如新安装的应用程序已被打开)来看到已接收到.apk文件的手机。
有没有任何想法可以实现这两个方面?我已经了解了一些关于启动应用程序的资料,但似乎不能在只有.apk文件的情况下执行(您还需要指定活动...)。
非常感谢您的任何想法!谢谢!
5个回答

6

我将自己的解决方案分享给你!

我正在使用:

aapt dump badging

我曾认为这只会输出软件包名称,但实际上它会输出更多有用的信息。其中一行输出的是应用程序的启动活动。我可以使用grep来定位这一行,然后使用cut命令剪切出启动活动:

aapt dump badging $1 | grep launchable | cut -d "'" -f 2

那么,如果您知道应用程序的某个活动,有一条命令可以让您启动该应用程序。添加此行将启动使用上述命令检索到的活动。

adb -s $deviceID shell am start -a android.intent.action.MAIN -n $packageName/$launchableActivity

我在安装命令后面的for循环中添加了这行代码。现在应用程序安装完成后,脚本会尝试自动启动它。非常方便!感谢所有的帮助!:D

3
使用包管理器检查APK是否已安装:
pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [FILTER]

pm list packages: prints all packages, optionally only
  those whose package name contains the text in FILTER.  Options:
    -f: see their associated file.
    -d: filter to only show disbled packages.
    -e: filter to only show enabled packages.
    -s: filter to only show system packages.
    -3: filter to only show third party packages.
    -i: see the installer for the packages.
    -u: also include uninstalled packages.

例如
$ adb shell pm list packages com.example.mypkg

1

您可以使用带有参数的 'adb shell am start' 命令来启动新安装的包。

如果担心旧版本会导致混淆,可以在安装新版本之前使用 adb uninstall 卸载旧版本,或者最好让闪屏活动显示版本信息。

实际上,您可以使用 am start 命令来启动一个未知于启动器的活动,因此您可以使用它直接启动“关于”活动,以显示当前版本。这是您选择是否在应用程序的正常过程中提供该功能,或仅在闪屏时使用一次。

您还应该能够解析 adb install 命令的输出 - 您需要查看它是否将错误/成功发送到 stderr 或 stdout。

更新:以下是如何创建一个活动,您可以使用它来打开屏幕并显示消息,例如:

adb shell 'am start -n com.example.testreport/.ReportActivity -e result PASS'

这段代码是从早期 Android 版本的内置闹钟中大量借鉴而来,它需要:

<uses-permission android:name="android.permission.WAKE_LOCK"/>

在清单文件中

package com.example.testreport;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.PowerManager;
import android.util.Log;
import android.view.Gravity;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.TextView;
public class ReportActivity extends Activity {
    PowerManager.WakeLock sScreenWakeLock;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         requestWindowFeature(android.view.Window.FEATURE_NO_TITLE);
         getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    }
    protected void onStart() {
        super.onStart();

        if (sScreenWakeLock == null) {
            PowerManager pm =
                    (PowerManager) getSystemService(Context.POWER_SERVICE);
            sScreenWakeLock = pm.newWakeLock(
                    PowerManager.FULL_WAKE_LOCK |
                    PowerManager.ACQUIRE_CAUSES_WAKEUP |
                    PowerManager.ON_AFTER_RELEASE, "ReportActivity Wakelock");
            sScreenWakeLock.acquire();
        }
        TextView tv=new TextView(this);
        tv.setTextSize(30);
        tv.setGravity(Gravity.CENTER);
        Intent i = getIntent();
        if ((i != null) && (i.hasExtra("result"))) 
            tv.setText(i.getStringExtra("result"));
        else 
            tv.setText("???");
        setContentView(tv);
    }
    protected void onStop() {
        if (sScreenWakeLock != null) {
            sScreenWakeLock.release();
            sScreenWakeLock = null;
        }
        super.onStop();
    }
}

它可能需要一些清理和改进;例如,目前您无法使用电源按钮关闭手机,除非您首先通过导航离开来停止活动以使其失去可见性。


谢谢回答!我已经设置好将设备ID与每个失败/成功输出关联,并且脚本在最后打印出失败/完成的设备。问题是有些设备很难通过它们的ID进行识别。如果所有完成的设备都哔哔响,那么就会更容易了。或者我能否通过ID获取真实的设备名称? 再次感谢!@dtmilano - HaroldT
非常感谢您的帮助!不幸的是,我无法控制进入应用程序的代码,但这真的很棒!实际上,我自己找到了一个解决方案,如果您有兴趣,我将在下面发布。再次感谢! - HaroldT
这可以成为一个独立的应用程序,它只是一个工具,用于向adb报告设备上的信息。你有什么想法? - Chris Stratton
我在回答自己的帖子之前等了8个小时:P。现在下面有了。再次感谢! - HaroldT

0

我能想到的一种方法是创建一个应用程序来验证应用程序的安装。具体来说,这是一个应该安装在设备上的应用程序清单,当PackageManager完成安装时,它会根据此广播进行更新。

除了在应用层之外进行操作,我认为除非你嗅探连接到设备的USB端口并识别命令和有效负载,否则不可能实现这一点(黑客)


0

你可以通过运行以下命令来检查包是否已安装

adb shell pm list packages your-package-name-here

如果已安装,它将返回package:your-package-name-here,因此您可以将返回值存储在变量中,然后检查变量是否为null或“package:your-package-name-here”。

即使您没有任何特定的活动要调用,也可以运行以下命令来打开设备上安装的应用程序:

adb shell monkey -p your-package-name-here -c android.intent.category.LAUNCHER 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接