Android学习笔记_71_Android 多个项目之间如何引用 项目怎样打jar包
一、将整个项目作为资源文件
1、需要将被应用的项目设置为库项目。

2、将该项目的配置文件中的四大组件清空,例如下面代码:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.baidu.cn"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" /> <application
android:icon="@drawable/icon"
android:label="@string/app_name" >
</application> </manifest>
3、将四大组件的内容移动到主项目的配置文件中,将assets目录 libs目录下的文件也要移动过去。
4、在被引用的项目作为库项目导入到主项目中,通过 " 右键-》属性-》android-》add "就可以导入。如果被导入的项目也依赖其他库项目,那么该项目不需要导入其他库项目,将所以的库项目放到主项目中去。

5、注意事项:
5.1、库项目和主项目需要最好放在同一个工作空间下,不用从其他工作空间引用,否则上面显示的库项目有个红叉。
5.2、库项目不能在有自己定义的Application,可以将数据保存到单例类里面。
5.3、启动activity时,还是在库项目中启动,这是主项目只需要传递上下文对象和基本参数信息即可。就不会出现找不到activity的错误。
二、将项目打成jar包
将项目1的src(后台源码)目录下的文件打成jar包,重新建立一个项目2,然后将刚打成的jar包拷贝到项目2libs目录下,将项目1所有的资源文件(比如drawable,values,layout等资源目录)拷贝到项目2对应的目录下,将项目2作为资源文件就可以引入到其他项目中了,这样的好处是不对外暴露源码。
有两种方式完成后台代码与前端文件映射:
1、通过反射
public class MResource {
private static final String TAG = "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) {
Log.i(TAG, ": "+classes[i].getName());
if (classes[i].getName().split("\\$")[1].equals(className)) {
desireClass = classes[i];
break;
}
}
Log.i(TAG, ": "+desireClass.getName());
if (desireClass != null)
id = desireClass.getField(name).getInt(desireClass);
Log.i(TAG, "ID : "+desireClass.getName());
} catch (Exception e) {
e.printStackTrace();
}
return id;
}
}
2、简单映射
2.1、需要将项目2的R文件映射
public class ResourceMap {
public static final int getAnim_alpha_show=R.anim.alpha_show;
public static final int getAnim_translate_left_out=R.anim.translate_left_out;
public static final int getAnim_translate_right_in=R.anim.translate_right_in;
public static final int getArray_payment_moneys=R.array.payment_moneys;
public static final int getArray_payment_moneys_text=R.array.payment_moneys_text;
public static final int getArray_payment_types=R.array.payment_types;
public static final int getColor_backgroundcolor=R.color.backgroundcolor;
public static final int getColor_black=R.color.black;
public static final int getColor_blue=R.color.blue;
public static final int getColor_daoju_color=R.color.daoju_color;
public static final int getColor_gray=R.color.gray;
}
2.2、将项目2引入到项目1中,将类似R.color.gray替换成getColor_gray。可以通过搜索R.color.然后将其替换成ResourceMap.getColor_就可以了,同理drawable,anim,id,string都是一样。将项目1下的src(只打包src目录下的文件)打成jar包。
2.3、将项目2作为资源文件。
2.4、将R文件转换成ResourceMap的代码:其中RFile.java文件就是将项目2(与项目1的R文件是相同的,除非在项目2中增加其他额外信息)中的R.java文件内容拷贝其中。需要新建一个Java Project。
package com.example.test; import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader; public class ParseRFile { private static String filePath; public static void main(String[] args) throws Exception { //public static int getId_imageView1 = R.id.imageView1; File file = new File("src/RFile.java");
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("public class ResourceMap {\n"); BufferedReader reader = new BufferedReader(new FileReader(file));
String lineStr = null;
System.out.println("start...");
String className = null;
while ((lineStr = reader.readLine()) != null) {
lineStr = lineStr.trim();
if (lineStr.contains("public static final class")) {
className = lineStr.split(" ")[4];
}
if (lineStr.contains("public static final int")) {
String[] words = lineStr.split(" ");
String filed =words[4].split("=")[0];
stringBuffer.append("\tpublic static final int get"+firstWordUpper(className)+"_"+filed+"="+"R."+className+"."+filed+";\n");
} }
filePath = file.getAbsolutePath();
stringBuffer.append("}");
reader.close(); createFile(stringBuffer.toString()); System.out.println(filePath);
System.out.println("end ..."); } /**
* 首字母大写
* @param word
* @return
*/
public static String firstWordUpper(String word){
String first = word.substring(0, 1).toUpperCase();
String subStr = word.substring(1,word.length());
return first + subStr;
}
/**
* 创建资源文件
* @param source
*/
public static void createFile(String source){
try {
File file = new File("D:/project2/ZJava/src/ResourceMap.java");
if (file.exists()) {
file.delete();
}
file.createNewFile();
FileOutputStream out = new FileOutputStream(file);
out.write(source.getBytes(), 0, source.length());
out.close(); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}
Android学习笔记_71_Android 多个项目之间如何引用 项目怎样打jar包的更多相关文章
- 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...
- 【转】 Pro Android学习笔记(八四):了解Package(3):包间数据共享
目录(?)[-] 共享User ID的设置 共享资源例子 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowing ...
- 10月9日Android学习笔记:活动与服务之间的通信
最近在照着<第一行代码>这本书来学安卓,顺便记下笔记.主要的内容是Android中服务的第二种启动方式,通过活动绑定服务来启动服务,实现活动与服务之间的通信. 一. 首先创建一个服务类 p ...
- 【转】 Pro Android学习笔记(八三):了解Package(2):包签名过程
目录(?)[-] 类比例子 数字签名 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在W ...
- maven权威指南学习笔记(三)——一个简单的maven项目
目标: 对构建生命周期 (build lifecycle),Maven仓库 (repositories),依赖管理 (dependency management)和项目对象模型 (Project O ...
- 【转】 Pro Android学习笔记(七八):服务(3):远程服务:AIDL文件
目录(?)[-] 在AIDL中定义服务接口 根据AIDL文件自动生成接口代码 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.n ...
- Android学习笔记之JSON数据解析
转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...
- udacity android 学习笔记: lesson 4 part b
udacity android 学习笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 ...
- Android学习笔记36:使用SQLite方式存储数据
在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...
随机推荐
- centos7 中文乱码问题解决方法
1.查看是否安装中文包 可以使用下面的命名查看系统是否安装了中文安装包. locale -a |grep "zh_CN" 没有输出,说明没有安装,输入下面的命令安装: yum gr ...
- Android开发:使用Fragment改造TabActivity
TabActivity在API 13(Android 3.2)被标记为过期,需要使用Fragment来实现,Fragment是Android 3.0引入的一个概念,主要就是为了适应各种不同的屏幕大小( ...
- [openStack]使用Fuel安装OpenStack juno的fuel_master
安装OpenStack是一件很复杂的事情,特别是在想目中,如果一个组件一个组件,一台一台的coding部署,估计太消耗时间,而且出错的概率很高,所以使用工具推送部署的效率就很高了,而且必须得可靠.mi ...
- C#(Winform)的SaveFileDialog(文件保存对话框)控件使用
#region 保存对话框 private void ShowSaveFileDialog() { //string localFilePath, fileNameExt ...
- 新建maven工程index.jsp页面报错
引入servlet依赖jar <dependency><groupId>javax.servlet</groupId><artifactId>servl ...
- React.js 小书 Lesson11 - 配置组件的 props
作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson11 转载请注明出处,保留原文链接和作者信息. 组件是相互独立.可复用的单元,一个组件可能在不 ...
- JS字符串与二进制的相互转化
//字符串转ascii码,用charCodeAt(); //ascii码转字符串,用fromCharCode(); var str = "A"; var code = str.ch ...
- C#博客记录二
1.认识运算符 我认为其中 最重要的就是逻辑运算符,对于每个人来说学习web前端就是要有一个好的思维.能够更好的运用. 2.算数运算符 变量名++意味先输出,值后增加. ++变量名意味值先增加,后输出 ...
- Hashtable元素的删除
2中方法 Remove(); Clear(); static void Main(string[] args) { Hashtable ht = new Hashtable(); ht.Add(1,& ...
- JVM crash at ForUtil.readBlock
今天同学让帮忙看下JVM错误日志,才发现已经开始接触java3个月,还没看到相关错误日志.平时看的都只是程序运行时写入的日志,关于JVM的错误日志还真没看过.网上收集资料,整理如下. 一.日志文件: ...