Android 动态加载DEX
1). 新建项目并创建Dynamic接口
/** * 接口 * Created by mazaiting on 2018/6/26. */ public interface Dynamic { String say(); }
2). 创建接口的实现类DynamicImpl
/** * 动态实现类 * Created by mazaiting on 2018/6/26. */ public class DynamicImpl implements Dynamic { @Override public String say() { return "mazaiting"; } }
3). 编译
Build -> Make Project, 生成的文件位于
4). Gradle任务创建
在app/build.gradle文件中追加
// 删除dynamic.jar包任务 task clearJar(type: Delete) { delete('libs/dynamic.jar') } // 打包任务 task makeJar(type: org.gradle.api.tasks.bundling.Jar) { // 指定生成jar名称 baseName 'dynamic' // 打包文件的位置 from('build\\intermediates\\classes\\debug\\com\\mazaiting\\dynamicjar\\') // 打包到jar后的目录结构 into('com/mazaiting/dynamicjar/') // 去掉不需要打包的目录和文件 exclude('text/','Dynamic.class','R.class','BuildConfig.class') // 去掉R$开头的文件 exclude { it.name.startsWith('R$') } } makeJar.dependsOn(clearJar, build)
5). 在Terminal控制台运行
# 查看所有任务 gradlew tasks --all # 执行任务 gradlew makeJar
6). 生成jar
7). dex打包
将打包好的jar文件拷贝到android的安装目录中的\sdk\build-tools\26.0.1\
目录下,使用dx --dex --output=dynamic_temp.jar dynamic.jar
进行压缩
这条命令首先将dynamic.jar编译成dynamic.dex文件,然后再将dynamic.dex文件压缩成dynamic_temp.jar,当然也可以压缩成.zip格式或者直接编译成.apk文件都可以。
8). 将生成的dynamic_dex.jar文件导入Android工程的assets文件夹下,并删除Dynamic接口的实现包
9). 使用
public class MainActivity extends AppCompatActivity { /**缓存文件夹*/ private File mCacheDir; /**目标文件*/ private String mInternalPath; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); copyFile(); setContentView(R.layout.activity_main); } /** * 拷贝文件 */ private void copyFile() { // 获取缓存路径 mCacheDir = FileUtil.getCacheDir(getApplicationContext()); // 获取dex文件存储路径 mInternalPath = mCacheDir.getAbsolutePath() + File.separator + "dynamic.jar"; File file = new File(mInternalPath); // 判断文件是否存在 if (!file.exists()) { try { // 创建新文件 file.createNewFile(); // 拷贝文件 FileUtil.copyFiles(this, "dynamic_dex.jar", file); } catch (IOException e) { e.printStackTrace(); } } } /** * 动态加载按钮,布局文件只有一个按钮 */ public void loadDex(View view) { loadDex(); } /** * 动态加载 */ private void loadDex() { // 新建DexClassLoader // 第一个参数:dex压缩文件的路径 // 第二个参数:dex解压缩后的文件路径 // 第三个参数:C/C++依赖的本地库文件 // 第四个参数:上一级的类加载器 DexClassLoader dexClassLoader = new DexClassLoader( mInternalPath, mCacheDir.getAbsolutePath(), null, getClassLoader()); try { // 加载的类名为jar文件中的完整类名 Class clazz = dexClassLoader.loadClass("com.mazaiting.dynamicjar.impl.DynamicImpl"); Dynamic dynamic = (Dynamic) clazz.newInstance(); if (null != dynamic) { Toast.makeText(this, dynamic.say(), Toast.LENGTH_SHORT).show(); } } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) { e.printStackTrace(); } } }
10). 运行项目
代码下载
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android DEX加壳
1. APP加固 1). 原理 图1.png 加密过程的三个对象: 1、需要加密的Apk(源Apk) 2、壳程序Apk(负责解密Apk工作) 3、加密工具(将源Apk进行加密和壳Dex合并成新的Dex) 2). DEX头内容 图2.png 需要关注的字段: checksum 文件校验码 ,使用alder32 算法校验文件除去 maigc ,checksum 外余下的所有文件区域 ,用于检查文件错误 。 signature 使用 SHA-1 算法 hash 除去 magic ,checksum 和 signature 外余下的所有文件区域 ,用于唯一识别本文件 。 fileSize Dex 文件的大小 。 在文件的最后,我们需要标注被加密的apk的大小,因此需要增加4个字节。 图3.png 3). 解密过程 宿主Apk启动 -> 宿主Application中解密Apk -> 替换ClassLoader -> 替换资源路径 -> 替换Application对象 2. 源程序Module(source) 1). SourceApplication /** * 源Apk...
- 下一篇
Android Glide加载四周圆角图
Android Glide加载四周圆角图 需要引入: implementation 'jp.wasabeef:glide-transformations:3.3.0' 上层Java代码: package zhangphil.test; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.widget.ImageView; import com.bumptech.glide.Glide; import jp.wasabeef.glide.transformations.RoundedCornersTransformation; import static com.bumptech.glide.request.RequestOptions.bitmapTransform; public class GlideActivity extends AppCompatActivity ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS关闭SELinux安全模块
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果