多个android项目共用代码_android studio两个活动共用代码 - CSDN
  • Android开发多个项目共享一个Module

    千次阅读 2017-06-12 11:03:47
    简单的module依赖,需要将module库放在项目根目录下,然后再项目中以include ':Module'的方式引用,其他...想要只创建一个Module库,多个项目同时引用,做到只更改一次Module,在AndroidStudio上也是很容易就实现的...

    有段时间没有更新文章了,可能是自己最近重心偏离了航线,寻找真爱了,哈哈。


    在安卓开发中,我们维护的项目较多的时候,难免会有多个包含相同业务的项目。简单的module依赖,需要将module库放在项目根目录下,然后再项目中以include ‘:Module’的方式引用,其他项目需要用到同一个Module时,需要将Module拷贝到其他项目中再引用,Module需要改动时,就得多个项目一起改动,一定程度上增加了维护成本。

    想要只创建一个Module库,多个项目同时引用,做到只更改一次Module,在AndroidStudio上也是很容易就实现的,毕竟AndroidStudio提供了功能强大的项目配置方式。

    假如你的项目已经成功创建并引用了一个外部的Library,只需要做简单的修改,即可实现一个Module让所有项目共同享用,如下:
    将MyModule项目文件夹迁移到项目以外的任何一个文件目录,如(将MyModule放在项目上级文件目录中Library文件夹下),然后在所有需要引用此MyModule的项目的setting.gradle文件中做如下修改:

    include ':app'
    include ':MyModule'
    project(':MyModule').projectDir = new File("../Library", 'MyModule')

    app的build.gradle文件像往常一样在dependencies中编译即可:

    compile project(':MyModule')

    其实也就是给MyModule库的引用做一个路径指向。


    以上。本人技术有限,还望大牛路过多多指点。谢谢!

    展开全文
  • 多个项目共用模块

    2018-03-23 10:31:33
    这在eclipse中是很好实现的,而在Android studio中,我们一般都是抽成module,而一般这些module还是放在项目的根目录下的,要在另一个项目中使用,怎么办呢? 方法一: 将module拷贝到另一个项目的根目录下,在...

    我们在开发中可能会遇到同时开发几个app的情况,而这几个app在某些地方是相同的,而我们通常的做法是将相同的部分抽成一个library。这在eclipse中是很好实现的,而在Android studio中,我们一般都是抽成module,而一般这些module还是放在项目的根目录下的,要在另一个项目中使用,怎么办呢?

    • 方法一:

    将module拷贝到另一个项目的根目录下,在其settings.gradle 文件中的include 后面添加模块名。比如原来只有

    include ':app'

    然后我们添加一个utils模块:

    include ':app',':utils'

    最后别忘了在app那个build.gradle文件中的dependencies加上

    compile  project(":utils")

    大家应该发现了,这种办法挺笨的,如果一个app中的module有代码上的改变,就要将有改变的module拷贝,然后覆盖未被改变的module。

    其实我们有更好的办法,让两个app指向同一个module。

    • 方法二:

    我们在app的根目录的的同级目录(也就是你项目所在的目录),建立一个新的文件夹,比如命名为library,然后把module拷贝进去,在两个app的settings.gradle 文件中的include 后面修改或添加模块名。比如原来是

    include ':app', ':pushsdk'

    我们改成:

    include ':app', ':pushsdk'
    project(':pushsdk').projectDir = new File("../library", 'pushsdk')

    之后我们就可以共用这个library中的module了,是不是方便了很多(当然,两个项目得在同一个文件夹里面,library也在这个文件夹里面)。

    当有多个Module,并且Module又依赖于另一个Module时(嵌套Module),比如

    include ':app', ':photochooselibrary', ':mynciclib', ':sharesdk'
    project(':photochooselibrary').projectDir = new File("../library", 'photochooselibrary')
    project(':mynciclib').projectDir = new File("../library", 'mynciclib')
    project(':sharesdk').projectDir = new File("../library", 'sharesdk')
    //这里是嵌套的,具体就不写了

    然后只需要在App里的build.gradle里配置一行代码即可

     compile project(':sharesdk')

    如何出现问题一,如下

    Error:Execution failed for task ':app:processDebugManifest'.
    > Manifest merger failed : Attribute application@label value=(@string/app_name) from AndroidManifest.xml:8:9-41
        is also present at [:sharesdk] AndroidManifest.xml:15:9-45 value=(@string/dummy_button).
        Suggestion: add 'tools:replace="android:label"' to <application> element at AndroidManifest.xml:5:5-19:19 to override.

    这里应该也好理解,我就直接给出解决方案,只需在配置里配置这行代码

     xmlns:tools="http://schemas.android.com/tools"
    我的是这样
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="com.example.zdk.multimoduletest">

    最后在Application配置这行即可

     tools:replace="android:label,android:theme,android:icon"
    我的是这样
     <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme"
            tools:replace="android:label,android:theme,android:icon">

    如果出现问题二:不能找到module:
    首先将build.gradle(app)中的代码注释:

    // compile project(':sharesdk')
    

    然后对settings.gradle中的嵌套modele一条一条添加:

    第一步:

    include ':app',':photochooselibrary'
    project( ':photochooselibrary').projectDir = new File('../library','photochooselibrary')
    

    第二步:

    include ':app',':photochooselibrary',':mynciclib'
    project( ':photochooselibrary').projectDir = new File('../library','photochooselibrary')
    project( ':mynciclib').projectDir = new File('../library','mynciclib')
    

    第三步:

    include ':app',':photochooselibrary',':mynciclib',':sharesdk'
    project( ':photochooselibrary').projectDir = new File('../library','photochooselibrary')
    project( ':mynciclib').projectDir = new File('../library','mynciclib')
    project( ':sharesdk').projectDir = new File('../library','sharesdk')
    

    当项目左边目录显示

    build.gradle(Module:app)
    build.gradle(Module:mynciclib)
    build.gradle(Module:photochooselibrary)
    build.gradle(Module:sharesdk)
    

    说明成功了!然后将build.gradle(app)中的代码注释取消就可以了:

     compile project(':sharesdk')
    

    好了,就到这里吧!


    Android Studio如何引用外部Library工程

    (http://www.tuicool.com/articles/7JfQV3)

    展开全文
  • Android Studio中没有专门的Lib工程,公用代码库只能作为一模块搭载在工程上。 Android Studio的Git上传和检出的是以Project为最小单位的  如果用主模块来作为Lib库的根又不方便被其他Project引用   2. 只能...

    1. 事实如下:

    Android Studio中没有专门的Lib工程,公用代码库只能作为一个模块搭载在工程上。

    Android Studio的Git上传和检出的是以Project为最小单位的

            如果用主模块来作为Lib库的根又不方便被其他Project引用

     

    2. 只能“曲线救国”的方式来实现代码库的公用和同步

    先建立一个单独的工程用来“存储”和向GitHub提交代码

    接下来你可以在其他的Project中饮用这个模块,具体的方式是:File -> new -> Import Project

    这种方式并不是多个项目共享同一份代码,而是Copy代码的方式,之所以这样做是因为它比手动Copy代码操作简便且安全可靠

     

    然后选择你的Lib代码库项目并选择要导入的模块

     

     

    导入后就可以在你的工程中使用这个公用代码的副本了

     

    当对Lib进行了扩充或修改后,同步回公用库所在的Project。

    具体操作是:

    1. 右键要同步的目录或代码->Compare  With...   或选中后使用快捷键Ctrl+D

    2. 选择你要同步回去的路径

    3. 一个强大的代码对比和同步工具将呈现在你眼前....

     

     

     

    展开全文
  • 在开发中我们可能遇到各种需求,有时候公司为了渠道的推广或者制作马甲包,一套代码要打出多个App来。对于多个App的定义,首先applicationId不一样,可能App的名字也不一样,图标不一样,可能一些配置文件如服务地址...

    前言

    在开发中我们可能遇到各种需求,有时候公司为了渠道的推广或者制作马甲包,一套代码要打出多个App来。对于多个App的定义,首先applicationId不一样,可能App的名字也不一样,图标不一样,可能一些配置文件如服务地址,友盟的key等都不一样,但又确实是一套代码。为了不分出多的项目,避免后期更新麻烦,那么就需要我们类似多渠道配置进行配置。

    实现思路

    假设:当前代码需要打出两个APP,APP的不同点个前言说的一样
    
    1. 将两个APP的信息使用数组存入到一个json文件中,分别设置好标识,
    2. 创建文件夹A,并在文件中存放两个APP的图标
    3. 创建文件夹B,并存放两个APP所对应的信息,如APP名字,applicationId等。将json文件和A、B文件夹同放在一个文件夹channel_config下,并将这个文件夹存放在与app目录同级的目录下
    4. 在AndroidManifest.xml中将icon和名称设置为可配置
    5. 在app下build.gradle文件中defaultConfig下配置manifestPlaceholders,设置默认名称和icon
    6. 在app下build.gradle文件中创建 productFlavors,进行多渠道配置。主要是重新设置icon、app 名称,applicationId等
    7. 在app下build.gradle文件中创建sourceSets,进行重新指定图片路径。

    具体实现

    目录结构

    首先看一下channel_config的目录情况,以及json的信息,下面可以看到jngi目录和yzxy目录下就只是放了icon,这是后面需要指定路径的,这里要注意,jngi这个目录要和channels文件中的名字对应,要和groupAll.josn 中的channel_name对应。还有,jngi和yzxy目录下的文件,res-style-blue和res-style-yellow下的目录要和app下面的目录文件位置和名字要保持一致

    在这里插入图片描述
    在这里插入图片描述

    接下来我们看看groupAll.json的类容,这里定义了一个数组,channel_name是一个标识,用于在icons和channels目录下寻找资源。label代表这个是哪个App的配置,COLOR_STYLE表示这个App的主题颜色是什么

    	[
      {
        "channel_name": "yzxy",
        "label": "反清",
        "COLOR_STYLE": "blue"
      },
      {
        "channel_name": "jngj",
        "label": "复明",
        "COLOR_STYLE": "yellow"
      }
    ]
    

    将icon和label设置为可配置

    我们直接看AndroidManifest.xml文件,其中 tools:replace="android:icon,android:label,android:theme"这个很关键,意思是:将低优先级清单中的指定属性替换为 此清单中的属性。 换言之,始终保持 高优先级清单的值,下面developer.android中讲的很清楚
    合并多个清单文件

    	<?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="com.cs.demo">
    
        <application
            android:allowBackup="true"
            android:hardwareAccelerated="true"
            android:icon="${icon}"
            android:label="${label}"
            android:supportsRtl="true"
            android:theme="@style/AppTheme"
            tools:replace="android:icon,android:label,android:theme">
    
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    

    build.gradle配置

    在 gradle.properties中添加 GROUP=All,当App打包很多的时候,打批包要很长时间,我们可以多创建几个groupAll.josn,中间放不容的App配置,那么就可以进行分批打包,比如groupType1,GROUP=Type1,进行指定

    	import groovy.json.JsonSlurper
    
    apply plugin: 'com.android.application'
    
    
    android {
        compileSdkVersion 28
        defaultConfig {
            applicationId "com.cs.demo"
            minSdkVersion 16
            targetSdkVersion 28
            versionCode 1
            versionName "1.0.0"
            resConfigs "zh"
    
            // 设置MultiDex可用
            multiDexEnabled true
    
            flavorDimensions "versionCode"
            javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true } }
            //配置默认的app图标和名字
            manifestPlaceholders = [
                    label        : "反清",
                    icon         : "@drawable/yzxy"
    
            ]
        }
    
    
        buildTypes {
            release {
                //混淆
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
            debug {
                //混淆
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                
                buildConfigField "String", "BASE_URL", "\"https://www.baidu.com\"" //配置debug的服务器地址
    
            }
    
        }
    
        productFlavors {
    //在 gradle.properties中添加 GROUP=All
    //读取channel_config下json文件
            def json = file("${rootProject.projectDir.path}/channel_config/group${GROUP}.json").getText("UTF-8")
    //读取app目录下的channel.json文件内容
    
            def flavors = new JsonSlurper().parseText(json) //转换成Jsons数组对象
            flavors.each { flavor ->
    //循环flavors数组
                def fileName = flavor.channel_name
                def channelJson = file("${rootProject.projectDir.path}/channel_config/channels/${fileName}.json").getText("UTF-8")
                def qudao = new JsonSlurper().parseText(channelJson) //转换成Jsons数组对象
                def INDEPENDENT_URL = flavor.INDEPENDENT_URL
                "${flavor.channel_name}" {//渠道名称,对应文件中的channel_name
                    //单独服务地址
                    if ("Y".equals(INDEPENDENT_URL)) {
                        buildConfigField "String", "BASE_URL", "\"${qudao.BASE_URL}\"" //服务器地址
                    }
    
                    buildConfigField "String", "COLOR_STYLE", "\"${qudao.COLOR_STYLE}\"" //主题颜色
                    applicationId qudao.applicationId
                    buildConfigField "String", "APP_NAME", "\"${qudao.label}\"" //应用名称
    
                    manifestPlaceholders = [
                            icon        : qudao.icon,//APP要显示的ICON图标,对应文件中的icon
                            label       : qudao.label,
                            channel_name: flavor.channel_name
                    ]
                }
            }
        }
    
        sourceSets {
            def json = file("${rootProject.projectDir.path}/channel_config/group${GROUP}.json").getText("UTF-8")
            //读取app目录下的channel.json文件内容
            def flavors = new JsonSlurper().parseText(json) //转换成Jsons数组对象
            flavors.each { flavor ->
                def colorstyle = flavor.COLOR_STYLE
                "${flavor.channel_name}" { //渠道资源配置
                    if (colorstyle.equals("blue")) {
                    //单独指定两个资源文件,一个替换res-style-blue下目录文件,一个替换icons下文件
                        res.srcDirs = ["src/res-style-blue", "${rootProject.projectDir.path}/channel_config/icons/${flavor.channel_name}"]
                       
                    }
                    if (colorstyle.equals("yellow")) {
                        res.srcDirs = ["src/res-style-yellow", "${rootProject.projectDir.path}/channel_config/icons/${flavor.channel_name}"]
                        //指定资源目录
                    }
                }
            }
        }
    
        //修改apk名
        applicationVariants.all { variant ->
            variant.outputs.all { output ->
                def outputFile = output.outputFile
                if (outputFile != null && outputFile.name.endsWith('release.apk')) {
                    // 输出apk名称为xxx_v1.1.1_20171005-21:23:30.apk
                    def fileName = "${variant.flavorName}_v${variant.versionName}_${releaseTime()}_release.apk"
                    outputFileName = new File(fileName)
                }
                if (outputFile != null && outputFile.name.endsWith('debug.apk')) {
                    // 输出apk名称为xxx_v1.1.1_20171005-21:23:30.apk
                    def fileName = "${variant.flavorName}_v${variant.versionName}_${releaseTime()}_debug.apk"
                    outputFileName = new File(fileName)
                }
            }
        }
    
    
    }
    
    def releaseTime() {
        return new Date().format("yyyyMMdd_HH_mm_ss", TimeZone.getTimeZone("GMT+8:00"))
    }
    
    
    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation 'com.android.support:appcompat-v7:28.0.0'
        implementation 'com.android.support.constraint:constraint-layout:1.1.3'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'com.android.support.test:runner:1.0.2'
        androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    
    }
    
    

    基本完成了上面的需要,Demo,不懂请留言

    展开全文
  • 如果你的公司开发了一个项目,但是这个项目应用于不同的客户,根据客户的不同要求,会改动一些东西,之前我们的做法是直接将这套代码复制出来,替换logo,applicationId,以及一些基本配置(如baseurl,等配置),简单...
  • 我们可以把库模块做成一个jar,由多个项目工程引用。不过有时我们会希望以源文件源项目的方式来引用库模块,这样可以对库模块文件临时做修改调试等等。 我们首先建立两个最简项目工程,其一叫MyProj1,其二叫MyProj...
  • Android同一套代码多个APP包并能够在同一个手机上安装运行Android同一套代码多个APP包并能够==在同一个手机上安装运行==,同时==APP名称、桌面icon图标也都不同==给同一套代码起不同的多个包名,并把APP名称和...
  • 安卓开发 第九篇 多个项目共用模块

    千次阅读 2016-07-10 19:00:35
    最近忙新项目的事情,都没有时间写博文了,惭愧惭愧...这在eclipse中是很好实现的,而在Android studio中,我们一般都是抽成module,而一般这些module还是放在项目的根目录下的,要在另一个项目中使用,怎么办呢?方法
  • 我有两个项目都在使用Android Studio,一个是server项目,另一个是client项目,同时我有一个library...今天我要创建一个共享的library项目,在两个Android Studio项目都能同时使用。调整后的目录结构如下:src/andro...
  • android include 共用布局

    2019-07-20 18:23:58
    假设我们现在有一个 textView多个界面公用,如果每个界面都写一个 那么 就比较耗费时间,耗费资源,我们通过 include 的方式 来进行 公用资源的加载 代码结构 2)until_text.xml 文件 公用的 textView...
  • 例如我的项目里面有app,moduleA,moduleB,我自己写了一工具jar。 两module和app中都需要使用这jar,只能每都引用一遍吗?有没有方法是只引用一次,所有module都能使用呢?
  • AndroidListView共用万能的BaseAdapter升级之前的MyAdapter.javapackage run.yang.com.listviewactivedemo;import android.content.Context; import android.view.LayoutInflater; import android.view.View...
  • AndroidStudio 多个项目依赖同一个lib 1、在settings.gradle文件中添加引用代码如下:CommonLibrary是公共的lib库,project 指定lib的磁盘目录 include ':CommonLibrary' project (':CommonLibrary')....
  • 创建Android的公共库,但Android Studio默认的导入库的方式会将整个库的文件拷贝到项目目录下,也就是说这库不再是公共的了,这样显然不行,修改公共库需要到每目录下分别修改,太麻烦了,或者使用git+ 服务器...
  • 多个Activity之间共用一个Socket实例

    千次阅读 2017-07-14 21:38:27
    多个活动共用socket实例的三种方法。单列模式(静态socket变量);application实体类;socket封装在service中
  • fragment是用代码实现,不是用xml。两activity使用同一fragment如何实现,
  • 用的eclipse的同学都知道...当你把eclipse的多个项目及library迁移至AndroidStudio中,你会发现你原来的N个项目变成N个项目空间,每个项目里都包含了一份同样的library,这样的library维护起来太痛苦了。于是要...
  • Android MVP(五)多个 Presenter 依赖注入

    万次阅读 多人点赞 2020-01-23 19:32:48
    本文由博主威威喵原创,请支持与指教。 本文首发于此 博主:威威喵|博客主页:https://blog.csdn.net/smile_running MVP 架构系列文章: Android MVP 架构(一)MVP 架构介绍与实战运用 Android MVP 架构...
  • 1.多个Activity共用相同布局或者相同控件:避免重复代码关键代码是onPostOnCreate(); BaseActivit代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
  • 问题一:Fragment如何封装成可复用的形式 ?... 直接上代码代码项目中的,没有另写demo,具体代码参见android版小晴打卡FaceSign :   MainTabRecord 继承了 Fragment: static MainTabRecord newInstance
1 2 3 4 5 ... 20
收藏数 12,932
精华内容 5,172
关键字:

多个android项目共用代码