About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Oct

    9

    总共花了 5 天时间,成功的制作出了第一个安卓 ANE 程序(其实它是第二个,第二个才是完整的和第三方平台 SDK 整合的 ANE,第一个只是随便测试制作流程),总共收录了 5 个贴子,每个贴子最后都有附属与补充资料的链接

    1、《安卓 ANE 制作资料备忘录(一):安卓开发环境搭建

    2、《安卓 ANE 制作资料备忘录(二):安卓应用的包名

    3、安卓 ANE 制作资料备忘录(三):使用 Android Studio 制作 ANE

    4、《安卓 ANE 制作资料备忘录(四):最简单的安卓 ANE 制作教程

    5、《安卓 ANE 制作资料备忘录(五):多个 JAR 包合并

    碎碎念

    其中第三个贴子是不需要研究的:推荐使用 ADT-Bundle,因为网上的教程基本上都是基于 ADT-Bundle 的,而不是基于 Android Studio(而且只找到了一篇)。另外 ADT-Bundle 对系统的资源比 Android Studio 要低很多,启动也快的多(顺便还吐槽了一下 Android Studio

    安卓 ANE 制作流程很简单,大多时间是花在了对工具和环境配置熟悉上,仅对这两个 IDE 工具的选择与安装就花了将近 3 天时间因为从来没有使用过这两个工具,所以来回折腾 IDE 和 SDK 的安装、卸载、对比(包括 JDK 的版本)。再加上这些工具基本上被国家防火墙拦截的原因,官方下载时需要使用 VPN,速度也不快不起来(我有“软件洁癖”,担心捆绑软件、病毒之类的,所以只喜欢官方下载)。

    在制作 Admob ANE 时,大大小小的坑不少:

    第一大坑:一个 ANE 程序被调用的类只能涉及到一个 JAR 文件,如果不是做 ANE 程序,可能都不会遇到这个问题,这个坑绕的圈子实在太大(因为一开始的时候完全不知道搜什么内容)。

    第二大坑 ANE 中的资源文件、配置相关的内容小坑(小坑至少有报错的情况可以 Google 一下找到资料,补充对应的资源文件就可以)。

    打包应用程序时出错:
    aapt tool failed:Warning: AndroidManifest.xml already defines versionCode (in http://schemas.android.com/apk/res/android); using existing value in manifest.
    Warning: AndroidManifest.xml already defines versionName (in http://schemas.android.com/apk/res/android); using existing value in manifest.
    Warning: AndroidManifest.xml already defines minSdkVersion (in http://schemas.android.com/apk/res/android); using existing value in manifest.
    Warning: AndroidManifest.xml already defines targetSdkVersion (in http://schemas.android.com/apk/res/android); using existing value in manifest.
    C:\Users\用户名\AppData\Local\Temp\0bf7cd60-7234-4a95-9eec-7188f5686a84\AndroidManifest.xml:53: error: Error: No resource found that matches the given name (at 'value' with value '@integer/google_play_services_version').

    这种小坑基本上都能在百度和 GOOGLE 上找到:http://www.523326.com/?p=156,还有一些类似中文路径等引起的小坑,都容易解决。

    一些与 ANE 相关的说不清道不明的官方资料:原理、类与接口(我没有看它们,除非想专业搞 ANE 可能了解的必要):

    http://help.adobe.com/zh_CN/air/extensions/air_extensions.pdf

    http://help.adobe.com/zh_CN/air/extensions/WSff7e9115a8550eef64893a0c132502c6a64-8000.html

    下个星期开始研究一下 IOS 版本的 ANE,相信 IOS 的 ANE 程序一定会比安卓的简单的多,至少在 IDE 选择和环境配置上不需要来回折腾浪费时间了。

    Oct

    8

    多个 JAR 包共存桌面开发时问题不大,因为可以相互引用。但在开发 ANE 时却有问题,ANE 只能编译入一个 JAR 文件,所以如果存在多个 JAR 文件就必须合并成一个。

    而一般安卓平台提供的 SDK 都是以现成的 JAR 包的方式提供的,所以就必须将它们合并后才能提供给 FLASH 开发者使用(安卓开发就是这么蛋疼,FLASH 平台的安卓开发更是蛋疼到了极点)。

    @echo off
    ::转到当前盘符
    %~d0
    ::打开当前目录
    cd %~dp0
    ::你做的主JAR包的路径
    set MainJar=MYANEJavaLib.jar
    ::第三方JAR包的路径
    set ExternalJar=3rdApiLib.jar
    ::第三方JAR包顶级包名称
    set packageName=com
    echo =========== start combin ==============
    ::解压第三方包
    jar -xf %ExternalJar%
    ::合并主JAR包
    jar -uf %MainJar% %packageName% 
    ::如果还有别的顶级包可以接着合并,例如:
    ::jar -uf %MainJar% %packageName2%
    ::jar -uf %MainJar% org
    ::jar -uf %MainJar% cn
    echo =========== over ==============
    echo 再点一下就结束了--小Q
    pause

    bat 下载jarcombine.zip

    原文链接:《ANE Android Java 接口部分引用第三方JAR的解决办法

    相关链接:《AIR接入Android 平台]打造登录付费ANE全教程》(其中这篇贴子对于制作安卓 ANE 非常值得收藏,除了 JAR 合并,还涉及到了附属的资源、以及第三方平台强制要求嵌入 APK 的问题等,已使用 CyberArticle 收录)

    Oct

    8

    一篇自己觉的最简单的 ANE 教程,与其说是教程,不如说它是制作的流程,很简单,又是 ZERO 写的,值得收藏一下。

    了解了流程后就会觉的 ANE 的制作过程其实就是简单到弱爆了。觉的 ANE 制作难的原因我想是因为 Flash 平台开发者对原生开发环境和原生语言的不熟悉。比如 ADT-Bundle 与 XCODE ,Java 与 Objective-C 语言。其中语言部份大多能在 GitHub 上找类似代码或模版文件(安卓可能更容易些,因为存在类似 JD-GUI 这样的反编译工具可以查看别人的源代码)。

    按着这个教程成功的制作出了第一个安卓 ANE 程序,大多时间其实是花在了 ADT-Bundle 这个工具(包括 Android Studio)以及它们所涉及的 SDK 部份的了解上。

    More...

    Oct

    5

    安卓 ANE 制作资料备忘录(一):安卓开发环境搭建》贴子中写到了 ADT-Bundle,但现在安卓官方已经去掉了它的支持和链接,所以必须使用迅雷才能下载。

    安卓官方现在只支持 Android Studio 并提供了下载,但这个东西并不友好,甚至可以说是极不友好。一篇如何使用 Android Studio 制作 ANE 的教程说明:《How to build ANE in Android Studio》。收藏一下。

    More...

    Oct

    5

    特别喜欢 SWFKit 这个工具,在桌面时代它的 FFishScript 脚本扩展让 ActionScript 实现了许多原本不能实现的功能,在 AIR 和移动时代里停止更新了5年,现在它的官方网站终于寿终正寝。

    Oct

    4

    无论是安卓还是IOS,在真机调试时有时候会出现两个相同设备。解决方法,运行一个批处理:

    adb kill-server
    adb start-server
    adb devices
    echo.&pause

     

    原文链接:http://bbs.9ria.com/thread-418251-1-1.html

    备注:虽然该链接中写的是安卓,但实际上 IOS 在安装了 PP 助手之类的软件时也会出现这样的情况。

    Oct

    4

    为什么 AIR SDK 生成的安卓应用包名默认会自动添加 air. 前缀呢?这里有一篇 ZERO 写的说明:[安卓开发整理]——包名,好资料收藏一下。

    More...

    Oct

    3

    iTunes Connect 上传截图报错:

    We're temporarily unable to save your changes. Please try again later.

    开始以为网络或服务器问题,可是连续几天都是如此。最后删除所有语言分类和截图,重新添加就可以了。

    Oct

    2

    打开 C:\Users\用户名\AppData\Local\Adobe\AAMUpdater\1.0 类似的目录,删除 Data 与 Install 这两个目录下面的所有文件,重新启动更新程序。

    Oct

    2

    #target photoshop
    app.bringToFront();
    //运行批处理尺寸
    main() ;
    function main() 
    {
         if(app.documents.length == 0)
        {
            //如果还没有打开任何文件,就先选择一个文件打开
            var fileInRef = File.openDialog ("请先打一个PSD文件",  "*.psd",  false);
             
            if(!fileInRef)
            {  
                //未选择就中止
                return;
            }
        
            //打开图像文件
            var activeDoc = app.open(fileInRef);
        }
        else
        {
            var activeDoc  = app.activeDocument;
        }
        var activeDocParent = activeDoc.path;//被激活文件的父级目录
        //激活文件的图层组
        var layers = activeDoc.layers;
        for(var i = 0; i < layers.length; i++)
        {
             var layer = layers[i];
                   layer.visible = false;//图层设为不可见
        }
        for (var i = 0; i<layers.length; i++) 
        {
            var layer = layers[i];
            
                layer.visible = true;
            //与PSD源文件相同的路径
            var saveFile = new File(activeDocParent+"/" + (layers.length - (i+1)) +".jpg");
            //输出到指定文件夹
            if (saveFile.exists) 
            {
                saveFile.remove();
            }
                //以JPG格式保存
            var jpgSaveOptions = new ExportOptionsSaveForWeb();
                jpgSaveOptions.format = SaveDocumentType.JPEG;//JPG / JPEG 格式
                jpgSaveOptions.optimized = true;//保存时使用优化选项
                jpgSaveOptions.includeProfile = false ;
                jpgSaveOptions.quality = 80 ;//保存质量
                 
            activeDocument.exportDocument(saveFile, ExportType.SAVEFORWEB, jpgSaveOptions);
            layer.visible = false;

        }
    }