公司有个Android设备,里面内置了一款厂家自带的应用,该应该里面有一些提示语音,我想要把厂家的应用提取出来,以便获取应用内的语音资源,于是安装了一个APK Extractor,但是这个应用里没有列出来我需要的应用,系统应用也显示了,就是没有显示我需要的那个应用。经过百度,找到了另一种提取方式,成功的提取到了我需要的apk。
- adb shell pm list packages
-
效果如下:- adb shell pm path rst.rst3.hc_client
-
执行这个命令后,就能看到rst.rst3.hc_client包名的应用的保存位置了,如下:- adb pull /data/app/rst.rst3.hc_client-1/base.apk
-
执行效果如下:获取运行在最前面的应用的包名
如何知道一个未知应用的包名,方法是我们可以把未知包名的应用运行起来,且让它运行在最前面。然后我们可以写一个程序来检测运行在最前面的应用的包名,在我的一个项目中,有一个检测当前运行在最前面的程序的服务类,如果检测到最前面的程序不是我们的app时,就会把自己的app运行在最前面,比较流氓。这里我就直接把代码复制过来了(目前在Android 7.1上测试是OK的,在更高的版本不知道是否还可以),代码如下:
- /**
- * 栈顶app检查
- */
- class StackTopAppCheckService : Service() {
-
- private lateinit var powerManager: PowerManager
-
- companion object {
- var needMoveToTop = true
- }
-
- override fun onBind(intent: Intent): IBinder? = null
-
- private var run = false
-
- override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
- if (run) {
- // 如果检查任务已经在运行了,则直接返回
- return super.onStartCommand(intent, flags, startId)
- }
-
- run = true
- val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
- thread {
- try {
- while (run) {
- checkStackTopApp(activityManager)
- Thread.sleep(6000) // 每6秒钟检测一次
- }
- } catch (e: Exception) {
- Timber.fw(e, "检查App是否在栈顶时出现异常")
- }
- Timber.fi("while循环执行结束")
-
- // 恢复变量
- run = false
- }
-
- return super.onStartCommand(intent, flags, startId)
- }
-
- private fun checkStackTopApp(activityManager: ActivityManager) {
- if (!isRunningForeground(activityManager)) { // 如果不在栈顶,则移到栈顶
- Timber.fw("我们的应用不在栈顶,当前栈顶应用为:${getStackTopAppPackageName(activityManager)},needMoveToTop = $needMoveToTop")
- if (needMoveToTop) { // 有时候不希望一直弹到前台,则会把此变量设置为false
- moveToStackTop(activityManager)
- }
- }
- }
-
-
- fun getStackTopAppPackageName(activityManager: ActivityManager? = null): String {
- val manager = activityManager ?: getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
- return manager.runningAppProcesses?.find {
- it.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
- }?.processName ?: "未知"
- }
-
- /** 把执法仪移动到栈顶 */
- @Suppress("DEPRECATION")
- private fun moveToStackTop(activityManager: ActivityManager) {
- activityManager.getRunningTasks(100)?.find { it.topActivity?.packageName == App.getContext().packageName }?.let {
- activityManager.moveTaskToFront(it.id, 0)
- }
- }
-
- /** 判断本应用是否已经位于最前端:已经位于最前端时,返回 true;否则返回 false */
- private fun isRunningForeground(activityManager: ActivityManager): Boolean {
- return activityManager.runningAppProcesses?.any {
- it.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
- && it.processName == App.getContext().applicationInfo.processName
- } ?: false
- }
-
-
-
- override fun onCreate() {
- super.onCreate()
- Timber.fi("onCreate")
- powerManager = App.getContext().powerManager
- }
-
- override fun onDestroy() {
- super.onDestroy()
- Timber.fi("onDestroy")
- run = false
- }
-
- }
-