问题:我正在寻找一种快速识别哪些手机已经通过某种反馈/通知安装了.apk文件的方法。理想情况下,您应该能够通过观察手机(例如发出声音或屏幕闪烁)或仅仅通过解锁设备(例如新安装的应用程序已被打开)来看到已接收到.apk文件的手机。
有没有任何想法可以实现这两个方面?我已经了解了一些关于启动应用程序的资料,但似乎不能在只有.apk文件的情况下执行(您还需要指定活动...)。
非常感谢您的任何想法!谢谢!
我将自己的解决方案分享给你!
我正在使用:
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
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
您可以使用带有参数的 '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();
}
}
它可能需要一些清理和改进;例如,目前您无法使用电源按钮关闭手机,除非您首先通过导航离开来停止活动以使其失去可见性。
我能想到的一种方法是创建一个应用程序来验证应用程序的安装。具体来说,这是一个应该安装在设备上的应用程序清单,当PackageManager完成安装时,它会根据此广播进行更新。
除了在应用层之外进行操作,我认为除非你嗅探连接到设备的USB端口并识别命令和有效负载,否则不可能实现这一点(黑客)
你可以通过运行以下命令来检查包是否已安装
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