java怎么获取src目录下所有的包名,类名,方法名 以及通过一个类名获得该类下的所有方法名

java怎么获取src目录下所有的包名,类名,方法名 以及通过一个类名获得该类下的所有方法名,第1张

可以使用以下代码来获取src目录下所有的包名,类名,方法名 以及通过一个类名获得该类下的所有方法名。

import javaioFile;

import javalangreflectMethod;

public class LoopApp {

public static void main(String[] args) throws Exception {

String packageName = "";

File root = new File(SystemgetProperty("userdir") + "\\src");

loop(root, packageName);

}

public static void loop(File folder, String packageName) throws Exception {

File[] files = folderlistFiles();

for (int fileIndex = 0; fileIndex < fileslength; fileIndex++) {

File file = files[fileIndex];

if (fileisDirectory()) {

loop(file, packageName + filegetName() + "");

} else {

listMethodNames(filegetName(), packageName);

}

}

}

public static void listMethodNames(String filename, String packageName) {

try {

String name = filenamesubstring(0, filenamelength() - 5);

Object obj = ClassforName(packageName + name);

Method[] methods = objgetClass()getDeclaredMethods();

Systemoutprintln(filename);

for (int i = 0; i < methodslength; i++) {

Systemoutprintln("\t" + methods[i]getName());

}

} catch (Exception e) {

Systemoutprintln("exception = " + egetLocalizedMessage());

}

}

}

在framework中想添加这个功能,所以写了个appliction来实现一下获取正在运行的应用程序: 还是先看图吧: 这个app主要是简单的实现了获取非系统的应用程序和一些常用的系统应用程序,显示在一个listview中,并添加了点击(回复到你打开的界面)和长按事件(关闭应用程序)。 看看代码吧: 直接贴出来再加上注释吧(直接写在一个文件里): package andorid/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:layout_width="40dip" android:layout_height="40dip" />  <LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" >  <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textStyle="bold" />  <TextView android:id="@+id/info" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout> main: <xml version="1/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ListView android:id="@+id/list_view" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" ></ListView> </LinearLayout> 在manifest文件中要加以个权限: <uses-permission android:name="androidpermissionRESTART_PACKAGES" /> 主要是前面的amkillBackgroundProcesses(packageName);方法要这个权限。

原理:

通过查看AndroidManifestxml

方法:

可以通过如下方法获得:

1aapt

aapt dump xmltree apk路径 AndroidManifestxml > 输入的路径

2apktool 反编译

apktool d -f apk路径 输出的路径

3monkey---Android自带的工具

adb shell monkey --port 1080 -v -v

aapt即 Android Asset Packaging Tool

该工具在SDK/tools目录下,如果你没有设置环境变量,那需要进入该目录下才能运行aapt命令,如果设置了环境变量则可以在任何目录下运行aapt命令了。

1、列出压缩文件目录

aapt l[ist] [-v] [-a] file{zip,jar,apk}

参数:

-v:会以table的形式输出目录,table的表目有:Length、Method、Size、Ratio、Date、Time、CRC-32、Name。其中Method表示压缩形式,有Deflate和Stored两种,即该Zip目录采用的算法是压缩模式还是存储模式;Ratio表示压缩率。

-a:会详细输出所有目录的内容。

2、查看APK的相关信息

aapt d[ump] [--values] WHAT file{apk} [asset [asset ]]

badging Print the label and icon for the app declared in APK

permissions Print the permissions from the APK

resources Print the resource table from the APK

configurations Print the configurations in the APK

xmltree Print the compiled xmls in the given assets

xmlstrings Print the strings of the given compiled xml assets

1)、查看APK包的packageName、versionCode、applicationLabel、launcherActivity、permission等各种详细信息

aapt dump badging < fileapk>

2)、查看权限

aapt dump permissions <fileapk>

3)、查看资源列表

aapt dump resources <fileapk>

把查看信息保存到文件中去可以使用:

aapt dump resources <file_pathapk> > sodinotxt

4)、查看APK配置信息

aapt dump configurations <file_pathapk>

5)、查看指定APK的指定XML文件

aapt dump xmltree <file_pathapk> res/xml

以树形结构输出的xml信息。

aapt dump xmlstrings <file_pathapk> res/xml

输出xml文件中所有的字符串信息。

3、编译android资源

aapt p[ackage] [-d][-f][-m][-u][-v][-x][-z][-M AndroidManifestxml] \

[-0 extension [-0 extension ]] [-g tolerance] [-j jarfile] \

[--debug-mode] [--min-sdk-version VAL] [--target-sdk-version VAL] \

[--app-version VAL] [--app-version-name TEXT] [--custom-package VAL] \

[--rename-manifest-package PACKAGE] \

[--rename-instrumentation-target-package PACKAGE] \

[--utf16] [--auto-add-overlay] \

[--max-res-version VAL] \

[-I base-package [-I base-package ]] \

[-A asset-source-dir] [-G class-list-file] [-P public-definitions-file

\

[-S resource-sources [-S resource-sources ]] \

[-F apk-file] [-J R-file-dir] \

[--product product1,product2,] \

[-c CONFIGS] [--preferred-configurations CONFIGS] \

[-o] \

[raw-files-dir [raw-files-dir] ]

Package the android resources It will read assets and resources that are

supplied with the -M -A -S or raw-files-dir arguments The -J -P -F and -R

options control which files are output

部分参数解释:

-f:如果编译出来的文件已经存在,强制覆盖;

-m:使生成的包的目录放在-J参数指定的目录;

-J:指定生成的RJava的输出目录;

-S:res文件夹路径;

-A:assert文件夹的路径;

-M:AndroidManifestxml的路径;

-l:某个版本平台的androidjar的路径;

-F:具体指定APK文件的输出

1)、将工程的资源编译出Rjava文件

aapt package –m –J <Rjava目录> -S <res目录> -l <androidjar目录> -M

<AndroidManifestxml目录>

2)、将工程的资源编译到一个包里

aapt package –f –S <res目录> -l <androidjar目录> -A <assert目录> -M

<AndroidManifestxml目录> -F <输出的包目录>

4、打包好的APK中移除文件

aapt r[emove] [-v] file{zip,jar,apk} file1 [file2 ]

5、添加文件到打包好的APK中

aapt a[dd] [-v] file{zip,jar,apk} file1 [file2 ]

6、显示aapt的版本

aapt v[ersion]

您可以使用以下代码来关闭Autojs应用:

```javascript

// 获取当前应用的包名

var packageName = currentPackage();

// 关闭当前应用

appopenAppSetting(packageName);

click("强制停止");

click("确定");

```

这段代码会获取当前应用的包名,然后打开应用设置页面,点击“强制停止”按钮,最后点击“确定”按钮来关闭应用。请注意,这段代码需要在root权限下运行才能正常工作。

用命令方获取:

Aapt dumpbadging xxxxapk

第一个框为包名

第二个框为主Activity名

如果取包名与Activity在命令行中不方例还可以用以下方式获取

Aapt dumpbadging xxxxapk >c:\apktxt

之后打开c:\apktxt!

Android 提供了一个API以让应用程序向系统查询包名信息 使用 PackageManager 的 getPackageInfo(javalangString, int)方法Context context;PackageInfo info = contextgetPackageManager()getPackageInfo(contextgetPackageName(), 0); String packageNames = infopackageName;

通过使用插件 package_info 可以获取到当前APP的包名,版本名,版本号等信息。

修改+号后的构建号,+号前的版本号。

在android和ios原生(ios必须打包)中能发现version变化

要使用这个插件,首先在工程的pubspecyaml文件中加入对这个插件的依赖:

耳机控制需要使用Intent的,在intentjava(以下代码均来源于android44源码)中可以找到如下字段:

public static final String ACTION_MEDIA_BUTTON ="androidintentactionMEDIA_BUTTON";

这就是android自己用于耳机控制播放器的intent action字段了,我们可以利用它来找到相关代码,很容易我们找到了这个类MediaFocusControl类,其中包含方法dispatchMediaKeyEvent():

private void dispatchMediaKeyEvent(KeyEvent keyEvent, boolean needWakeLock) {

Intent keyIntent = new Intent(IntentACTION_MEDIA_BUTTON, null);

mRCStackpeek()mMediaIntentsend(mContext,

needWakeLock WAKELOCK_RELEASE_ON_FINISHED : 0 ,

keyIntent, this, mEventHandler);

}

这里讲intent发送了出去,具体去了哪里我们不用 *** 心,我们只要知道谁用了这个intent。这里的mRCStack是一个Stack类,其中包含着我们需要的RemoteControlStackEntry类对象。我们继续查看,这个对象是在哪被放入Stack中的,最后找到pushMediaButtonReceiver_syncAfRcs()方法,其中关键部分如下:

private boolean pushMediaButtonReceiver_syncAfRcs(PendingIntent mediaIntent,

ComponentName target, IBinder token) {

if (!wasInsideStack) {

rcse = new RemoteControlStackEntry(this, mediaIntent, target, token);

}

mRCStackpush(rcse); //rcse被push进mRCStack

}

由此,可以知道这个rcse就是我们需要的对象,而他是被直接new出来的,则这个构造函数的参数就变的很重要了。查看构造函数如下:

public RemoteControlStackEntry(MediaFocusControl controller, PendingIntent mediaIntent,

ComponentName eventReceiver, IBinder token)

可以发现,里面包含了一个重要的ComponentName对象,这个对象在android中就带表着一个应用程序,看来这就是我们要找的音乐播放软件了。那么他是如何被系统拿出来的呢?我们继续找。在刚刚的构造方法创建对象过程中,这个参数是使用target变量直接放入的。而这个target是pushMediaButtonReceiver_syncAfRcs方法的一个参数,那么继续根据这个线索向上找。发现这个参量是经过registerMediaButtonIntent()传入,但是仍然是方法的一个参数,那么继续找,发现找到了源头:

protected void restoreMediaButtonReceiver() {

String receiverName = SettingsSystemgetStringForUser(mContentResolver,

SettingsSystemMEDIA_BUTTON_RECEIVER, UserHandleUSER_CURRENT);

ComponentName eventReceiver = ComponentNameunflattenFromString(receiverName);

registerMediaButtonIntent(pi, eventReceiver, null);

}

由此我们发现了ComponentName对象的创建过程,它使用了一个receiverName对象,这个是个String,他就是我们的目标了。这是用了system的一个方法来创建,进入发现他竟然是个hide的方法,无法作为api使用。后来分析了方法名才释然,这个适用于多用户的,android43以后准备加入用户系统,可惜还不完善所以不给我们用,这肯定是有一般方法的,很快找到了getString方法,其实他就是调用了getStringForUser而已,只是屏蔽了id的参数。但是还有一个小问题,其实SettingsSystemMEDIA_BUTTON_RECEIVER字段也是个hide字段,是不可以当做api来用的,我想这就系统根本就是不想提供获取正在播放音乐的软件的方法,不过既然是个字段就没问题了,我们查看一下源码就能看到MEDIA_BUTTON_RECEIVER字段其实就代表着"media_button_receiver"而已。到这里我们已经可以实现功能了。方法如下,其实就简单的三句即可:

================================功能实现===========================================

String receiverName = SettingsSystemgetString(thisgetContentResolver(),

"media_button_receiver");

ComponentName eventReceiver = ComponentNameunflattenFromString(receiverName);

String musicPlayerPkgName = eventReceivergetPackageName();

我们即可得到我们所需要的包名。

以上就是关于java怎么获取src目录下所有的包名,类名,方法名 以及通过一个类名获得该类下的所有方法名全部的内容,包括:java怎么获取src目录下所有的包名,类名,方法名 以及通过一个类名获得该类下的所有方法名、请问如何获取安卓正在前台运行的应用程序的包名、怎样获取应用的包名和类名及解析aapt等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/10217603.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存