Android 加壳应用运行流程 与 生命周期类处理方案

Android加壳应用运行流程与生命周期处理

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/

DexClassLoader

DexClassLoader 可以加载任意路径下的 dex,或者 jar、apk、zip 文件(包含classes.dex)。常用于插件化、热修复以及 dex 加壳。

源码如下:

public class DexClassLoader extends BaseDexClassLoader {

  public DexClassLoader(String dexPath, String optimizedDirectory,
          String librarySearchPath, ClassLoader parent) {
      super(dexPath, null, librarySearchPath, parent);
  }
}

http://aospxref.com/android-10.0.0_r47/xref/libcore/dalvik/src/main/java/dalvik/system/DexClassLoader.java

参数说明

参数 类型 说明
dexPath String 需要加载的 dex、apk、jar、zip 文件的路径,多个路径用 : 分隔。支持任意目录下的文件。
optimizedDirectory String 用于存放优化后的 dex 文件(即 .odex),在 API level 26 已弃用(Android 8.0 Oreo)。
librarySearchPath String 指定本地库(native library,.so 文件)搜索路径,多个路径用 : 分隔。
parent ClassLoader 父类加载器,用于实现类加载的委托机制。

动态加载

动态加载 = 运行时按需加载代码或资源

动态加载 是实现 dex加壳、插件化、热更新、热修复 的基础。比如阿里的 AndFix 、腾讯 tinker、美团 Robust 等热修复框架的基础。

使用 DexClassLoader 加载一个外部 .dex 或 .apk 文件,然后反射调用里面的类和方法。

步骤如下:

  1. 准备好外部的 dex / apk / jar;

  2. 将它放在你 app 可以访问的路径(如 /data/data/包名/files/);

  3. 用 DexClassLoader 加载它;

  4. 使用反射调用其中的类和方法。

1. 插件工程示例

插件工程主要包含这两个类:

word/media/image1.png

PluginActivity 源码:使用 Jetpack Compose 创建一个白色背景、居中显示文本的界面,文本内容为 “PluginActivity from plugin” 加上 ClassLoader 信息

package com.cyrus.example.plugin

import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp

class PluginActivity : ComponentActivity() {

    private val TAG = "PluginActivity"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d(TAG, "onCreate")

        val classLoaderInfo = this.javaClass.classLoader.toString()

        setContent {
            PluginActivityContent(classLoaderInfo)
        }
    }


    @Composable
    fun PluginActivityContent(classLoaderInfo: String) {
        Box(
            modifier = Modifier
                .fillMaxSize()
                .background(Color.White)
                .padding(horizontal = 16.dp),
            contentAlignment = Alignment.Center
        ) {
            Text(
                text = "PluginActivity from plugin\n\n$classLoaderInfo",
                fontSize = 18.sp,
                color = Color.Black
            )
        }
    }

    override fun onStart() {
        super.onStart()
        Log.d(TAG, "on
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值