守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 855|回复: 0

[Android] 处理res资源之找不到资源ID

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51724
    钢镚
    1422

    开源英雄守望者

    发表于 2015-1-20 09:38:17 | 显示全部楼层 |阅读模式

    一点声明:我的水平有限 这里仅仅只能写出我认为可行的方案 和 代码

    打包ANE会经常遇到找不到资源R.XXX ID的问题,或者是找到的资源ID不对 然后报NULL POINT错 直接程序崩溃。

    AIR与android原生取资源方式的区别:
    ADOBE给出的取资源的方式是:

    1. <font color="rgb(51, 51, 51)">_context.getResourceId("id.AlipayTitleItemName");</font>
    复制代码
    但是原生JAVA取资源的方式是:

    1. <font color="rgb(51, 51, 51)">findViewById(R.id.AlipayTitleItemName);</font>
    复制代码
    ADOBE的取资源方式 是我们在ANE中使用到资源的时候的取法,
    但是一般运营商提供的SDK都是混淆的jar 取资源的方式都是清一色的findViewById。
    而我们不可能去修改SDK 的jar。除非你的逆向能力到一定水平。其实修改SDK的jar也不是不可能的。对于android逆向有兴趣的同学 可以去试试。其实android逆向也是一门非常好玩的技术。如果你有兴趣 我们可以一起探讨。

    ANE打包资源后生成的R.java特点:
    前面的文章说了 ANE打包资源是通过把资源文件夹res放到 Android-ARM下。然后打包的时候就可以在ANE内部生成R.java了。我们反编译一个APK看看AIR生成的R.java有什么特点:

    [/url]

    默认是生成R.java处在 包名为APK的ID下。也就是air+(你程序的-app.xml的ID)。
    而我们的SDK取ID都是 R.id.AlipayTitleItemName 也就是说取的是SDK的同级包下的R.java。这就会导致取不到资源ID:

    [url=http://shadowkong.com/wp-content/uploads/2013/06/3.jpg]


    也就是说 导致取不到ID的原因之一 有可能是(之所以说有可能 是因为取不到资源ID还有其他各种的原因,起码我遇遇到过的是如此):
    1. 真正的资源ID
    2. 所在的类[air.xxx.xxx.xx.R.java]
    3. 与SDK资源ID的包名[wxd.view.R.java]
    4. 地址不同
    复制代码
    现在知道问题所在了。那解决这个问题仔细一想就能知道如下几种方法:A.最简单的方式。说服运营商 把SDK的取资源的包改为我们AIR生成资源的包但是这也是最异想天开的方法。永远别梦想着运营商会针对你一家修改它的SDK。虽然想法美好 但是却是痴心妄想。B.在ANE源码中新建一个包例如上面举例的情况是 在src下新建 包 [wxd.view] 在这个包下新建类R.java。如图:


    [/url]


    后把运营商给的java SDK demo下的 gen文件夹下的R.java的内容复制到 wxd.view.R.java类中。然后再打包ANE  就能正常取资源ID了。C.也是目前我发现最完美的解决方式:
    灵活使用context.getResourceId 取AIR生成的R.java下的ID 取填补 SDK下的 R.java的资源ID。如图:



    [url=http://shadowkong.com/wp-content/uploads/2013/06/5.jpg]



    如上图的例子中。加一个resHandle.java类。
    1. package com.xxx.ane;

    2. import android.util.Log;

    3. import com.adobe.fre.FREContext;

    4. /**
    5. * R.java ID处理
    6. * @author Rect
    7. * @version  Time:2013-5-14
    8. */
    9. public class ResHandle {
    10. public static void setResourctID(FREContext _context,String TAG)
    11. {
    12. if(wxd.view.R.array.address == _context.getResourceId("array.address") &&
    13. wxd.view.R.anim.elseway == _context.getResourceId("anim.elseway"))
    14. return;

    15. Log.d(TAG, "---------anim-------"+_context.getResourceId("anim.elseway"));
    16. wxd.view.R.anim.elseway = _context.getResourceId("anim.elseway");
    17. wxd.view.R.anim.elseway_in = _context.getResourceId("anim.elseway_in");
    18. wxd.view.R.anim.landscape_anim = _context.getResourceId("anim.landscape_anim");
    19. wxd.view.R.anim.portrait_anim = _context.getResourceId("anim.portrait_anim");
    20. wxd.view.R.anim.zoom_enter = _context.getResourceId("anim.zoom_enter");
    21. wxd.view.R.anim.zoom_exit = _context.getResourceId("anim.zoom_exit");
    22. wxd.view.R.anim.zoomin = _context.getResourceId("anim.zoomin");
    23. wxd.view.R.anim.zoomout = _context.getResourceId("anim.zoomout");

    复制代码
    当然 在SDK包下的R.java要做一些处理 使得能访问全部静态变量 例如我的
    wxd.view.R.java 如下:
    1. package wxd.view;

    2. public  class R
    3. {
    4. public static class anim
    5. {
    6. public static  int elseway = 2130968576;
    7. public static  int elseway_in = 2130968577;
    8. public static  int landscape_anim = 2130968578;
    9. public static  int portrait_anim = 2130968579;
    10. public static  int zoom_enter = 2130968580;
    11. public static  int zoom_exit = 2130968581;
    12. public static  int zoomin = 2130968582;
    13. public static  int zoomout = 2130968583;
    14. }
    复制代码
    这样外部就能访问 各个变量了。
    然后在 调用SDK打开SDK界面之前 调用这句对R.java进行处理:
    1. Log.d(TAG, "---------R.java处理-------");
    2. ResHandle.setResourctID(_context, TAG);
    3. Log.d(TAG, "---------Login开始-------");
    复制代码
    至此 由于取不到资源ID的问题 就得到了解决。当然再强调一次 取不到资源ID 也有可能是由于其他问题导致的。这仅仅是导致这个问题的原因之一。



    本文来自:http://shadowkong.com/archives/1160



    本帖子中包含更多资源

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

    x
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

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

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-9-24 17:26 , Processed in 0.047769 second(s), 38 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

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