7

我正在编写一个shell 脚本,允许您在使用Terminal并行连接到计算机的所有 android 手机上安装 .apk 。在我的公司,我们在许多设备上进行测试,因此这使得安装部分必须更快。

问题:我正在寻找一种方法来通过某种反馈/通知快速识别哪些手机安装了 .apk。理想情况下,您应该能够通过查看它(某种声音或屏幕闪烁)或简单地解锁设备(例如,新安装的应用程序已打开)来查看哪些手机收到了 .apk。

关于我如何做这些事情的任何想法?

我已经阅读了有关启动应用程序的信息,但似乎仅使用 .apk 就无法做到这一点(您还需要指定一个活动......)。

任何想法将不胜感激!

谢谢!

4

5 回答 5

6

找到了我自己的解决方案!

我正在使用:

aapt dump badging

认为这只会输出包名。事实证明它输出了更多有用的信息。我注意到的其中一行是输出是应用程序的启动活动。我能够用 grep 隔离这条线,然后像这样切断启动活动:

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

于 2012-07-09T15:38:09.583 回答
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
于 2012-07-06T03:57:06.987 回答
1

您可以使用带有参数的“adb shell am start”来启动新安装的软件包。

如果担心不会被旧的混淆,请在安装新的之前先卸载旧的,或者最好让您的启动活动显示版本控制。

您实际上可以使用 am start 来启动启动器不知道的活动,因此您可以使用它直接启动到将显示当前版本的“关于”活动。您的选择是在应用程序的普通过程中提供它,还是仅将它用作一次启动。

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

更新:这里是如何制作一个活动,您可以使用它来打开屏幕并显示一条消息,如下所示:

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

该代码大量抄录自早期 android 版本的内置 AlarmClock,它将需要:

<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();
    }
}

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

于 2012-07-06T03:52:47.137 回答
0

我可以看到这样做的一种方法是验证应用程序安装的应用程序。特别是应安装在设备上的应用程序清单,并且在 PackageManager 完成安装时,它会根据此广播进行更新。

除了在 App 层之外进行之外,我认为它是不可能的,除非您嗅探到设备的 USB 端口并识别命令和有效负载并弄清楚(HACK)

于 2012-07-06T03:38:48.987 回答
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
于 2021-12-21T19:30:30.720 回答