您的位置:首页 > 移动开发 > Android开发

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

2016-10-31 18:03 357 查看
友盟自动更新将于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:

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,我过程中遇到的坑大概就是这些吧,以上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android
相关文章推荐