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

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

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

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

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

创建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标注的函数。

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

修改build.gradle 后点击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,不断迁移,也更强大,也是赋能量、更自由的过程。

android系统启动时会去扫描系统文件,并将系统支谈碰持的视频文件(mp4,3gp,wmv)扫描到媒体库(MediaStore)中,下面代码演示如何获得这些文件腊困的信息:

public static List<VideoInfo>sysVideoList = null// 视频信息集合

sysVideoList = new ArrayList<VideoInfo>()

setVideoList()

private void setVideoList() {

// MediaStore.Video.Thumbnails.DATA:视频缩略图的文件路径

String[] thumbColumns = { MediaStore.Video.Thumbnails.DATA,

MediaStore.Video.Thumbnails.VIDEO_ID }

// MediaStore.Video.Media.DATA:视频文件轮侍念路径;

// MediaStore.Video.Media.DISPLAY_NAME : 视频文件名,如 testVideo.mp4

// MediaStore.Video.Media.TITLE: 视频标题 : testVideo

String[] mediaColumns = { MediaStore.Video.Media._ID,

MediaStore.Video.Media.DATA, MediaStore.Video.Media.TITLE,

MediaStore.Video.Media.MIME_TYPE,

MediaStore.Video.Media.DISPLAY_NAME }

cursor = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,

mediaColumns, null, null, null)

if(cursor==null){

Toast.makeText(SystemVideoChooseActivity.this, "没有找到可播放视频文件", 1).show()

return

}

if (cursor.moveToFirst()) {

do {

VideoInfo info = new VideoInfo()

int id = cursor.getInt(cursor

.getColumnIndex(MediaStore.Video.Media._ID))

Cursor thumbCursor = managedQuery(

MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI,

thumbColumns, MediaStore.Video.Thumbnails.VIDEO_ID

+ "=" + id, null, null)

if (thumbCursor.moveToFirst()) {

info.setThumbPath(thumbCursor.getString(thumbCursor

.getColumnIndex(MediaStore.Video.Thumbnails.DATA)))

}

info.setPath(cursor.getString(cursor

.getColumnIndexOrThrow(MediaStore.Video.Media.DATA)))

info.setTitle(cursor.getString(cursor

.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE)))

info.setDisplayName(cursor.getString(cursor

.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME)))

LogUtil.log(TAG, "DisplayName:"+info.getDisplayName())

info.setMimeType(cursor

.getString(cursor

.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE)))

sysVideoList.add(info)

} while (cursor.moveToNext())

}

}

有一点需要注意的是:系统的媒体库并不会在我们添加视频文件后自动更新,我们如何去手动扫描媒体库,或者重启系统才能从媒体库中得到更新的视频文件:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"

+ Environment.getExternalStorageDirectory())))

这个想法优点笨拙,android通过sqlite保存了所有的音频文件,所以枝此可以通过发送广播来实现扫描音频文件,但是他不会显示进度。所以如果扫描猛冲迅SD卡的话感觉应该根据根目录的文件夹个数来估算下进度,到时候针对专门判指的文件夹来扫描。


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

原文地址: http://outofmemory.cn/tougao/8195131.html

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

发表评论

登录后才能评论

评论列表(0条)

保存