找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 15623|回复: 28

从零开始写AIX(appinventor的Extension拓展组件)

[复制链接]

5

主题

61

帖子

240

积分

版主

Rank: 7Rank: 7Rank: 7

积分
240
发表于 2016-8-29 03:08:17 | 显示全部楼层 |阅读模式
本帖最后由 colintree 于 2017-10-27 21:31 编辑

跟大家说个事我已经把所有我的拓展组件的源代码,上传到https://github.com/OpenSourceAIX
如果有需要参考的朋友,快去看看吧
或者,有意愿加入这个组的朋友,也要记得联系我喔


首先Mark一下,,我是树树,也可以叫我ColinTree、tree之类的
是个高中生,,差不多13年吧开始玩Appinventor的,有啥不懂的,可以来问我~
毕竟,怎么也算个陈年老司机了嘛hhh
找我的方式有:
QQ: 502470184
邮箱:502470184@qq.com || colinycl123@gmail.com


自2016.6.15,Appinventor开放更新NB149之后,App inventor引进了一个自由度非常高的内容:Extension(拓展组件)Appinventor 规定在App inventor本身的基础上,可以加入一些辅助性的不可视组件,但是权限放的相当的开,基本啥都能做
于是乎,很多人都开始感兴趣,但是却不知如何下手写

在本人的再三研究之后,总结了一系列的教程

本文
App inventor2广州服务器论坛 以及 作者的个人网站 http://www.colintree.cn.
作为一个高中生,平时研究和写这些教程并不容易,就希望大家多支持,给我提供更多动$力!谢谢!
扫码扫码~
微信: 支付宝 或者Paypal














上一篇:关于时间格式转换和图片录音文件保存的问题
下一篇:【拓展组件】征求大家的意见

0

主题

9

帖子

42

积分

新手上路

Rank: 1

积分
42
发表于 2017-6-27 14:24:55 | 显示全部楼层
输入指令:
cd c:/users/你登陆电脑使用的用户名/appinventor-sources/appinventor
ant
运行这一步出错,
BUILD FAILED
E:\appinventor-sources\appinventor\build.xml:16: The following error occurred while executing th             is line:
E:\appinventor-sources\appinventor\build-common.xml:284: The following error occurred while exec             uting this line:
E:\appinventor-sources\appinventor\blocklyeditor\build.xml:63: Java returned: 1
   

前面的步骤都没有问题,这步有问题,求救!!!

5

主题

61

帖子

240

积分

版主

Rank: 7Rank: 7Rank: 7

积分
240
 楼主| 发表于 2016-8-29 17:09:15 | 显示全部楼层
本帖最后由 colintree 于 2017-10-27 21:36 编辑

1  准备
1.1       下载
写Appinventor拓展文件(.aix)需要的工具有:
1.1.1   Git
Git是一个分布式版本控制软件,这里我们将用他来下载appinventor的源代码以及执行编译指令
1.1.2    Ant
Apache Ant,是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。
Appinventor已经将他的源码编译过程全部浓缩到一个指令文件里,只需要我们使用Ant将其执行即可
1.1.3    Google app engine
事实上,GAE客户端是一个备用选项,GAE客户端可以将Ant编译Appinventor生成的结果本地运行。这个是在官方文档里建议使用的,但是就个人来说,作者我并没有用这个方法,而是直接生成aix然后在网页上一次次的调试。
更何况,国内Google还是不稳定的,所以本文还是不讲解了
1.1.4    Java
不意外的,写Java代码还得请Java本人。
作者在测试的时候,发现最新的Java8似乎并不能用……所以我们要卸载所有Java8的Jre或者Jdk,然后安装最新的Java7版本。
下载地址:
1.1.5    Jedit
Jedit是作者推荐用来编辑Java源代码的一个IDE
(新推荐一个Visual Studio Code

有朋友反映有些软件下载不了,于是我把提到的软件统一打包到了百度网盘(密码4rns)←如果显示链接不存在,点击屏幕右上方的红色叉叉即可
里面已经分类好32位以及64位只需要按照电脑实际情况下载即可

5

主题

61

帖子

240

积分

版主

Rank: 7Rank: 7Rank: 7

积分
240
 楼主| 发表于 2016-8-29 17:14:43 | 显示全部楼层
本帖最后由 colintree 于 2017-10-27 23:57 编辑

1.2        安装、配置(按顺序)
1.2.1.    Git
双击安装下载好的安装包
其中建议如图选择:(添加快捷方式到桌面)
其他选项保持默认
1.2.2.    Java
按默认路径安装Jre
按默认路径安装Jdk
右击“计算机”,点击“属性”,点击弹出界面的左部分的“高级系统设置”,选择“高级”选项卡,点击下部的“环境变量”
在“系统变量”中,设置属性JAVA_HOME、CLASSPATH、Path(不区分大小写),若已存在则点击“编辑”,不存在则点击“新建”
1)    JAVA_HOME指明JDK安装路径,就是刚才安装时所选择的路径/Java/jdk1.7.0_79,此路径下包括lib,bin,jre等文件夹
2)    Path使得系统可以在任何路径下识别java命令,这里,要注意下,path应该是本来就存在的,就不要新建了,找到path,点击“编辑”;在值的最前面加上下面的语句即可。如果覆盖了path变量,将导致的cmd下有些基本的命令会找不到。
%JAVA_HOME%/bin;%JAVA_HOME%/jre/bin;
3)    CLASSPATH为java加载类(classor lib)路径,只有类在classpath中,java命令才能识别,设为:
.;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar(要加.表示当前路径)
%JAVA_HOME%就是引用前面指定的JAVA_HOME;
保持环境变量窗口不要关闭,一会Ant配置还要用
1.2.3.    Ant
解压下载好的zip压缩包,将其拷贝至一个你不会轻易误删的地方
进入环境变量,设置:
1)    类似JAVA,新建ANT_HOME,填入Ant的解压目录,如E:\Ant\apache-ant-1.9.1,此目录下有bin, lib等子目录
2)    在Path加入 %ANT_HOME%\bin
3)    在CLASSPATH加入 %ANT_HOME%\lib
1.2.4.    Jedit
双击安装Jedit(如果有需要可以去装个汉化补丁)
1.2.5.    检验
至此,你应该已经安装完毕了,可以以下方法惊醒检验:
win键+R,输入cmd,运行
输入java -version并回车,若显示版本信息,则Java配置成功
输入ant并回车,若显示:
Buildfile: build.xml does not exist!
Build failed
则说明Ant配置成功

若两项都配置成功,则恭喜你,你已经拥有了开始的条件了

1.3       下载源代码
这个时候,就是时候把Appinventor的源代码从Git的代码仓库下载下来了。打开Git在桌面生成的链接:Git Bash
输入以下指令并回车:
  1. git clone https://github.com/mit-cml/appinventor-sources.git
复制代码
(如果太慢可以用我在国内的存档 https://gitee.com/colintree/appinventor-sources.git  代替上面的链接

于是乎,窗口里会出现百分比,包大小,以及网速之类的信息
开始下载后,我们可以去休息一下眼睛,需要做的只是等待,直至下载完成.
作者个人建议在Git Bash的图标旁边新建一个文本,存入这么一行代码:
cd c:/users/你登陆电脑使用的用户名/appinventor-sources/appinventor(win7以后系统使用,XP未测试)
(如果是用下面的链接下载的话,把路径名改为相应的解压缩包后的路径,如解压到d:/则为cd d:/appinventor-sources/appinventor
(验证路径是否正确只需把整行代码输入到Git Bash并查看结果,如果发现路径后面有"master"字样即为成功,如图)
而这一行代码以后每次打开Git进行编译的时候要用到的。
如果使用Git bash指令下载失败,可以在百度网盘(密码4rns)里下载我提供的副本

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

0

主题

1

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2016-8-30 10:31:13 | 显示全部楼层
顶,学习基础条件是什么,是否要会android传统编程

5

主题

61

帖子

240

积分

版主

Rank: 7Rank: 7Rank: 7

积分
240
 楼主| 发表于 2016-8-30 22:58:52 | 显示全部楼层
易伟 发表于 2016-8-30 10:31
顶,学习基础条件是什么,是否要会android传统编程

感谢老师顶帖!
是的,需要一些JAVA基础,但是我接下来会一直更新,一步一步教重点部分,把AI的预设代码都讲解好

5

主题

61

帖子

240

积分

版主

Rank: 7Rank: 7Rank: 7

积分
240
 楼主| 发表于 2016-8-30 23:41:08 | 显示全部楼层
本帖最后由 colintree 于 2017-10-27 21:11 编辑

2.  开始编写AIX的源代码
2.1       尝试编译Appinventor
在配置完我们的开发环境之后,我们可以尝试编译一下Appinventor的源代码,以保证整个源代码的正确性。打开Git Bash,输入指令:
cd c:/users/你登陆电脑使用的用户名/appinventor-sources/appinventor
ant
输入完成,回车后,窗口上会开始有大量的文字输出,我们需要做的就是等待。等到文字输出停止了,我们会看到在屏幕的倒数第五行左右会有结果提示,如果发现显示BUILD SUCCESSFUL,那么几句说明,整个下载下来的源代码是没有问题的。
(如果有错误,有可能是需要先运行一遍ant MakeAuthKey)
(另外,错误信息一般是在 BUILD FAILED 或者 BUILD SUCCESSFUL 上面一点)

2.2       编译自己的第一个JAVA文件
既然下载的源代码,是没有问题的,那就是时候开始写自己的JAVA文件啦。
找到c:\users\你登陆电脑使用的用户名\appinventor-sources\appinventor\components\src\文件夹,按照你的包名新建文件夹
比如,包名为cn.yzzyz.extensions则创建文件夹cn,在其中创建文件夹yzzyz,接着在里面创建extensions文件夹,并把已经准备好的预设代码(见附件)存入。

再接着,把这个预设代码文件的名字从”拓展组件名字.java”改成你要使用的组件名字+”.java” (名字以字母开头,可以包括大小写字母和数字)

紧跟着,用jEdit打开这个Java文件
第一行,是包名,包名是一个类似于网址倒过来写的结构,比如我的网址是extensions.yzzyz.cn,包名就可以用cn.yzzyz.extensions
当然,就算是你没有一个属于自己的网址,也是没问题的,包名要做的,仅仅是做一个属于你的标识,只要不与其他人一样即可

修改完包名,顺着文档将所有的中文“拓展组件名字” 同样都替换组件名字

接着找到最下面,会发现一段这样的代码:

  1. <font size="4">/**
  2. * Return yzzyz.cn
  3. */
  4. //这三行是注释,记录自己写这个函数是为了做什么
  5. @SimpleFunction(description = "Return Hello World!")
  6. //这一行表示,这是一个“简单函数”
  7. public String Test(double a) {
  8. //这是一个返回值为字符串,名字叫做“Test”,需要一个参数双精度小数a的函数
  9.     return "Hello Appinventor!";
  10.     //返回一个字符串作为函数的结果,再逻辑设计中,调用这个函数,将会返回给上一个块的值
  11. }
  12. </font>
复制代码

你可以把return 后,双引号之间的字符串改成任何你想要的文字(但是不要出现"或者')

完成之后,打开Git Bash,定位到文件夹(cd c:\……),输入代码并回车:
ant extensions(注意!之前这里写错了!sions里多了一个i,变成了,sioins。现已更正,感谢UzminTid2的提示

等待

直到编译完成
现在的情况应该是BUILD SUCCESSFUL的情况
所以这样子就可以得到一个aix文件,路径位于:
c:\users\你登陆电脑使用的用户名\appinventor-sources\appinventor\components\build\extensions
而这个文件的名字页应该是:
包名+组件名


至此,你已经成功编译出属于你自己的一个aix文件了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

5

主题

61

帖子

240

积分

版主

Rank: 7Rank: 7Rank: 7

积分
240
 楼主| 发表于 2016-8-31 01:58:45 | 显示全部楼层
因为每次都要在Git Bash输入定位文件夹(cd c:/...)和执行编译指令,实际上是挺讨厌的,也挺麻烦的
所以在这里教大家一个偷懒的方法:


新建一个文本文件,并把名字改成"编译extensions.sh"(如果修改不到后缀名,请百度:windows显示后缀名
右键,编辑
在文件中输入:
  1. cd c:/users/用户名/appinventor-sources/appinventor
  2. ant extensions
  3. read
复制代码

保存,关闭
以后每次需要编译java文件的时候就直接双击这个Shell 脚本,就会自动执行这中间的命令啦

注意,最后那一行代码"read"的功能是保持窗口,防止窗口在执行了前面两行代码之后就自动关闭
在窗口执行完编译指令之后,无论是BUILD SUCCESSFUL 还是 BUILD FAIL,都会停下来给你展示编译过程中的输出
直到您按一下回车键,窗口才会关闭

0

主题

2

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2016-8-31 09:24:10 | 显示全部楼层
新人帮顶
回复

使用道具 举报

5

主题

61

帖子

240

积分

版主

Rank: 7Rank: 7Rank: 7

积分
240
 楼主| 发表于 2016-9-1 19:18:53 | 显示全部楼层
开学了,接下来可能比较忙,不能一天一更,我尽力写把!
高二还是挺忙的

5

主题

61

帖子

240

积分

版主

Rank: 7Rank: 7Rank: 7

积分
240
 楼主| 发表于 2016-9-6 01:54:46 | 显示全部楼层
2.3       详细解析组件的定义
2.3.1.    可能使用的变量种类
在官方提供的文档中,给出了一个表格,列举了Appinventor中Java和Yail类型之间的对应关系:
  
Java变量
  
Yail变量
  
(编译时使用)
方案变量
  
(运行时使用)
参考翻译
举例
Boolean
Boolean
Boolean
真假值
按钮.启用
String
Text
String
文本
标签.文本
Int
Short
Long
Float
double
number
Number
数字
标签.字体大小
  
计时器.间隔
Java.util.Calendar
InstantInTime
Java.util.Calendar
日历时间

Any Java type
any
Any Java type
任何种类

Component
component
Component
组件

YailList
Collection<?>
List
Yail-list
列表
列表选择.元素
蓝牙客户端.地址
注意,在Appnventor中,全局变量没有固定的变量种类,任何运算都在适合的情况下才能进行。但是在Java中,YailList转换为Java的List或者数组的时候,是需要定义变量类型的,这个会在下面详细讲。
2.3.2.    Boolean
Boolean(布尔)值是一种占很小空间的值,因为它只能为真或假,在任何语言中都是如此,非常好理解,如果启用为真,那么就是组件已经启用。
但是有几点需要了解,布尔运算and在Java中用&&表示,or在Java中用||表示,not用!表示,不等于用!=表示,if中的等于用==表示(=是赋值)。
2.3.3.    String
字符串String也非常好理解,就是App inventor中的文本(Text)。
2.3.4.    Int, Short, Long, Float, Double
这五个好兄弟在App inventor里面统称为数字(Number),在Java中就没有这么简单了。
Short, Int, Long是整数,其中
-32768(-2^15)<= Short <= 32767(2^15-1),
-2,147,483,648(-2^31)<= Int <= 2,147,483,647(2^31–1)
-9,223,372,036,854,775,808(-2^63)<= Long <= 9,223,372,036,854,775,807(2^63-1)
Float和Double是浮点数(允许小数),其中:
Float数据类型是单精度、32位、符合IEEE 754标准的浮点数,在储存大型浮点数组的时候可节省内存空间
Double数据类型是双精度、64位、也是符合IEEE 754标准的浮点数
就树苗我来说,我经常是用Double,虽然说浮点数“不适合用来表示精确的值”
2.3.5.    Calendar
Calendar变量我还没怎么研究,但是我看到计时器(Clock)组件中才会用到这个变量,如果真的有需要,再说吧,最近实在太忙啦
2.3.6.    Any
Any又没给样例又没见到,我也不知道的呢
2.3.7.    Component
组件Component,一个比较神奇的变量,理论上Java是不包含的,但是MIT厉害啊,直接就定义了Component变量,具体使用,其实在样例中已经展现出来了,这是作为定义Appinventor的组件用的(废话!)
2.3.8.    YailList
嗯,重头戏YailList,也就是逻辑编辑中的列表List
YailList是App inventor定义的另一个变量。这个变量的使用频率实在太高,以至于这是一个绕不过去的坑。
了解过更多语言的朋友会说,YailList是Java里的数组Array嘛?
理论上是的,因为YailList在Java中可以转换为几个格式:
  1.     对象数组“Object Array”,也就是不定义类型,仅仅把数据保存到一个数组中去。
  2.     字符串数组String Array,专门以字符串形式储存列表中的内容。
  3.     没了
很棒是不是,只有两个需要思考的选项。
接着,在YailList的定义文件中,我还找到了一些关于Java中YailList的用法:
假设我们这里有一个YailList的名字是XXX
  1.     列表长度List Length:
  (返回值类型为Int)XXX.size()
  2.     获取索引值i指向的列表值:
  (返回值类型为Object)XXX.getObject(i)
  3.     创建空列表:
  (返回值类型为YailList)YailList.makeEmptyList()
  4.     转换索引值i指向的列表值为字符串:
  (返回值类型为String)XXX.getObject(i).toString()
  5.     使一个对象转换为列表(举例:XXX的第i项列表值也是个列表)
  (返回值类型为YailList)(YailList) XXX.getObject(i)
  6.     将对象列表转换为YailList
  (返回值类型为YailList)makeList(对象列表)
  7.     将List变量转换为YailList
  (返回值类型为YailList)makeList(List值)
  8.     将Collection变量转换为YailList
  (返回值类型为YailList)makeList(Collection值)
  9.     将列表转换为JSON格式的字符串
  (返回值类型为String)XXX.toJSONString()
  10.  将列表转换为数组
  (返回值类型为对象数组)XXX.toArray()
  11.  将列表转换为字符串数组
  (返回值类型为字符串数组)XXX.toStringArray()
  12.  将列表转换为字符串
  (返回值类型为String)XXX.toString()
  13.  将列表元素转换为字符串(感觉和getItem(i).toString()有点像)我好像只见到在列表显示框ListView和列表选择框ListPicker里有用到
  (返回值类型为String)XXX.YailListElementToString(对象Object 元素)
另外,我在谷歌上还找到了一些资料:说这个文件定义了更多的过程(我怎么没看到!!!)不管有没有(没时间验证,明天吧),我先贴出来:
  1.     (返回void(空))addItem(String)
  2.     (返回String) getItem(int 索引值)
  3.     (返回Array) getItems()
  4.     (返回String) getString(int 索引值)
  5.     (返回Boolean) isListEmpty()
  6.     (返回YailList) makeList(对象数组, int sortorder)(未知区别)
  7.     (返回void(空))removeItem(int 索引值)
  8.     (返回void(空))removeItem(String 移除的内容的值)
  9.     (返回void(空)) replaceValue(int位置(应该是等于索引值), String 新值)
2.3.9.    说明
我现在每天都有很多事要做,抽空收集整理这些资料来分享真的挺辛苦,像这一篇讲解变量的,我瞄了一眼,(居然)有1600+字词,而且大部分都是手打
所以,如果您觉得这些文字对您有帮助,您可以选择前往我的个人网站进行捐助
您的每一笔捐助都会给我提供极大的动力!
当然您也可以选择在我的网站上留言提建议,对此我感激不尽!
2016.9.6凌晨2点,树苗

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

本版积分规则