zoukankan      html  css  js  c++  java
  • 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 {
    ");
    
            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("	public static final int get"+firstWordUpper(className)+"_"+filed+"="+"R."+className+"."+filed+";
    ");
                }
         
            }
            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();
            }
            
        }
    }
  • 相关阅读:
    apache的并发
    PHP 文件上传
    打包备份3天
    dz改写CSS
    linux cifs自动挂载远程windows硬盘或文件夹
    C++面向对象
    "i++"和"++i"
    《程序员面试宝典》一个程序
    《程序员面试宝典》强制转换,内存地址
    《程序员面试宝典》编程技巧--位运算
  • 原文地址:https://www.cnblogs.com/lbangel/p/3681145.html
Copyright © 2011-2022 走看看