ironMan.K 发表于 2018-7-10 10:50:19

获取安卓应用包名和入口 Activity

http://bbs.zecoki.com/data/attachment/common/cf/102311q362klb36li21t72.png

最近要定制个Launcher,最后选择了 Launcher3,要在4.4上跑,掉坑里去了,太深 :sob:
首先在桌面上要显示一些应用的快捷方式,小部件之类的,这就需要知道他们的包名和入口 Activity.
获取应用包名
adb 命令获取
这个有以下几种方式:
1 经常用R.E管理器的同学,应该知道在系统/data/data目录下存着该手机所有的应用数据,并且是以包名为文件夹命名的,so直接ls查看就可以了
adb shell //进入系统终端cd /data/data && lswindow用户找不到adb命令的,请把adb目录加入到环境变量里。
请看:

http:////upload-images.jianshu.io/upload_images/746997-7097cb23fa24df59.jpg

adb1s

我的终端是git带的,还不错的。
2 包管理器pm获取
adb shellpm list packagepm list package -f//显示的更详细些请看:

http:////upload-images.jianshu.io/upload_images/746997-0c64492d0b89bbc2.jpg

pmlist


http:////upload-images.jianshu.io/upload_images/746997-864bd2aab5d7acce.jpg

pmlistf

代码获取
我们都知道,开发的安卓app的AndroidManifest.xml文件里有一个起始 Activity,包含如下过滤信息:

[*]
[*]
[*]
[*]

因此可以根据这个来获取包名和入口 Activity,具体代码在后面,请稍等。。。
获取应用的入口 Activity
aapt工具
这个必须获取到app才能继续,可以通过Android Device Monitor工具,pull到桌面,(直接adb pull 出现问题,搞不懂)然后进行下面,可以同时获取包名和入口 Activity
aapt dump badging ***.apk


找不到的,把该工具加入环境变量,我的在这里:D:\Android\Sdk\build-tools\23.0.2
请看:

http:////upload-images.jianshu.io/upload_images/746997-09012b2aef30c832.jpg

appt

网上找了个脚本,我放到了这个 Gist, Come on, boy.
运行脚本,搞掂,这样:

http:////upload-images.jianshu.io/upload_images/746997-274aa4273529e229.jpg

sh

反编译工具apktool
apktool.bat d ***.apk之后找到AndroidManifest.xml文件,后面你们都知道了,搞定。
代码获取

[*]Intent intent = new Intent(Intent.ACTION_MAIN, null);
[*]intent.addCategory(Intent.CATEGORY_LAUNCHER);
[*]
[*]List packageInfos = getPackageManager().queryIntentActivities(intent, 0);
[*]
[*]for (int i = 0; i < packageInfos.size(); i++) {
[*]    String launcherActivityName = packageInfos.get(i).activityInfo.name;
[*]    String packageName = packageInfos.get(i).activityInfo.packageName;
[*]    Log.i("appappinfo", i + " -- launcherActivityName: " + launcherActivityName);
[*]    Log.e("appappinfo", i + " -- packageName: " + packageName);
[*]}
[*]


好了,这样就搞掂,enjoy。
获取小部件包名和类名
代码实现

[*]List widgetProviderInfos = AppWidgetManager.getInstance(this).getInstalledProviders();
[*]
[*]Log.d("widget", "allWidgetSize = " + widgetProviderInfos.size());
[*]for (int i = 0; i < widgetProviderInfos.size(); i++) {
[*]    AppWidgetProviderInfo info = widgetProviderInfos.get(i);
[*]    String packageName = info.provider.getPackageName();    //获取包名
[*]    String className = info.provider.getClassName();      //获取类名
[*]    Log.d("widget", "packageName: " + packageName);
[*]    Log.d("widget", "className: " + className);
[*]}


根据包名打开该应用
[*]public static void openApp(Context context,String packageName) throws Exception{
[*]      Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
[*]      context.startActivity(intent);
[*]    }

That' all.







https://www.jianshu.com/p/99c9360a7d4b

来源:{http://bbs.zecoki.com/forum-70-1.html}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 获取安卓应用包名和入口 Activity