Android Studio 生成jar包,各种Exceptions总结(res文件夹、gradle命令、无法找到方法)

本文介绍了在Android Studio中生成jar包时遇到的问题,特别是当jar包包含res资源时,如何处理找不到资源的问题。通过自定义MResource类来动态获取资源ID,从而解决主project调用时的异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

友盟自动更新将于2016年10月以后就停止服务了,项目组决定自己实现,原理和友盟类似,无非就是将app的唯一appKey和versionCode发送给服务器,服务器做判断是否需要更新。Android这边是计划将相关实现封装成jar包,以替换原有eclipse项目中的友盟jar包。第一次使用AS生成jar,把遇到的坑总结一下吧。(鉴于项目已经过去了2个月了,过程中报的Exception详细信息也无法粘贴出来了。)

1.我当时的做法是先new一个主project作为test project,好在这里做测试调用,然后File - New - New Module,比如就叫XXUpdate,然后就在这个Module里编写各种Listener供其他主项目调用,如果有res文件,比如layout、drawable、string等等的,一切引用到res文件的,比如layout:直接findViewById(R.id.xxxxxx)在主project中调用该jar时会报错,无法找到该资源什么的,google之,找到了解决方法,源码来自谁已经无法考证了,暂且贴出来 MResource.java:

  1. import android.content.Context;
    
    /**
     * 根据资源的名字获取其ID值
     *
     */
    public class MResource {
        public static int getIdByName(Context context, String className, String name) {
            String packageName = context.getPackageName();
            Class r = null;
            int id = 0;
            try {
                r = Class.forName(packageName + ".R");
    
                Class[] classes = r.getClasses();
                Class desireClass = null;
    
                for (int i = 0; i < classes.length; ++i) {
                    if (classes[i].getName().split("\\$")[1].equals(className)) {
                        desireClass = classes[i];
                        break;
                    }
                }
    
                if (desireClass != null)
                    id = desireClass.getField(name).getInt(desireClass);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
    
            return id;
        }
    }
    一切引用res文件的地方,要类似这样引用:
 
	setContentView(MResource.getIdByName(this.context, "layout", "layout_dialog"));

	XXUpdateDialog xxUpdateDialog = new XXUpdateDialog(activity, MResource.getIdByName(activity.getApplication(), "style", "xxUpdate_CustomDialog"));

	tvVerName = (TextView) findViewById(MResource.getIdByName(context, "id", "tv_dialog_update_version"))
将这些res文件一同加进日后需要引用此jar的工程中。

2.此Module的build.gradle需要配置一下,以说明这是个module,主工程的build.gradle一般长这样:
需要把红框的位置修改为:

改1为:apply plugin: 'com.android.library'
注释掉2

3.并且在此module的build.gradle中添加以下代码:
task deleteJar(type: Delete){
    delete 'libs/XXUpdate_1.0.jar'
}

task makeJar(type: Copy) {
    from('build/intermediates/bundles/release/')
    into('libs/')
    include('classes.jar')
    rename ('classes.jar', 'XXUpdate_1.0.jar')
}
makeJar.dependsOn(deleteJar,build)


4.这时候应该差不多了,点开右边的Gradle,应该有了刚才在build.gradle中添加的task:makeJar


双击makeJar,此时在该module的libs文件夹下应该生成了对应的jar,可以供其他project使用了

5.将该jar和其他的res文件拷给需要的project吧,特别说明一句,如果是给Eclipse项目使用,因为Eclipse中没有dependencies- compile一说,所以在该module中的build.gradle中dependencies{...}的内容分别找对应的jar包也一同粘给主project项目使用,
比如说我在此module中
要找到对应的
一同复制到使用该jar的Eclipse项目中,否则会报各种找不到上述包中的方法,因为Eclipse根本没编译进去呀,得手动加。


OK,我过程中遇到的坑大概就是这些吧,以上。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值