ESP32Cam人工智能教学21

ESP32Cam人工智能教学21

APPInventor自定义组件AIX的反编译

APPInventor自定义组件的编译过程,是自己编写了JAVA程序代码,然后经过专门的辅助软件,打包成AIX文件,然后就可以导入到APPInventor服务网站中,变成可以在项目中使用的自定义的程序积木块。而反编译正好是逆反的过程,是指你已经下载了别人的APPInventor项目中,其中包含了别人制作好的自定义程序积木块,然后你想办法通过辅助软件,对这个积木块进行解包,从而获得这个积木块后面隐藏的JAVA程序源代码。获得别人的源代码后,可以经过再次优化,重新再次打包,成功功能更加强大的自定义程序积木块,想办法让别人的东西变成自己的东西,这样就能实现反编译的意义了。

    一.反编译三件套程序

前一课中提到,我花了40大洋,获得了一个BASE64解码图片并显示的自定义控件,心里一直有一个坎,我能不能把这个自定义吃透嚼烂,弄懂后面的程序代码,然后变成自己的东西呢。

本文主要参考下面这篇博客,以及其中提供的软件工具。把Dex2jar-2.0这个文件夹解压缩到D:\盘(或者其他路径也可以),然后把jd-gui.exe也解压缩到D:\Dex2jar-2.0\文件夹中。

电脑中最好事先安装解压缩软件winrar。

然后我们下载一个带自定义组件的APPInventor项目的源程序AIA文件备用(或者用我提供的AIA项目文件也可以)

    二.反编译获得自定义组件的源代码

    (一).首先下载项目,得到AIA文件

    还是以我自己编写的APPInventor程序为例,我的那个程序中,使用了两个自定义插件。

    我们选择到处项目aia,然后就可以下载到一个文件esp32cam.aia。

    (二).解压缩AIA文件,得到DEX文件

我们选择这个esp32cam.aia文件,右击重命名为esp32cam00.zip,这样我们就能用winrar解压缩了。

解压缩文件后,我们可以在下面的文件夹中,看到原来的APP程序中使用的两个自定义组件,都以文件夹的形式下载到了电脑中了。

我们打开其中的SimpleBase64组件的那个文件夹,在文件夹中可以看到有一个class.jar文件,右击这个文件,用winrar打开,可以得到一个classes.dex文件,我们等一下就要从这个文件进行反编译的。

    (三).反编译DEX文件,得到JAR文件

https://pan.baidu.com/s/1MGk5h5zrUM2mUHoClj5slQ可以下载到Android反编译三件套 apktool 、dex2jar、jd-gui。

把des2jar文件夹解压缩到D盘,并且把前面得到的classes.dex文件复制到这个文件夹中。然后在这里打开命令行窗口,输入d2j-dex2jar.bat classes.dex回车,会得到一个新的文件classes-dex2jar.jar文件。

    (四).Jd-gui打开,得到源代码

    我们把反编译三件套中的jd-gui也解压缩到这个文件夹中,双击打开这个程序,然后打开刚才得到的classes-dex2jar.jar文件,我们就能看到源程序了。

注:apk的反编译也可能如上操作!

     使用apktool反编译apk

  cd到D:\TESTCODE\android\android反编译三件套目录下

  输入java -jar apktool_2.3.4.jar d -f yv.apk -o vpn

yv.apk (要反编译的apk名字) vpn(反编译后存到vpn目录下)

三.优化代码重新打包

我们获得了这个SimpleBase64自定义组件的源代码,那我们能不能重新打包,重新打包后,这个组件还能不能用?这个才是有意义的。

我们使用前一节课的方法,利用这个源代码保存成JAVA文件,然后进行打包。果不其然,出现了错误,而且还有6处的代码错误!!!  如果我们不能消除错误,那解包获得的源代码也无法使用,反编译的过程就变得毫无意义了。

经过摸索一番,我们对这个组件的源代码发生错误的代码进行修改优化,同时删除了原来组件中把图片压缩成BASE64编码的功能块,仅保留下BASE64解码成图片并显示的功能块。经过反复修改测试,得到了这个代码:

package cn.ghostfox;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.util.Base64;
import android.util.Log;
import android.widget.ImageView;
import com.google.appinventor.components.annotations.DesignerComponent;
import com.google.appinventor.components.annotations.SimpleFunction;
import com.google.appinventor.components.annotations.SimpleObject;
import com.google.appinventor.components.annotations.UsesPermissions;
import com.google.appinventor.components.common.ComponentCategory;
import com.google.appinventor.components.runtime.AndroidNonvisibleComponent;
import com.google.appinventor.components.runtime.Component;
import com.google.appinventor.components.runtime.ComponentContainer;
import com.google.appinventor.components.runtime.Image;

@DesignerComponent(category=ComponentCategory.EXTENSION, description="An extension to convert images to Base64 string", iconName="http://ghostfox.ezyro.com/logo.png", nonVisible=true, version=4)
@SimpleObject(external=true)
@UsesPermissions(permissionNames="android.permission.READ_EXTERNAL_STORAGE")
public class SimpleBase64
  extends AndroidNonvisibleComponent
  implements Component
{
  private static final String LOG_TAG = "SimpleBase64";
  public static final int VERSION = 4;
  private ComponentContainer container;
  private Context context;
  
  public SimpleBase64(ComponentContainer paramComponentContainer)
  {
    super(paramComponentContainer.$form());
    this.container = paramComponentContainer;
    this.context = paramComponentContainer.$context();
    Log.d("SimpleBase64", "SimpleBase64 Created");
  }
  
  @SimpleFunction(description="Decode the given Base64 string to an image.")
  public void DecodeImage(String paramString, Image paramImage)
  {
    ImageView pImage = (ImageView)paramImage.getView();
    byte[] byteData = Base64.decode(paramString, Base64.DEFAULT);
    pImage.setImageBitmap(BitmapFactory.decodeByteArray(byteData, 0, byteData.length));
  }

}


这一次编译成功了,得到了一个新的com.ghostfox.aix的自定义组件。

四.导入项目测试组件的使用

我们登录到APPInventor广州服务器网站,然后新建一个测试项目(或者是利用原来的那个程序也可以)把原来的自定义组件SimpleBase64删除后,然后重新导入我们修改了代码后重新打包的组件。(也就是用我们自己打包的组件,替换掉原来的别人打包的组件)

我们在项目的组件编辑中,APP的程序界面中有一个按钮,一个图片控件,一个文本输入框。注意文本输入框中粘贴了一张图片的BASE64编码。

我们可以先从百度下载一张图片,调整成300*200像素的JPG图片,利用在线转码的方式,获得图片的BASE64编码字符串。需要注意的是,我们不能全部粘贴进去,而是要从“\9j\4……”这个地方开始,而不是从最开头的地方开始。

然后我们编写按钮程序,当按钮被点击时,把文本框中的字符串解码成图片,并显示在图片控件中。(这是一个最简单的测试,而且我们可以看到,这个自定义插件已经换成我们后面重新打包的新的插件了,删除掉了原来的图片到BASE64转码模块,仅留下了一个BASE64解码成图片的功能模块)。打包程序,然后下载到手机中安装,结果发现这个程序能正常运行了,我们按动一下按钮,BASE64字符串的内容变成一张图片显示出来了。

经过这样的折腾,我们总算把这个花钱买回来的组件给消化掉了,钱也算没白花,花得很值。

最后补充说明:

其实前一节课中用到的打包四件套,是我两三年前使用的,当时用的是win7,为了测试,我还特地找了一台win7的电脑进行编译与反编译的测试呢。

我现在使用的电脑已经是笔记本win10了,当时的台式win7很多时候都在吃灰状态。因此我想能不能找找新版的打包四件套程序(GIT、JDK、ANT、APPInventor离线版  这四个软件都全部更换成新的版本了)

当我把新版本的四件套软件安装在win10系统中的时候,也能打包成功。不过我把打包完成的AIX上传到广州服务器使用的时候,在编译打包的时候,出现了错误的信息。我猜可能是新的版本问题吧。于是我重新把这个AIX上传到上海服务器使用的时候,发现编译打包能通过,也能正常使用。

最后总结一下,如果我们是在win7中,使用旧版的打包四件套,打包的AIX版本比较低,在广州服务器使用是没问题的。但是如果我们是在win10中,使用新版的打包四件套,打包的AIX版本比较高,只能在上海服务器中使用了,在广州服务器中编译时会出现版本过高的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tongyue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值