公司有个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
}
}