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

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


█ 系列文章目录

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

█ 文章目录


█ 读前说明

  • 本文通过学习别人写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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于您的问题,可能是由于打包时未正确包含 CompanyServiceImpl.class 文件导致的。请确保您的打包操作正确,并按照以下步骤进行检查和调试: 1. 确认 CompanyServiceImpl.class 文件存在并位于正确的目录下。请检查您的项目结构和包名是否与代码的引用一致。如果文件丢失或位置不正确,请将其添加或移动到正确的位置。 2. 如果您使用了 Maven 或 Gradle 等构建工具,请确保 CompanyServiceImpl 类被正确地包含在构建配置文件。检查您的构建文件(如 pom.xml 或 build.gradle)是否正确配置了依赖项和资源文件。 3. 确认打包操作是否正确。您可以使用命令行或使用 IDE 的打包功能来创建可执行的 JAR 文件。确保您包含了所有必要的类和资源文件,并将它们正确地放置在 JAR 文件的路径。 4. 如果您使用了外部依赖库,请确保这些库已正确地包含在 JAR 文件。您可以使用 Maven 或 Gradle 等构建工具来处理依赖项,并确保在打包时将它们正确地包含在 JAR 文件。 5. 检查运行时环境是否与打包时使用的环境一致。某些情况下,可能会因为环境变量或类路径设置不正确而导致找不到类文件。请确保您的运行环境正确设置,并且具备执行 JAR 文件所需的依赖项。 如果您尝试了上述步骤但问题仍然存在,请提供更多关于您的项目结构、打包配置和运行环境的详细信息,以便我们更好地帮助您解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值