【安卓学习之常见问题】jar文件中Class转java文件不准(不同软件打开的class文件不一样)

news2024/12/24 20:45:39

█ jar文件中Class转java文件不准


█ 系列文章目录

提示:这里是收集了和文件分享有关的文章

  • 【安卓学习之常见问题】android路径及文件问题
  • 【安卓学习之常见问题】文件分享–文件不存在
  • 【安卓学习之常见问题】自定义组件-刷新后跳到第一行
  • 【安卓学习之常见问题】初始化spinner、CheckBox和SeekBar不触发事件
  • 【安卓学习之常见问题】gradle依赖冲突
  • 【安卓学习之常见问题】依赖包不存在(Transform‘s input file does not exist xxx.jar)+ web 请求流程

█ 文章目录

  • █ jar文件中Class转java文件不准
  • █ 系列文章目录
  • █ 文章目录
  • █ 读前说明
  • █ 问题
  • █ 解决问题
  • █ 异常问题(d2xx.jar-ProcessInCtrl.class-processBulkInData()):
  • █ 1.代码混淆打包成aar文件后,MySDKManager.kt 文件(可看到实现方法):
  • █ 2.代码混淆打包成aar文件后,MyClient.kt 文件(可看到实现方法):
  • █ 3.代码混淆打包成aar文件后,MyClient.kt 文件(带线程,看不到实现方法):
  • █ 出现INTERNAL ERROR 后,使用luyten打开(可看到实现方法):
  • █ 相关资料
  • █ 免责声明


█ 读前说明

  • 本文通过学习别人写demo,学习一些课件,参考一些博客,’学习相关知识,如果涉及侵权请告知
  • 本文只简单罗列相关的代码实现过程
  • 涉及到的逻辑以及说明也只是简单介绍,主要当做笔记,了解过程而已    

█ 问题

  • SDK开发时,里面里面有依赖第三方库时,集成时,也需要外围再重新依赖一次

  • 如果我们直接将依赖的jar文件转成java文件保存进去,这样别人集成时就不需要再去依赖

  • jar文件里面都是class文件,怎么转java文件

█ 解决问题

  • 使用jad命令将文件夹下的class文件转成java文件:
Jad -d D:\Temp\com\ftdi\j2xx\protocol -sjava com\ftdi\j2xx\protocol\*.class
  • 用工具打开jar文件后,将一个一个文件代码复制拷贝出来

>>>>不同工具打开的class文件长不一样

█ 异常问题(d2xx.jar-ProcessInCtrl.class-processBulkInData()):

  • 使用android studio打开d2xx.jar-ProcessInCtrl.class-processBulkInData()):
    在这里插入图片描述
    public void processBulkInData(InBuffer inBuffer) throws D2xxException {
        int bufSize = false;// 这个语法明显有问题
        short signalEvents = 0;
        short signalLineEvents = 0;
        boolean signalRxChar = false;
        。。。。。。
   }
  • 使用jd-gui-windows-1.4.0打开:

在这里插入图片描述

 public void processBulkInData(InBuffer inBuffer)
    throws D2xxManager.D2xxException
  {
    int bufSize = 0;
    short signalEvents = 0;
    short signalLineEvents = 0;
    boolean signalRxChar = false;
    。。。。。。
   }
  • 使用jad.exe生成后再打开:

在这里插入图片描述

    public void processBulkInData(InBuffer inBuffer)
        throws D2xxManager.D2xxException
    {
        int bufSize;
        short signalEvents;
        short signalLineEvents;
        boolean signalRxChar;
        bufSize = 0;
        signalEvents = 0;
        signalLineEvents = 0;
        signalRxChar = false;
        bufSize = inBuffer.getLength();
   }

>>>>可以看出三种不同打开方式的代码都不一样

  • 此外jar文件也是可能引导安卓库:
import android.support.v4.content.LocalBroadcastManager;
// import androidx.localbroadcastmanager.content.LocalBroadcastManager;
dependencies {
	classpath 'androidx.legacy:legacy-support-v4:1.0.0'
}

在这里插入图片描述

█ 1.代码混淆打包成aar文件后,MySDKManager.kt 文件(可看到实现方法):

  • MySDKManager.kt 文件,原文件,使用AS打开:
object MySDKManager {

    /**
     * 初始化App相关,在使用SDK各组件之前初始化context信息
     */
    fun initApp(application: Application): MySDKManager {
        XXXSDK.getInstance().initSDK(null, null)
        return this
    }

    /**
     * 连接上SDK
     */
    val isConnectedSDK: Boolean
        get() = XXXSDK.getInstance().isConnectedSDK

    /**
     * 开始连接 SDK
     */
    fun connectSDK(): Boolean {
        return XXXSDK.getInstance().connectSDK()
    }

    /**
     * 断开 SDK
     */
    fun disconnectSDK() {
        XXXSDK.getInstance().disconnectSDK()
    }

}

在这里插入图片描述

  • MySDKManager.kt 文件,混淆后文件,使用AS打开:
public object MySDKManager {
    public final val isConnectedSDK: kotlin.Boolean /* compiled code */

    public final fun connectSDK(): kotlin.Boolean { /* compiled code */ }

    public final fun disconnectSDK(): kotlin.Unit { /* compiled code */ }

    public final fun initApp(application: android.app.Application): com.xxx.xxx.MySDKManager { /* compiled code */ }
}

在这里插入图片描述

  • MySDKManager.kt 文件,混淆后文件,使用jd-gui-windows-1.4.0打开:
public final class MySDKManager{
  @NotNull
  public static final MySDKManager INSTANCE = new MySDKManager();
  
  @NotNull
  public final MySDKManager initApp(@NotNull Application application){
    Intrinsics.checkNotNullParameter(application, "application");d.e().a(null, null);
    return this;
  }
  
  public final boolean isConnectedSDK(){
    return d.e().f();
  }
  
  public final boolean connectSDK(){
    return d.e().a();
  }
  
  public final void disconnectSDK(){
    d.e().c();
  }
}

在这里插入图片描述

█ 2.代码混淆打包成aar文件后,MyClient.kt 文件(可看到实现方法):

  • MyClient.kt 文件,原文件,使用AS打开:
class MyClient {
    private var mVideoView: XXXVideoSurface? = null//
    private var mConnectHelper: ConnectHelper? = null// 连接

    /**
     * 初始化View
     */
    fun initView(videoView: XXXVideoSurface?): MyClient {
        mVideoView = videoView
        mVideoView?.init()
        return this
    }

    /**
     * 打开连接
     */
    fun openConnection(): MyClient {
        mConnectHelper = ConnectHelper()
        mConnectHelper?.initConnection()
        return this
    }

    /**
     * 关闭连接
     */
    fun closeConnected(): MyClient {
        mConnectHelper?.closeConnected()
        mConnectHelper = null
        return this
    }
}

在这里插入图片描述

  • MyClient .kt 文件,混淆后文件,使用AS打开:
public final class MyClient public constructor() {
    private final var mConnectHelper: com.xxx.xxx.ConnectHelper? /* compiled code */

    private final var mVideoView: XXXVideoSurface? /* compiled code */

    public final fun closeConnected(): com.xxx.xxx.MyClient { /* compiled code */ }

    public final fun initView(videoView: XXXVideoSurface?): com.xxx.xxx.MyClient { /* compiled code */ }

    public final fun openConnection(): com.xxx.xxx.MyClient { /* compiled code */ }
}

在这里插入图片描述

  • MyClient .kt 文件,混淆后文件,使用jd-gui-windows-1.4.0打开:
public final class MyClient {
  @Nullable
  private XXXVideoSurface a;
  @Nullable
  private ConnectHelper b;
  
  @NotNull
  public final MyClient initView(@Nullable XXXVideoSurface videoView) {
    this.a = videoView;
    if (videoView != null) {
      videoView.init();
    }
    return this;
  }
  
  @NotNull
  public final MyClient openConnection()  {
    ConnectHelper tmp3_0 = new com/xxx/xxx/ConnectHelper;
    ConnectHelper localConnectHelper;
    (localConnectHelper = tmp3_0).<init>();this.b = localConnectHelper;
    if (tmp3_0 != null) {
      localConnectHelper.initConnection();
    }
    return this;
  }
  
  @NotNull
  public final MyClient closeConnected()  {
    ConnectHelper localConnectHelper;
    if ((localConnectHelper = this.b) != null) {
      localConnectHelper.closeConnected();
    }
    this.b = null;
    return this;
  }
}

在这里插入图片描述

█ 3.代码混淆打包成aar文件后,MyClient.kt 文件(带线程,看不到实现方法):

  • MyClient.kt 文件,原文件,使用AS打开:
class MyClient {
    private var mVideoView: XXXVideoSurface? = null//
    private var mConnectHelper: ConnectHelper? = null// 连接

    /**
     * 初始化View
     */
    fun initView(videoView: XXXVideoSurface?): MyClient {
        mVideoView = videoView
        mVideoView?.init()
        return this
    }

    /**
     * 打开连接
     */
    fun openConnection(): MyClient {
        mConnectHelper = ConnectHelper()
        mConnectHelper?.initConnection()
        Thread(Runnable { Log.e("Thread","Thread start") }).start() // 重点
        return this
    }

    /**
     * 关闭连接
     */
    fun closeConnected(): MyClient {
        mConnectHelper?.closeConnected()
        mConnectHelper = null
        return this
    }
}

在这里插入图片描述

  • MyClient .kt 文件,混淆后文件,使用AS打开:
public final class MyClient public constructor() {
    private final var mConnectHelper: com.xxx.xxx.ConnectHelper? /* compiled code */

    private final var mVideoView: XXXVideoSurface? /* compiled code */

    public final fun closeConnected(): com.xxx.xxx.MyClient { /* compiled code */ }

    public final fun initView(videoView: XXXVideoSurface?): com.xxx.xxx.MyClient { /* compiled code */ }

    public final fun openConnection(): com.xxx.xxx.MyClient { /* compiled code */ }
}

在这里插入图片描述

  • MyClient .kt 文件,混淆后文件,使用jd-gui-windows-1.4.0打开:
// INTERNAL ERROR //

在这里插入图片描述

█ 出现INTERNAL ERROR 后,使用luyten打开(可看到实现方法):

  • MyClient .kt 文件,混淆后文件,使用luyten-0.5.4.exe打开:
public final class MyClient  {
    @Nullable
    private XXXVideoSurface a;
    @Nullable
    private ConnectHelper b;
    
    private static final void a() {
        Log.e("Thread", "Thread start");
    }
    
    @NotNull
    public final MyClient initView(@Nullable final XXXVideoSurface videoView) {
        this.a = videoView;
        if (videoView != null) {
            videoView.init();
        }
        return this;
    }
    
    @NotNull
    public final MyClient openConnection() {
        final ConnectHelper b;
        final ConnectHelper connectHelper = b = new ConnectHelper();
        this.b = b;
        if (connectHelper != null) {
            b.initConnection();
        }
        new Thread(MyClient::a).start();
        return this;
    }
    
    @NotNull
    public final MyClient closeConnected() {
        final ConnectHelper b;
        if ((b = this.b) != null) {
            b.closeConnected();
        }
        this.b = null;
        return this;
    }
}


█ 相关资料

提示:这里是参考的相关文章

  1. class文件太大 或者方法过多:jd-gui反编译报错// INTERNAL ERROR //_super wheat的博客-CSDN博客
  2. 安装Java反编译工具Luyten(Windows例)_RunFromHere的博客-CSDN博客_luyten

█ 免责声明

博主分享的所有文章内容,部分参考网上教程,引用大神高论,部分亲身实践,记下笔录,内容可能存在诸多不实之处,还望海涵,本内容仅供学习研究使用,切勿用于商业用途,若您是部分内容的作者,不喜欢此内容被分享出来,可联系博主说明相关情况通知删除,感谢您的理解与支持!

转载请注明出处:
https://blog.csdn.net/ljb568838953/article/details/126834000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/66647.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

K_A08_005 基于 STM32等单片机驱动XY-160D模块按键控制直流电机正反转加减速启停

目录 一、资源说明 二、基本参数 四、部分代码说明 接线说明 1、STC89C52RCXY-160D模块 2、STM32F103C8T6XY-160D模块 五、基础知识学习与相关资料下载 六、视频效果展示与程序资料获取 七、项目所有材料清单 八、注意事项 九、接线表格 一、资源说明 单片机型号 测试…

【UNIAPP】APP快速免费生成一键发布页面

参考官方文档&#xff1a;https://uniapp.dcloud.net.cn/uniCloud/hosting.html# 效果预览地址&#xff1a;https://hellouniapp.dcloud.net.cn/portal 一、创建并运行uni-admin 1、创建项目 2、运行项目 3、关联到浏览器打开。 二、登录后台界面 1、进入主页面 2、如…

[附源码]Python计算机毕业设计Django校园帮平台管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【2023-Pytorch-分类教程】手把手教你使用Pytorch训练自己的分类模型

之前更新过一起tf版本的训练自己的物体分类模型&#xff0c;但是很多兄弟反应tf版本的代码在GPU上无法运行&#xff0c;这个原因是tf在30系显卡上没有很好的支持。所以我们重新更新一期Pytorch版本的物体分类模型训练教程&#xff0c;在这个教程里面&#xff0c;你将会学会物体…

[附源码]计算机毕业设计面向高校活动聚AppSpringboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【电商项目实战】新增收货地址(详细篇)

&#x1f341;博客主页&#xff1a;&#x1f449;不会压弯的小飞侠 ✨欢迎关注&#xff1a;&#x1f449;点赞&#x1f44d;收藏⭐留言✒ ✨系列专栏&#xff1a;&#x1f449;SpringBoot电商项目实战 ✨学习社区&#xff1a; &#x1f449;不会压弯的小飞侠 ✨知足上进&#x…

刷爆力扣之最短无序连续子数组

刷爆力扣之最短无序连续子数组 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&…

Windows+Visual stdio+CUDA编程方式及测试

目录一、visual stdio内针对工程的配置1、新建一个空项目2、配置CUDA生成依赖项3、配置基本库目录4、配置静态链接库路径5、配置源码文件风格6、扩展文件名配置二、样例测试测试样例1样例1问题&#xff1a;找不到helper_cuda.h文件测试样例2测试样例3一、visual stdio内针对工程…

Java餐厅点餐系统uniapp源码带安装教程

一套Java开发的餐厅点餐半成品系统&#xff0c;前端使用uniapp编写&#xff0c;经过本地测试&#xff0c;这套系统还有一些功能没完善好&#xff0c;有能力的朋友可以在这套系统基础上进行二次开发。 技术架构 后端技术框架&#xff1a;springboot shiro layui 前端技术框架…

springboot项目作为静态文件服务器

springboot项目作为静态文件服务器 springboot默认文件作用 使用 spring initialzr 创建 spring boot 项目 https://start.spring.io/ static 存放静态资源 template 存放模板页面 , 例如 thymeleaf 自定义静态文件存放目录 springboot 自动装配 , 默认静态资源的目录是 s…

Flink 知识点整理及八股文问题<第一部分 Flink简介>

本篇为Flink的第一大部分&#xff0c;初识Flink&#xff0c;全篇参考自 尚硅谷2022版1.13系列 整个系列的目录如下&#xff1a; <一>Flink简介 <二>Flink快速上手 <三>Flink 部署 <四>Flink 运行时架构 <五>DataStream API <六>Flin…

kubernetes—数据存储

数据存储 在前面已经提到&#xff0c;容器的生命周期可能很短&#xff0c;会被频繁地创建和销毁。那么容器在销毁时&#xff0c;保存在容器中的数据也会被清除。这种结果对用户来说&#xff0c;在某些情况下是不乐意看到的。为了持久化保存容器的数据&#xff0c;kubernetes引…

[附源码]计算机毕业设计旅游度假村管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【Python项目】Python基于tkinter实现一个笔趣阁小说下载器 | 附源码

前言 halo&#xff0c;包子们上午好 笔趣阁小说应该很多小伙伴都知道 但是用Python实现一个笔趣阁小说下载器 那不是爽歪歪呀 基于tkinter实现的Python版本的笔趣阁小说下载器今天小编给大家实现了 相关文件 关注小编&#xff0c;私信小编领取哟&#xff01; 当然别忘了一件…

【多线程(四)】线程状态介绍、线程池基本原理、Executors默认线程池、ThreadPoolExecutor线程池

文章目录4.线程池4.1状态介绍4.2线程的状态-练习14.3线程的状态-练习24.4线程的状态-练习34.5线程池-基本原理4.6线程池-Executors默认线程池4.7线程池-Executors创建指定上限的线程池4.8线程池-ThreadPoolExecutor4.9线程池-参数详解4.10线程池-非默认任务拒绝策略总结4.线程池…

用一个原始密码针对不同软件生成不同密码并保证相对安全

使用一个密码并在数据泄漏时保护自己的其它账号 关于密码 现在好多软件&#xff0c;好多网站都需要我们设置密码&#xff0c;这个时候我们的处理办法一般分为2种。 对不同的软件设置不同的密码&#xff0c;这种理论上是最安全的&#xff0c;但是记不住啊&#xff0c;所以不实…

微信小程序自动化框架的搭建python+minium

说明 公司要求做小程序的自动化&#xff0c;网上找各种资料&#xff0c;最后确定使用腾讯自研的框架minium&#xff0c;虽然版本已经不继续维护更新了&#xff0c;但是不影响我们使用来做自动化开发。 minium提供一个基于unittest封装好的测试框架&#xff0c;MiniTest是mini…

Acrel-1200分布式光伏运维平台

行业现状 “十四五”期间&#xff0c;随着“双碳”目标提出及逐步落实&#xff0c;本就呈现出较好发展势头的分布式光伏发展有望大幅提速。就“十四五”光伏发展规划&#xff0c;国家发改委能源研究所可再生能源发展中心副主任陶冶表示&#xff0c;“双碳”目标意味着国家产业…

系列学习 SpringCloud-Alibaba 框架之第 4 篇 —— Sentinel 高可用流量控制组件

1、概念 Sentinel 是由阿里巴巴开发的开源项目&#xff0c;面向分布式微服务架构的轻量级高可用流量控制组件。以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度帮助用户保护服务的稳定性。可以说&#xff0c;Sentinel 就是取代 Hystrix 组件的。因为 …

H3C WX2510h无线控制器如何网关式部署无线网络

环境&#xff1a; H3C-WX2510H AC控制器 H3C Comware Software, Version 7.1.064, Release 5457 AP H3CWA6320-C 问题描述&#xff1a; H3C wx2510h无线控制器如何网关式部署无线网络 解决方案&#xff1a; 1.配置DHCP服务&#xff0c;开启vlan1为DHCP服务器 2.新建地址…