Android 快速获取App的包名和 Activity名字

1. 已安装的 APP

假设这个app是安装到Android 设备上了, 以diskinfo这个app为例

查找包名
adb shell pm list packages

这样会列出一大堆,检索一下会更清晰,一般包名都会包含app的名字

adb shell pm list packages | grep diskinfo
结果如下
package:me.kuder.diskinfo
查找 Main Activity

通常我们想要通过adb shell am start 来启动

  • 方法 1 'pm dump [package_name]'
adb shell pm dump me.kuder.diskinfo | grep -A 1 MAIN
结果如下
      android.intent.action.MAIN:
        81106aa me.kuder.diskinfo/.ItemListActivity filter 9a607dd
  • 方法 2 'cmd package resolve-activity’
adb shell "cmd package resolve-activity --brief  me.kuder.diskinfo | tail -n 1"
结果如下
me.kuder.diskinfo/.ItemListActivity
  • 方法 3 ‘logcat’ 适合已经启动的app

对于启动了的app,logcat也可以很快看出 package 和 Activity

logcat | grep cmp= 
结果里面包含
ActivityManager: START u0 {flg=0x10000000 cmp=me.kuder.diskinfo/.ItemListActivity} from uid 10014
  • 方法 4 'dumpsys package’
dumpsys package me.kuder.diskinfo
结果如下
Activity Resolver Table:
  Non-Data Actions:
      android.intent.action.MAIN:
        81106aa me.kuder.diskinfo/.ItemListActivity filter 9a607dd
          Action: "android.intent.action.MAIN"
          Category: "android.intent.category.LAUNCHER"

  • 方法 5 'dumpsys window’
dumpsys  window windows | grep -E 'mCurrentFocus'
结果如下
mCurrentFocus=Window{dd34d27 u0 me.kuder.diskinfo/me.kuder.diskinfo.ItemListActivity}
从设备获取APK

安装过的app原文件在设备上可以pull下来, 通过pm list packages -f

adb shell pm list packages -f | grep diskinfo
结果如下
/data/app/me.kuder.diskinfo-lYCrL1uUxrZz3BIEufaGMA==/base.apk

就可以通过adb pull 这个apk到主机了,这个apk和安装的apk是一样的

2. 未安装APK文件

假设apk名字就是 diskinfo.apk

aapt dump

aapt 工具位于 Sdk/build-tools/xxxx/ 路径下
ubuntu也可以通过apt install 安装

  • 方法1
aapt dump badging base.apk
其中结果包含
package: name='me.kuder.diskinfo' versionCode='49910' versionName='4.9.9 (build 10)' platformBuildVersionName='4.9.9 (build 10)'
...
launchable-activity: name='me.kuder.diskinfo.ItemListActivity'  label='DiskInfo' icon=''

当然这样比较粗糙,可以在下命令的时候加上filter
获取包名

aapt dump badging diskinfo.apk | grep package | awk '{print $2}' | sed s/name=//g | sed s/\'//g

获取Activity

aapt dump badging diskinfo.apk | grep Activity | awk '{print $2}' | sed s/name=//g | sed s/\'//g
  • 方法2

解析 AndroidManifest.xml

aapt dump xmltree diskinfo.apk AndroidManifest.xml
其中结果包含
A: package="me.kuder.diskinfo" (Raw: "me.kuder.diskinfo")
A: android:name(0x01010003)="me.kuder.diskinfo.ItemListActivity"

apktool等

非常规手段,就不做记录了

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是获取应用包名,按照首字母排序并支持字母索引的完整实现代码: ```java public class MainActivity extends AppCompatActivity { private ListView mListView; private List<AppInfo> mAppInfos; private List<String> mSections; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView = findViewById(R.id.list_view); mAppInfos = new ArrayList<>(); mSections = new ArrayList<>(); // 获取应用包名 PackageManager pm = getPackageManager(); List<ApplicationInfo> apps = pm.getInstalledApplications(0); for (ApplicationInfo app : apps) { String packageName = app.packageName; String appName = pm.getApplicationLabel(app).toString(); // 添加到列表中 mAppInfos.add(new AppInfo(appName, packageName)); } // 按首字母排序 Collections.sort(mAppInfos, new Comparator<AppInfo>() { @Override public int compare(AppInfo o1, AppInfo o2) { return o1.getName().compareTo(o2.getName()); } }); // 添加字母索引 for (int i = 0; i < mAppInfos.size(); i++) { String section = mAppInfos.get(i).getFirstLetter(); if (!mSections.contains(section)) { mSections.add(section); } } // 设置适配器 AppAdapter adapter = new AppAdapter(); mListView.setAdapter(adapter); mListView.setDivider(null); // 设置字母索引 final String[] sections = new String[mSections.size()]; mSections.toArray(sections); ArrayAdapter<String> indexAdapter = new ArrayAdapter<>(this, R.layout.item_index, sections); ((IndexBar) findViewById(R.id.index_bar)).setIndexAdapter(indexAdapter); ((IndexBar) findViewById(R.id.index_bar)).setListView(mListView); } private class AppAdapter extends BaseAdapter implements SectionIndexer { private LayoutInflater mInflater; public AppAdapter() { mInflater = LayoutInflater.from(MainActivity.this); } @Override public int getCount() { return mAppInfos.size(); } @Override public Object getItem(int position) { return mAppInfos.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.item_app, parent, false); holder = new ViewHolder(); holder.iconView = convertView.findViewById(R.id.icon_view); holder.nameView = convertView.findViewById(R.id.name_view); holder.packageView = convertView.findViewById(R.id.package_view); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } AppInfo appInfo = mAppInfos.get(position); holder.iconView.setImageDrawable(getAppIcon(appInfo.getPackageName())); holder.nameView.setText(appInfo.getName()); holder.packageView.setText(appInfo.getPackageName()); return convertView; } @Override public Object[] getSections() { return mSections.toArray(new String[0]); } @Override public int getPositionForSection(int sectionIndex) { String section = mSections.get(sectionIndex); for (int i = 0; i < getCount(); i++) { String sortStr = mAppInfos.get(i).getFirstLetter(); if (sortStr.equals(section)) { return i; } } return -1; } @Override public int getSectionForPosition(int position) { return mSections.indexOf(mAppInfos.get(position).getFirstLetter()); } } private static class ViewHolder { ImageView iconView; TextView nameView; TextView packageView; } private Drawable getAppIcon(String packageName) { try { PackageManager pm = getPackageManager(); ApplicationInfo ai = pm.getApplicationInfo(packageName, 0); return pm.getApplicationIcon(ai); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return null; } private static class AppInfo { private String mName; private String mPackageName; public AppInfo(String name, String packageName) { mName = name; mPackageName = packageName; } public String getName() { return mName; } public String getPackageName() { return mPackageName; } public String getFirstLetter() { return mName.substring(0, 1); } } } ``` 该代码实现了以下功能: 1. 获取设备上已安装应用程序的包名称,并将其添加到一个列表中。 2. 对应用程序列表按照称首字母进行排序。 3. 添加字母索引,即在列表右侧添加一个字母条,点击字母条上的字母,可以快速滚动到该字母开头的应用程序。 4. 将应用程序列表显示在ListView中,并使用自定义适配器进行展示。 需要注意的是,该代码中使用了ViewHolder模式来优化ListView的性能。此外,我们还需要自定义一个AppInfo类来存储应用程序的称、包名和首字母信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值