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());

}

}

}

所需工具:aapt,Android SDK中的工具,只有一个exe,可以直接运行。

keytool,JDK中的工具,需要安装JDK环境。

需要提供目标应用的apk

1、获取包名

例如:aaptexe dump badging C:\Users\Administrator\Desktop\demo-apk-1018791apk > C:\Users\Administrator\Desktop\1txt

获取到的包名是compakgnameswbg

2、获取签名

SHA1: 56:BD:02:6B:9D:53:D7:F5:32:B2:BC:BD:BB:34:5B:F1:CD:EF:7F:C0

这里借助github开源的类apkparser

在项目composerjson中执行下面命令或修改composerjson引入即可

方法二适用于没有JAVA环境的情况下,一般linux都会有openssl环境。

原理:通过分析方法一中,发现apk包解压之后,里面会有rsa签名证书,此证书是一个符合pki体系的x509证书,通过openssl命令即可查看信息。

真正努力过的人,就会明白天赋的重要。

adb pm install (安装包所在Android手机中的路径)

adb install (安装包所在电脑的路径)

备注:安装包和路径中最好不要有中文,不然可能报错

adb uninstall (后面跟包名)

1、命令行输入:adb shell

2、回车(Enter)

3、输入命令:dumpsys window | grep mFocusedApp

结果展示:

mFocusedApp=AppWindowToken{27784c6 token=Token{396caa1 ActivityRecord{f506308 u0 comxxxai/mvpuiactivityActivity t15}}}

备注:打开所需要的APP,再执行该命令 comxxxai是包名,mvpuiactivityActivity是activity

本人还写了其他获取包名的adb命令,请查看我的另一篇文章 >

假如你的项目中有这样一个image类库, 打开image类库下的buildgradle文件,查看里面有哪些 引用包 ,如果lib里面也有包, lib中的也需要查看

假如现在,让 最后一个" compile'comblankj:utilcode:198 '" 不被混淆

打开图中的 External Libraries 文件, 我们导入的所有的第三方jar包都在里面

找到" compile'comblankj:utilcode:198 '"

查看包名,在混淆文件中添加

所有的jar包都依次写上 -keep class "jar包名" ,就ok了

--注意事项--

1保证实体类不被混淆

2保证第三方的jar包不被混淆,类似于,友盟,地图,等等,配置的时候,就把混淆文件也copy过来,免得再回去找

3添加基础混淆配置,网上有很多的实例

################ 以下直接copy到 proguard-rulespro文件中,实体类,第三方部分,需修改####################

String packageName = AclassgetPackage()getName();

或者:

packageName = new A()getClass()getPackeage()getName();

即可获得包名了。

从项目中的buildgradle,罗列的知识点。

相当于C中的函数指针,或者Java中的引用。

对比有什么不同,Groovy中,入参只有一个并且是个闭包时,可省略圆角括号;入参最后一个参数为闭包时,该闭包可以单独用花括号包裹并放在圆括号外面。这是语法上的不同。

创建task的过程

1 Task task(Map<String, > args, String name, Closure configureClosure); 创建指定类型的Task,也就是orggradleapitasksDelete

2 调用configureClosure闭包,执行delete函数,入参是rootProjectbuildDir。到此cleantask实例创建、初始化成功。

3 执行/gradlew clean。执行clean的action。比如被@TaskAction标注的函数。

练习,猜一下下面日志的输出顺序

修改buildgradle 后点击sync now刷新,以下为输出log顺序

层级关系是这样的gradle -- rootProject -- subProject -- task -- action

生成的taskGraph长什么样子呢?调用/gradlew assembleDebug 后发生了什么

思路:分三步

找到Apk依赖的所有的Jar包 和 Class文件 -----》 解压Jar解析Class内容 ----》 输出文件名。

Class文件格式

转化为Dex之前,可插入Task,输入为当前apk依赖的所有jar和class。自定义一个Transform 或者在 app:compileDebugJavaWithJavac 后面

涉及概念点extension、task、plugin入口、maven管理

把每种技能比喻为一把刀,平时我们用的是菜刀,现在一块大骨头面前想吃牛骨髓,怎么办?不知道大家喜不喜欢吃?就需要一把砍刀。工作中你有多少把刀?

多了一把刀,多了一种解决问题的方式和思路,比如我们用的三方源码库实现方式的过程从 APO -> APT -> Gradle,不断迁移,也更强大,也是赋能量、更自由的过程。

以上就是关于java怎么获取src目录下所有的包名,类名,方法名 以及通过一个类名获得该类下的所有方法名全部的内容,包括:java怎么获取src目录下所有的包名,类名,方法名 以及通过一个类名获得该类下的所有方法名、PHP获取安卓apk包里的apk签名、adb命令安装、卸载、 获取包名等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/web/9630697.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存