因为 library 里面含有 Activity 、java代码、res资源,但是jar只能打包java源代码
在打成jar包时已经把资源id设置成了 library的id值 ,如果这样拿给别人用时 放到工程里 res等资源的ID又重新分配了一个新值,运行时会提示找不到资源(图片 字符串 样式 等等),怎么办呢
看了http://blog.csdn.net/xiaanming/article/details/9257853的博客 尝试写了个demo
思路:在myapplication module 里调用 Librar打成的jar包 里面的SDK(自定义)类里面的静态方法start ()方法 启动jar包里SDKActivity Activity里 设置有layout布局(主要再这里)
1.我们新建一个Library Module取名为testlibrary,这个就是等下我们需要打包成Jar的工程,之后创建一个SDK类,含有一个静态方法start() 负责启动SDKActivity
2、创建SDKActivity
package com.gamewinner.testlibrary; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; public class SDKActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e("Unity","-----SDKActivity----onCreate-----"); //查找布局文件 int id = getResources().getIdentifier("activity_sdk","layout",getPackageName()); Log.e("Unity","-----SDKActivity----onCreate-----id:"+id); setContentView(id); //查找布局里的 控件 android:id="@+id/xx 这样的类型是归类到 id下面的 int tvb = getResources().getIdentifier("tvb","id",getPackageName()); Log.e("Unity","-----SDKActivity----onCreate-----id:"+tvb); TextView tvBB = (TextView) findViewById(tvb); tvBB.setText("TVVVVVVVVVVVVVVVV"); } }
我们把通过R.id.XX 获取资源iD的方式 改成getResources().getIdentifier 根据资源类型 和资源名称获取资源iD 第三个参数包名是R类的包名 也是工程的包名 看下图就理解了 (这是Library里分配的R类的id 最后要把资源和jar包放到其他工程时 就会重新分配ID的
然后打成jar包, 在Library 的build.gradle添加下面代码
task exportJar(type: Copy) {
delete 'build/libs/AndroidPlugin.jar'
from('build/intermediates/bundles/release/')
into('release/')
include('classes.jar')
///Rename the jar
rename('classes.jar', 'AndroidPlugin.jar')
}
exportJar.dependsOn(build)
然后执行Gradle任务如图
最后 把jar包拷贝到myApplication里使用 资源也要拷贝过来
AndroidManifest.xml里声明SDKActivity
调用结果