如何扫描Android APK依赖的Jar包中哪些文件包含指定字符

从项目中的build.gradle,罗列的知识点。

什么是闭包?

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

-----from Groovy----
mHandler.post{
    getPresenter().requestAdsData()
}
setOnClickListener(mRecyclerView) { v ->
    v.setVisibility(View.GONE)
}

----from Java----
mHandler.post(()->{getPresenter().requestAdsData()};);
setOnClickListener(mRecyclerView,v -> {v.setVisibility(View.GONE);});

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

如何新建Task?以及执行时机?

task clean(type: Delete) {
    delete rootProject.buildDir
}

创建task的过程
1 Task task(Map<String, ?> args, String name, Closure configureClosure); 创建指定类型的Task,也就是org.gradle.api.tasks.Delete
2 调用configureClosure闭包,执行delete函数,入参是rootProject.buildDir。到此cleantask实例创建、初始化成功。
3 执行./gradlew clean。执行clean的action。比如被@TaskAction标注的函数。

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

task demo2 {
    println 'demo2'

    doLast {
        println 'demo2 doLast'
 }
    doFirst {
        println 'demo2 doFirst'
 }
}

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

---->demo2
$ ./gradlew demo2
---->demo2
--->demo2 doLast
--->demo2 doFirst

Gradle工作流程

Gradle工作流程

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

Gradle工作包含三个阶段:
首先Initiliazation phase是初始化阶段。对我们前面的multi-project build而言,就是执行settings.gradle,得知有多少subProject。
Configration阶段的目标是解析每个project中的build.gradle,根据引入的plugin,生成每个task已经初始化了的taskGraph。可hook,比如,关闭某些task、插入自定义task、自定义的action。
最后一个阶段执行指定的以某个接口为头结点的task依赖树,头结点是解析./gradlew xxx得到的。

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

:app:assembleDebug
+--- :app:compileDebugSources
|    +--- :app:compileDebugJavaWithJavac
|    |    +--- :app:generateDebugSources
|    |    |    +--- :app:compileDebugAidl
|    |    |    |    \--- :app:prepareDebugDependencies
|    |    |    |         +--- :app:checkDebugManifest
|    |    |    |         |    \--- :app:preDebugBuild
|    |    |    |         |         \--- :app:preBuild
|    |    |    |         +--- :app:preDebugBuild *
\--- :app:packageDebug
     +--- :app:compileDebugJavaWithJavac *
     +--- :app:mergeDebugAssets
     |    +--- :app:generateDebugAssets
     |    |    \--- :app:compileDebugShaders
     |    |         \--- :app:mergeDebugShaders
     |    \--- :app:prepareDebugDependencies *
     +--- :app:processDebugResources *
     +--- :app:transformClassesWithDexForDebug
     |    +--- :app:transformClassesWithJarMergingForDebug
     |    |    \--- :app:transformClassesWithJavassistForDebug
     |    |         +--- :app:compileDebugJavaWithJavac *
     |    |         +--- :app:prepareDebugDependencies *
     |    \--- :app:transformClassesWithMultidexlistForDebug
     |         \--- :app:transformClassesWithJarMergingForDebug *
     +--- :app:transformNativeLibsWithMergeJniLibsForDebug
     |    +--- :app:compileDebugNdk *
     |    +--- :app:mergeDebugJniLibFolders
     |    |    +--- :app:generateDebugAssets *
     |    |    \--- :app:prepareDebugDependencies *
     |    +--- :app:prepareDebugDependencies *
     |    +--- :coredata:bundleRelease **
     |    \--- :rxmvpkit:bundleRelease *
     +--- :app:transformResourcesWithMergeJavaResForDebug
     |    +--- :app:prepareDebugDependencies *
     |    +--- :app:processDebugJavaRes
     \--- :app:validateSigningDebug


深度遍历后的结果是:
:app:preBuild SKIPPED
:app:preDebugBuild SKIPPED
:app:checkDebugManifest SKIPPED
:app:mergeDebugAssets SKIPPED

:app:prepareDebugDependencies SKIPPED
:app:compileDebugAidl SKIPPED
:app:compileDebugRenderscript SKIPPED
:app:generateDebugBuildConfig SKIPPED
:app:generateDebugResValues SKIPPED
:app:generateDebugResources SKIPPED
:app:mergeDebugResources SKIPPED
:app:processDebugManifest SKIPPED
:app:processDebugResources SKIPPED

:app:compileDebugJavaWithJavac SKIPPED
:app:transformClassesWithJavassistForDebug SKIPPED
:app:transformClassesWithJarMergingForDebug SKIPPED
:app:transformClassesWithMultidexlistForDebug SKIPPED
:app:transformClassesWithDexForDebug SKIPPED
:app:mergeDebugJniLibFolders SKIPPED
:app:transformNativeLibsWithMergeJniLibsForDebug SKIPPED
:app:processDebugJavaRes SKIPPED
:app:transformResourcesWithMergeJavaResForDebug SKIPPED
:app:validateSigningDebug SKIPPED
:app:packageDebug SKIPPED
:app:assembleDebug SKIPPED

开始搞事情——如何知道Android APK依赖的Jar包中哪些文件包含指定字符?

  1. 涉及DSL Groovy语法
  2. Android构建流程
  3. 如何自定义GradlePlugin、Task
  4. Class文件格式解析

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

解析Class

Class文件格式

常量池   ------FragmentTransaction ft; 属性-------
18 Field #45, name&type #104
104 NameAndType #52, type #53
52 UTF8 "ft"
53 UTF8 "Landroid/support/v4/app/FragmentTransaction;"
45 Class #134
134 UTF8 "com/mrzhang/component/MainActivity"
MainActivity ft FragmentTransaction 参数类型因为有内部类,所以要指定是哪个类的属性
对应的smali

class的字节码

找到hook点,插入Task

Gradle打包流程

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

如何定义一个插件

插件开发过程图

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


https://github.com/Tencent/tinker
例子

把每种技能比喻为一把刀,平时我们用的是菜刀,现在一块大骨头面前想吃牛骨髓,怎么办?不知道大家喜不喜欢吃?就需要一把砍刀。工作中你有多少把刀?
多了一把刀,多了一种解决问题的方式和思路,比如我们用的三方源码库实现方式的过程从 APO -> APT -> Gradle,不断迁移,也更强大,也是赋能量、更自由的过程。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270

推荐阅读更多精彩内容

  • 前端开发面试题 <a name='preface'>前言</a> 只看问题点这里 看全部问题和答案点这里 本文由我...
    自you是敏感词阅读 732评论 0 3
  • 1.函数 1.1变量和作用域 在函数体内的变量在函数执行结束后就不能在用了,因为它只在函数中存在,再编写程序的世界...
    Gentle_Kay阅读 124评论 0 0
  • 同异步开发模式 标签(空格分隔): 同步异步 在soa服务调用中,一般一个请求会分配一个线程对请求进行处理,在IO...
    偶像本人阅读 1,691评论 0 2
  • Google Colab Free GPU教程现在,你可以开发深度学习与应用谷歌Colaboratory -on的...
    冯诺依曼阅读 681评论 0 1
  • 一.node 和 npm 区别 其实npm是nodejs的包管理器(package manager)。我们在Nod...
    贝灬小晖阅读 54,888评论 3 8