递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 7929|回复: 2
打印 上一主题 下一主题

[安卓] 火山代码转java源代码查看

[复制链接]

4

主题

26

帖子

285

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
285
跳转到指定楼层
#
发表于 2019-5-30 18:17:22 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

今天我们来研究一下火山安卓的源代码,火山安卓允许我们以本地化编程(中文代码编程)的方式来撰写安卓app,那么在生成实际要安装到安卓app的时候,它是如何进行编译处理的呢。让我们今天来一起探究一下。

首先我们编写一个app内容,这个app由编辑框和按钮组成的窗口,我们要实现的是点击该按钮,就会弹出一个信息提示框,而这个信息提示框提示的内容就与编辑框中的内容一致。实现的效果类似这样:



这很好实现,我就不贴窗口设计图了,大家不明白如何设计该窗口的可以看下我的源码即可,贴一下实现的源码:

接下来我们来看一下生成的目录中(前提是已经进行过调试或者生成发行版了),能否找到对应的文件。

首先告知大家,我们的解决方案保存在E:\voldevproject\xueshanlinghu_learn_voldev180路径下。



可以看到除了解决方案文件之外有几个项目文件夹,这些文件夹存放的都是该项目的火山源码文件、项目自己的资源等,方便管理。同时,如果你曾经调试过或者编译过发布版本的话,会看到一个_int的文件夹。我们可以双击打开该文件夹。

里面是按照每个项目单独建立文件夹的。我们点击今天研究的项目的文件夹javacode_day4进入。

可以看到一个“debug”文件夹,这个文件夹是通过“调试”功能生成的,生成的相关文件都存在里面,如果你曾经生成过发布版,则这里还能找到一个“release”文件夹,这里面存放的就是发布版本。

再往下进去一层目录,大家的目录结构就基本一样了,我就不截图了,大家自己进去看。

那么我们编写的源码放在哪里呢,我们可以在如下目录结构找到我们今天项目从火山源码转换成java源码后编译前的源码:E:\voldevproject\xueshanlinghu_learn_voldev180\_int\javacode_day4\debug\project\src\xshlh\xhsh\day4\hshdmzhjavaydmchk\rg_qdl.java

顺带一提,编译好的apk文件保存在如下路径下:E:\voldevproject\xueshanlinghu_learn_voldev180\_int\javacode_day4\debug\linker

再说回来,上述路径一直到src的层级是大家可以借鉴的,中间的\xshlh\xhsh\day4\hshdmzhjavaydmchk\部分,是我们这个项目特有的,大家看一下像什么?是不是很像拼音?其实就是包名的拼音声母组合的文件夹层级。

我们来看一下我们的包名是什么,我们这个项目的包名是:雪山凌狐.学火山.day4.火山代码转java源代码查看 。大家看一下“雪山凌狐”翻译成拼音是不是就是“xshlh”?请注意这里它有一个处理特殊点,就是翘舌的字用的拼音是sh,也就是声母,而不是用首字母s,所以我们的目录层级是包名的拼音声母组合。

我们知道在火山安卓中,当包名相同的时候,安装到安卓程序就会被视为同一个程序,所以我们的包名尽可能长一些特有一些就不容易重复。火山这种方式,我们发现可能存在着一个问题点,那就是如果是不同的汉字,包名我们在火山软件平台里面看起来当然不同,但是声母相同,在安装生成的时候,会不会变成相当于同一个程序呢?下节课我们来一起研究一下这个问题。如果是,其实建议火山平台今后的版本还需要在用户自己设置的包名基础上,加上随机字符之类的避免包名相同吧(或其他更高级的办法)。

后面的rg_qdl.java 就是源文件啦,可以看到是一个java文件咯。

因此我们可以知道,火山的编译器相当于一个翻译器,编写后的中文代码,使用火山自带的编译器会转换成对应的java源代码,然后通过这些代码进行编译,最后生成我们的apk文件供安卓系统安装。


接下来我们打开一下该java源文件看一下能不能看懂,同时我再贴一遍火山源码:



  1. package xshlh.xhsh.day4.hshdmzhjavaydmchk;

  2. import android.app.Activity;
  3. import android.view.View;
  4. import android.view.ViewGroup;
  5. import android.widget.*;

  6. public class rg_qdl extends hsh.anzh.jb.rg_chk {

  7.     public rg_qdl ()  { }

  8.     protected hsh.anzh.jb.rg_bjk rg_n14433;
  9.     protected hsh.anzh.jb.rg_ann rg_n14434;

  10.     protected hsh.anzh.jb.rg_xxbjq rp_1;
  11.     @Override public hsh.anzh.jb.AndroidViewGroup GetAndroidActivityContainer () {
  12.         return rp_1;
  13.     }

  14.     @Override
  15.     protected boolean onInitAndroidActivity () {
  16.         if (super.onInitAndroidActivity () == false)
  17.             return false;

  18.         setContentView (R.layout.rg_qdl);
  19.         rp_1 = new hsh.anzh.jb.rg_xxbjq (this, (LinearLayout)findViewById (R.id.rg_qdl));
  20.         rp_1.onInitControlContent (this, null);

  21.         rg_n14433 = new hsh.anzh.jb.rg_bjk (this, (EditText)findViewById (R.id.rg_n14433));
  22.         rg_n14433.onInitControlContent (this, null);
  23.         rg_n14434 = new hsh.anzh.jb.rg_ann (this, (Button)findViewById (R.id.rg_n14434));
  24.         rg_n14434.onInitControlContent (this, null);
  25.         rg_n14434.rl_AndroidView_n3017 (new hsh.anzh.jb.AndroidView.re_n3017 () {
  26.             public int dispatch (hsh.anzh.jb.AndroidView objSource, int nTagNumber) {
  27.                 return rg_n14435 ((hsh.anzh.jb.rg_ann)objSource, nTagNumber);
  28.             }
  29.         }, 0);
  30.         return true;
  31.     }

  32.     protected int rg_n14435 (hsh.anzh.jb.rg_ann rg_n14436, int rg_n14437) {
  33.         if (rg_n14436 == rg_n14434)
  34.         {
  35.             rg_n15040 (String.valueOf (rg_n14433.GetTextView ().getText ()));
  36.         }
  37.         return (0);
  38.     }
  39. }
复制代码


分析以上源码,我们可以首先知道这是一个包(package),然后里面的包名你还是很明显看出是声母组合的翻译。接下来就是一些引用和翻译,看不懂没关系,咱们来看最后的这部分吧:



最后的这部分,可以看到有if语句,很明显不就是我们按钮_被单击事件方法中的内容吗?

有的同学会问,比如rg_n14436是啥啊,完全看不懂,其实这是对应“来源对象”的id,而同理rg_n14434就代表着该程序的那个按钮的id。通过id可以唯一访问资源,对程序进行控制。那么在哪定义这些id的呢,其实我估计应该是随机生成的,然后对应关系是保存在其他文件夹的其他java源码当中,大家可以自己去探索,我们就不看了。

可以看到,与我们中文代码逻辑一致,判断来源对象是否等于该按钮,如果是的话,就调用提示信息框的方法,对应id应该是看到的rg_n15040。去获取编辑框rg_n14433的内容,用的是getText()方法。


是不是很有趣?其实这也是学习对应java语句的挺好的办法,虽然你不一定懂,但能对照着中文代码去阅读,是不是感觉理解了许多?欢迎大家继续多写几段火山代码,然后再看看转换成java源代码后是如何实现的。



最后附上咱们的源码下载地址:


游客,如果您要查看本帖隐藏内容请回复


回复

使用道具 举报

127

主题

342

帖子

2086

积分

金牌会员

Rank: 6Rank: 6

积分
2086
沙发
发表于 2020-10-23 21:14:07 | 只看该作者
好好好好好
回复

使用道具 举报

42

主题

368

帖子

2209

积分

金牌会员

Rank: 6Rank: 6

积分
2209
楼主
发表于 2020-10-14 18:53:39 | 只看该作者
这个好的帖子怎么没有回复
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2024-11-22 18:32 , Processed in 0.094144 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表