1. 程式人生 > >App Inventor外掛開發(七)小結未完待續

App Inventor外掛開發(七)小結未完待續

刪除大段無用的廢話,我昨天是在幹什麼。
文中所有的目錄相關都是以appinventor-sources\appinventor為根。

0.前言

話說我剛剛說這廣州服不更新怎麼轉眼就更新了。
但是更新後發現setContentView方法失效,造成整個外掛無法使用,正在思考解決方案。
不知該問題是我個人原因還是大家都有。
只要新增進去一個佈局,然後直接對該佈局進行新增控制元件即可,即繞過該方法,其他依舊可用。

1.開發環境(大牛請略過)

開發環境的配置之前已經講過了,但是我實際使用時還是做了一些修改。

1.1開發工具

notepad++的程式碼提示太廢了
改用Sublimt Text 3,不但顏值高而且功能強大,相見恨晚。

1.2build.xml修改

我覺得編譯速度有點慢,對其進行少量修改,大家可自行嘗試,不是很推薦。

1.2.1編譯順序

把depends都改成只依賴於前一個target,可以減少重複編譯的時間。
從72秒變成了34.2秒。

1.2.2去除冗餘(不建議)

因為我參加的比賽要求必須能在廣州服上執行,所以我不能更改標準庫。
因此,對原來庫的編譯不再必要。設定一堆只讀,跳過大量target。
結果從30+秒變成了14.2秒。
雖然很快,但是不建議,不是很穩定。有這修改的時間,足夠做很多事情了。

1.3第三方依賴新增

比如百度地圖,和風天氣等很多庫都是通過jar釋出的,不是web介面。
相信如果你有這種需求,應該很容易看懂我在幹什麼。
下面以

和風天氣舉例。

  1. 下載jar,重新命名為heweather-2.0.jar。
  2. 新建目錄lib\heweather,將heweather-2.0.jar貼上進入。
  3. 然後再在components/build.xml中,大概133-164和265-294行中間會有一大坨匯入,新增如下
<!-- HeWeather-lib -->
<pathelement location="${lib.dir}/heweather/heweather-2.0.jar" />

隨後即可根據官方文件進行開發。

1.4工作目錄轉移

因為經常要匯入原生元件,我直接把Android SDK下sources/android-22整個拷過來了,但是編譯時會把這些也全進行編譯。
雖然這個問題可以通過在build.xml中新增exclude來解決。可直接在另一目錄工作是個更好的辦法,通過批處理將測試包都複製過去,最後進行編譯。
如果你bat寫的好不會浪費時間,甚至可以節省時間。就是xcopy命令複製目錄時要手動輸入個d,試了試前面加上echo d|

差點把d盤給我刪了,不敢亂試。

1.5cmd.bat

這個大家應該都知道,win下沒有像Linux一樣ctrl+alt+t直接在當前目錄開啟終端的方式,慢慢cd過去簡直要死人,尤其是遇到中文目錄時。
新建cmd.bat,內容7位元組cmd.exe,放在需要開啟的目錄下,雙擊執行。
我順便統計了一下,在我的D盤下一共有525個7位元組的cmd.bat。。。

1.6Apktool&dev2jar&jd-gui

這三個工具的安裝不用多說,都是逆向時用到的東西。
但是逆向出來的結果讓我人都傻了,中文變數名都是小事,看著滿篇的SimpleSymbol、ModuleMethod、LList連句正常的程式碼都沒有。
給大家放一段看看。。。就是我的WifiTemp的逆向。

1.7常用網站

2.註解的使用

類、方法、屬性、回撥都是通過添加註解使得其被註解直譯器識別的。
注意預設是不定義該屬性時該屬性的預設值,而不是平常所設定的值。

2.1類

兩個註解一般一起用。
可能需要將訪問控制設定為public,未測試。

@DesignerComponent(version = A.VERSION,
    description = "",
    category = ComponentCategory.EXTENSION,
    nonVisible = true,
    iconName = "images/extension.png")
@SimpleObject(external = true)
public class A extends AndroidNonvisibleComponent{
	public static final int VERSION = 1;
	//...
}

常用屬性
DesignerComponent

屬性值 介紹 常用
category 元件類別 ComponentCategory.EXTENSION
description javadoc中的介紹
designerHelpDescription 給使用者看的介紹
nonVisible 是否為不可見元件 true
iconName 圖示 “images/extension.png”
version 版本 1
helpUrl 幫助網頁網址

注意

  • 圖示的目錄在appengine\src\com\google\appinventor\images下
  • designerHelpDescription為空則用description代替
屬性值 介紹 常用
external 是否為外部元件 true

2.2方法

方法的建立更為簡單,但又有一定限制。
暴露給使用者的方法的引數及返回值只能是Yail Type。
Yail Type我也不知道是何方神聖,但是隻能用簡單型別和少數例外以及Object。
可以強制型別轉換解決。

@SimpleFunction(description = "")
public void setXXX(Object buttonObject) {
	Button button = (Button)buttonObject;
	//...
}
屬性值 介紹 常用
description 描述
userVisible 使用者是否可見 true

2.3屬性

屬性本質上還是個方法,只不過使用了不同的註解。

private float xxx = 12.3;
@DesignerProperty(editorType = PropertyTypeConstants.PROPERTY_TYPE_FLOAT,
  defaultValue = 0.5f + "")
@SimpleProperty(category = PropertyCategory.APPEARANCE)
public void XXX(float x) {
    xxx = x;
}

3.程式碼開光術

//
//                            _ooOoo_
//                           o8888888o
//                           88" . "88
//                           (| -_- |)
//                            O\ = /O
//                        ____/`---'\____
//                        . ' \\| |// ` .
//                       / \\||| 1 |||// \
//                     / _||||| -9- |||||- \
//                       | | \\\ 9 /// | |
//                     | \_| ''\-8-/'' | |
//                      \ .-\__ `0` ___/-. /
//                   ___`. .' /--2--\ `. . __
//                ."" '< `.___\_<0>_/___.' >'"".
//               | | : `- \`.;`\ 2 /`;.`/ - ` : | |
//                 \ \ `-. \_ __\ /__ _/ .-` / /
//         ======`-.____`-.___\_____/___.-`____.-'======
//                            `=---='
//
//         .............................................
//                  佛祖保佑                  永無BUG
//          佛曰:
//                  寫字樓裡寫字間,寫字間里程序員;
//                  程式人員寫程式,又拿程式換酒錢。
//                  酒醒只在網上坐,酒醉還來網下眠;
//                  酒醉酒醒日復日,網上網下年復年。
//                  但願老死電腦間,不願鞠躬老闆前;
//                  賓士寶馬貴者趣,公交自行程式設計師。
//                  別人笑我忒瘋癲,我笑自己命太賤;
//                  不見滿街漂亮妹,哪個歸得程式設計師?
//                  

未完待續。。。