美文网首页
抓取Apk安装包

抓取Apk安装包

作者: Itachi001 | 来源:发表于2020-11-04 17:39 被阅读0次

核心代码如下,请自取

package cn.yeby.getapk

import android.content.Intent
import android.content.pm.ResolveInfo
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.util.Log
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import io.reactivex.Observable
import io.reactivex.ObservableEmitter
import io.reactivex.Observer
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import java.io.*

class MainActivity : AppCompatActivity() {
    companion object {
        private const val APK = ".apk"
    }

    private val list = arrayListOf<ResolveInfo>()
    private val nameList = arrayListOf<String>()
    private val packageNameList = arrayListOf<String>()
    private val compositeDisposable = CompositeDisposable()
    private lateinit var adapter: ApkAdapter
    private lateinit var resolveInfoList: List<ResolveInfo>
    private lateinit var backupDir: File

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        backupDir = getExternalFilesDir(null)!!
        val tv = findViewById<TextView>(R.id.tv)
        val edt = findViewById<EditText>(R.id.edt)
        val rc = findViewById<RecyclerView>(R.id.rc)
        tv.text = "保存路径:${backupDir.path.replace("/storage/emulated/0/", "")}"
        adapter = ApkAdapter(list)
        adapter.openLoadAnimation()
        adapter.setOnItemChildClickListener { _, _, position -> copyApk(position) }
        rc.layoutManager = LinearLayoutManager(this)
        rc.adapter = adapter
        edt.addTextChangedListener(object : TextWatcher {
            override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
            override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
            override fun afterTextChanged(editable: Editable) {
                val key = editable.toString()
                list.clear()
                for (i in nameList.indices) {
                    val name = nameList[i]
                    if (name.contains(key)) {
                        list.add(resolveInfoList[i])
                    }
                }
                for (i in packageNameList.indices) {
                    val packageName = packageNameList[i]
                    if (packageName.contains(key)) {
                        val resolveInfo = resolveInfoList[i]
                        if (!list.contains(resolveInfo)) {
                            list.add(resolveInfo)
                        }
                    }
                }
                adapter.notifyDataSetChanged()
            }
        })
        queryApps()
    }

    //查询已安装的APP
    private fun queryApps() {
        Observable.create { emitter: ObservableEmitter<Long> ->
            val packageManager = this.packageManager
            val intent = Intent(Intent.ACTION_MAIN, null)
            intent.addCategory(Intent.CATEGORY_LAUNCHER)
            list.clear()
            resolveInfoList = packageManager.queryIntentActivities(intent, 0)
            if (resolveInfoList.isNotEmpty()) {
                for (resolveInfo in resolveInfoList) {
                    list.add(resolveInfo)
                    nameList.add(resolveInfo.activityInfo.applicationInfo.loadLabel(getPackageManager()).toString())
                    packageNameList.add(resolveInfo.activityInfo.packageName)
                }
            }
            emitter.onNext(0L)
        }.subscribeOn(Schedulers.computation())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(object : Observer<Long> {
                override fun onSubscribe(d: Disposable) {
                    compositeDisposable.add(d)
                }

                override fun onNext(aLong: Long) {
                    adapter.notifyDataSetChanged()
                }

                override fun onError(e: Throwable) {
                    Log.d("yeby", e.toString())
                }

                override fun onComplete() {}
            })
    }

    private fun copyApk(position: Int) {
        val resolveInfo = list[position]
        val activityInfo = resolveInfo.activityInfo
        val sourceDir = activityInfo.applicationInfo.sourceDir
        val destFile = File(backupDir, activityInfo.packageName + APK)
        Observable.create { emitter: ObservableEmitter<String> ->
            var input: InputStream? = null
            var outputDest: OutputStream? = null
            try {
                input = FileInputStream(sourceDir)
                outputDest = FileOutputStream(destFile)
                val buffer = ByteArray(1024)
                while (true) {
                    val bytesRead = input.read(buffer)
                    if (bytesRead != -1) {
                        outputDest.write(buffer, 0, bytesRead)
                    } else {
                        break
                    }
                }
            } finally {
                input!!.close()
                outputDest!!.close()
            }

            emitter.onNext("提取成功")
        }.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(object : Observer<String> {
                override fun onSubscribe(d: Disposable) {
                    compositeDisposable.add(d)
                }

                override fun onNext(s: String) {
                    Toast.makeText(this@MainActivity, s, Toast.LENGTH_SHORT).show()
                }

                override fun onError(e: Throwable) {
                    Log.d("yeby", e.toString())
                }

                override fun onComplete() {}
            })
    }

    override fun onDestroy() {
        super.onDestroy()
        compositeDisposable.clear()
    }

}

相关文章

  • 抓取Apk安装包

    核心代码如下,请自取

  • 2017-12-27apk

    apk 编辑 APK是AndroidPackage的缩写,即Android安装包(apk)。APK是类似Symbi...

  • Android APP 终极瘦身指南

    前言 APK瘦身即是对APK大小进行压缩策略,减小APK安装包大小,更小的安装包更有助于吸引用户安装;虽然说APK...

  • apk dex vdex odex art 区别

    apk APK(Android package):android安装包,由aapt(Android Assert ...

  • 说说Android生成APK

    什么是APK?APK是AndroidPackage的缩写,即Android安装包(apk)。APK文件其实是zip...

  • APK瘦身-是时候给App进行减负了!

    前言 APK瘦身即是对APK大小进行压缩策略,减小APK安装包大小,更小的安装包更有助于吸引用户安装。前一段时间我...

  • 【性能优化】也谈APK瘦身

    前言 APK瘦身即是对APK大小进行压缩策略,减小APK安装包大小,更小的安装包更有助于吸引用户安装。前一段时间我...

  • 驱动开发中如何获取相关log

    Log的抓取: a、手机软件抓取log:高通平台下,eng版本会有QTI logkit(手机APK)抓取log的工...

  • IceCTF2018-Revers Engineering po

    下载apk安装查看功能,发现是抓取mango :D,要求抓到151只直接给flag 解压apk看内容apk搭载了h...

  • APK组成结构

    APK 是 Android PacKage 的缩写,即 Android 安装包。 APK 文件其实是 zip 格...

网友评论

      本文标题:抓取Apk安装包

      本文链接:https://www.haomeiwen.com/subject/nbfgyktx.html