gpt4 book ai didi

android - 我们如何引用位于Android Main Project目录之外的自定义Android和Java库?

转载 作者:行者123 更新时间:2023-11-29 00:03:02 24 4
gpt4 key购买 nike

引用库的常规设置是Android Studio将库导入到主项目的根目录中。这并不是我们真正想要的,因为库的本质好处是要在许多项目之间共享它。如果我们更新导入的库中的代码,那么这将不会反映在先前导入到另一个项目中的库的代码中。

相反,我们的目标是创建一个Main Android项目,该项目可以引用存在于Android项目目录之外的自定义(您创建的)Android和Java库模块,并能够从Main内部编辑所有三个模块的代码。 Android项目。也就是说,我们最终要得到:


属于我们的Android主项目的根模块(“应用”);
一个Android库模块,该模块位于Android项目目录之外,但由我们的Main Android项目引用。
一个Java库模块,存在于Android项目目录之外,但由我们的Main Android项目引用。


...例如,所以我们有一个目录结构,例如...

..\LibraryRefDemo\MyMainProject
..\LibraryRefDemo\Libraries\MyAndroidLibrary
..\LibraryRefDemo\Libraries\MyJavaLibrary


标题问题换句话说,“我们如何做到这一点?”。

存在类似的stackoverflow问题,例如...


Android studio add external project to build.gradle
How to share a single library source across multiple projects


但是我发现这些问题和答案都只能部分解决我在此处提出的问题。

我将提供我自己的问题的答案,我相信,它列举了所有的技巧和陷阱,并提供了逐步的过程。

我将使用Android Studio 3.0.1 ...

最佳答案

目录


命名和目录约定
基本技巧
创建主要的Android项目
创建自定义Android库
从Android主项目引用自定义Android库
创建Java库/模块
主项目中的参考Java库
请编辑


命名和目录约定

首先,我们建立命名和目录约定(如果您不喜欢以下约定,请建立自己的约定)。

项目名称:PascalCase。

..\LibraryRefDemo\MyMainProject
..\LibraryRefDemo\Libraries\MyAndroidLibrary
..\LibraryRefDemo\Libraries\MyJavaLibrary


创建新项目向导>创建Android项目:

Application Name: MyMainProject
Project Location: ..\MyMainProject

包名:小写。

// (package name for MyMainProject's root module: "app")
au.com.example.mymainproject

// (package name for MyAndroidLibrary's root module: "malmodule")
au.com.example.malmodule

// (package name for MyJavaLibrary' module where we placed our
// java code to be shared: "mjlmodule")
au.com.example.mjlmodule


模块名称:小写。以下之一:

app (MyMainProject's root module)
malmodule (MyAndroidLibrary's root module)
mjlmodule (The MyJavaLibrary's module where we placed our java code to be
shared. The MyJavaModule will also contain a root "app" module
for reasons of gradle integration)


基本技巧

截至2018年3月10日,以下基本技巧以及后续的分步过程是针对Android Studio 3.0.1的最新版本。
在逐步操作之前,完成此工作的基本技巧是:


使用Android Studio而不是另一个IDE(例如IDEA IntelliJ)来创建MyMainProject,MyAndroidLibrary和MyJavaLibrary。设置基本框架后,即可从任何现有项目中复制代码和资源(例如,使用Windows资源管理器)。
在Android主项目(“ MyMainProject”) settings.gradle (Project Settings)中,我们使用以下内容引用库模块(而不是类似的库项目):

include ':app'

include ':malmodule'
// Despite the name "project" we actually need to reference the module directory
// of a project. It doesn't matter whether there is a trailing slash '/' or not.
project(':malmodule').projectDir =
new File(settingsDir, '../Libraries/MyAndroidLibrary/malmodule/')

include ':mjlmodule'
// Despite the name "project" we actually need to reference the module directory
// of a project. It doesn't matter whether there is a trailing slash '/' or not.
project(':mjlmodule').projectDir =
new File(settingsDir, '../Libraries/MyJavaLibrary/mjlmodule/')

在Android项目(“ MyMainProject”)根模块的build.gradle文件中,默认为 build.gradle (Module: app),添加:

dependencies {
...
// Reference module rather than project.
implementation project(':malmodule')
implementation project(':mjlmodule')
...
}

创建MyJavaLibrary时,请使用独立安装的JDK,而不要使用Android的Embedded JDK:


文件>项目结构> | SDK位置| > JDK位置:


“使用嵌入式JDK(推荐)”:未选中。
C:\ Program Files \ Java \ jdk1.8.0_161


不要删除MyJavaLibrary项目的根模块app。


分步过程如下。字符串中的正斜杠“ /”将代表“项目”窗格,Android视图中的路径(从组合框中选择)。字符串中的反斜杠“ \”将表示文件系统中的路径…

创建主要的Android项目

创建一个Android项目(“ MyMainProject”):


打开{Android Studio}到“欢迎使用Android Studio”屏幕> [开始一个新的Android Studio项目]…
向导“创建新项目”> |“创建Android项目”:


应用程序名称(概念上,这也是“项目名称”): MyMainProject
公司域: example.com.au
项目位置: ..\LibraryRefDemo\MyMainProject
软件包名称: au.com.example.mymainproject
[下一个]

向导|目标Android设备:选择外形尺寸和最小SDK |。接受默认值(或根据需要)。 [下一个]。
向导|将活动添加到移动设备|。空活动。 [下一个]。
向导|配置活动|。向后兼容性(AppCompat):未选中(或根据需要)。 [完]
添加一些“ hello world”资源和代码。在项目窗格中切换到Android视图(从组合框):


RES /布局/activity_main.xml。添加ID。

<TextView
android:id="@+id/mymainproject_output"
android:layout_width="wrap_content"

res / values / strings.xml。添加字符串资源。

<string name="mymainproject_cool_string">From My Main Project</string>

au.com.example.mymainproject.MainActivity。 Java代码中的参考字符串资源。

public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

TextView textView = (TextView) findViewById(R.id.mymainproject_output);
String someString = getResources().getString(R.string.mymainproject_cool_string) + "\r\n";
textView.setText(someString);
}
}


要正确导入引用的类,您可能必须:在TextView上插入光标; alt +输入;

针对模拟器运行以确认OK:运行>运行应用程序(Shift + F10)...“选择部署目标”>(单击所需的可用虚拟设备)> [确定]。
等待gradle完成构建。观察应用程序中的字符串:

From My Main Project



创建自定义Android库

首先,我们创建另一个普通的Android项目,然后将其变成一个Android库。

将库创建为另一个普通的Android项目:


在Android Studio中,关闭打开的项目(如果已打开)。
打开{Android Studio}到“欢迎使用Android Studio”屏幕> [开始一个新的Android Studio项目]:


向导“创建新项目”,|创建Android项目|。


应用名称: MyAndroidLibrary
公司域: example.com.au
项目位置: ..\LibraryRefDemo\Libraries\MyAndroidLibrary
包裹名字。 [编辑]: au.com.example.malmodule(我们使用此名称而不是默认名称来使我们稍后清楚地知道我们直接引用模块而不是项目)。
[下一个]

向导|“目标Android设备” |:“选择外形尺寸和最小的“ SDK”。接受默认值(或根据需要)。
向导|向移动设备添加活动| >空活动> [下一步]。
向导|配置活动|。向后兼容性(AppCompat):未选中(或根据需要)。 [完]

等待gradle完成构建。
{Android Studio}>项目窗格> Android视图(从组合框)>“应用”>右键单击>重构...>重命名: malmodule
添加一些hello-world类型代码:


在malmodule / res / values / strings.xml中,添加:

<string name="myandroidlibrary_cool_string">From My Android Library</string>

../ res / layout / activity_main.xml(文本视图)。添加ID。

<TextView
android:id="@+id/myandroidlibrary_output"
android:layout_width="wrap_content"

在.. \ LibraryRefDemo \ Libraries \ MyAndroidLibrary \ malmodule \ src \ main \ java \ au \ com \ example \ malmodule \ MainActivity.java中,将其添加到onCreate方法(并导入相关类,并在光标上方输入Alt + enter进入TextView):

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

TextView myText = (TextView) findViewById(R.id.myandroidlibrary_output);
String someString = getResources().getString(R.string. myandroidlibrary_cool_string) + "\r\n";
myText.setText(someString);
}
}


要正确导入引用的类,您可能必须:在TextView上插入光标; alt +输入;

从其他位置复制任何现有的代码(和资源)。将android代码复制到:.. \ LibraryRefDemo \ Libraries \ MyAndroidLibrary \ malmodule \ src \ main \ java \ au \ com \ example \ malmodule
验证它可以作为项目运行:运行>运行'malmodule'。等待gradle完成构建。在模拟器中观察字符串:

From My Android Library



(从上开始)将项目的模块转换为Android库:


{Android Studio}>项目面板> Android视图> Gradle脚本> build.gradle(模块:malmodule)>双击(打开)。然后 ...

// Change ...
apply plugin: 'com.android.application'

// To ...
apply plugin: 'com.android.library'

同样在build.gradle中(模块:malmodule)注释掉applicationID。

...
android {
compileSdkVersion 26
defaultConfig {
// applicationId "au.com.example.malmodule"
...


如果我们想将malmodule作为普通Android项目重新运行以进行测试,请注释掉而不是删除。
Android Studio 1.0 and error "Library projects cannot set applicationId"
工具> Android>使用Gradle文件同步项目(或单击黄色提示栏中的“立即同步”链接)。等待gradle构建完成。


从Android主项目引用自定义Android库

要引用您的自定义Android库项目(位于主项目目录的外部):


{Android Studio}>文件>打开最近的> MyMainProject>'打开项目'> [此窗口]。
项目窗格> Android视图(从下拉菜单中)。
打开MyMainProject的 settings.gradle (Project Settings)文件。如下添加 :malmodule引用。

include ':app'

include ':malmodule'
// Despite the name "project" we actually need to reference the module directory
// of a project. It doesn't matter whether there is a trailing slash '/' or not.
project(':malmodule').projectDir =
new File(settingsDir, '../Libraries/MyAndroidLibrary/malmodule/')

打开MyMainProject的根模块的build.gradle文件(即 build.gradle (Module: app)),然后添加...

dependencies {
...
// Reference module rather than project.
implementation project(':malmodule')
...
}

工具> Android>使用Gradle文件同步项目(或单击黄色提示栏中的“立即同步”链接)。
观察到恶意模块的源文件现在可以通过项目窗格访问(例如在Android View中)。
验证您可以从库中引用字符串资源:


检查..malmodule / res / values / strings.xml中的以下字符串...

<string name="myandroidlibrary_cool_string">From My Android Library</string>

检查MyMainProject app / res / layout / activity_main.xml ...

<TextView
android:id="@+id/mymainproject_output"
android:layout_width="wrap_content"
...

在Main Project app / java / au.com.example.mymainproject / MainActivity中添加对myandroidlibrary_cool_string的引用。

public class MainActivity extends Actvity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

TextView myText = (TextView) findViewById(R.id.mymainproject_output);
String someString = getResources().getString(R.string.mymainproject_cool_string) + "\r\n";
someString += getResources().getString(au.com.example.malmodule.R.string.myandroidlibrary_cool_string) + "\r\n";
myText.setText(someString);

}
}

从库清单中注释掉MAIN / LAUNCHER的意图。否则,您的应用程序的两个图标将出现在应用程序抽屉中。

<activity android:name=".MainActivity">
<!-- Don't make a main/launcher activity when being called by main app -->
<!--<intent-filter>-->
<!--<action android:name="android.intent.action.MAIN" />-->

<!--<category android:name="android.intent.category.LAUNCHER" />-->
<!--</intent-filter>-->
</activity>

运行您的主项目。运行>运行应用程序(Shift + F10)。等待gradle构建并等待仿真器加载您的应用。观察来自库的字符串反映在模拟器中:

From My Main Project
From My Anroid Library

更改..malmodule / res / values / strings.xml中的字符串

<string name="myandroidlibrary_cool_string">My Android Library XXX</string>

运行>应用更改(Ctrl + F10)。等待gradle构建,然后让仿真器重新加载您的应用。观察到更改后的字符串反映在模拟器中。


(Google,n.d。Gradle插件用户指南) http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Library-projects
(Goolge Android工具,2014年。开发>工具) https://developer.android.com/studio/projects/android-library.html


创建Java库/模块

使用Java库模块创建项目...

首先使用Android模块创建一个普通的Android项目:


如果打开,则关闭当前项目。
打开{Android Studio}到“欢迎使用Android Studio”屏幕> [开始一个新的Android Studio项目]:
向导“创建新项目”


|创建Android项目|


应用名称: MyJavaLibrary
公司域: example.com.au
项目位置:.. \LibraryRefDemo\Libraries\MyJavaLibrary
程序包名称: au.com.example.myjavalibrary(这将是根模块的名称空间,我们的Java代码将存在于我们随后将创建的另一个模块和名称空间中)。 [下一个]

|定位Android设备|。接受默认值(或根据需要)。 [下一个]
|向移动设备添加活动| >“不添加活动”。 [完]

打开项目窗格。从组合框中选择“ Android”视图。
观察者有一个“应用程序”模块。我们将创建一个附加模块...


创建一个Java库模块:


文件>新建...>新建模块...
向导“创建新模块”。


|新模块| > Java库。 [下一个]
| Java库| “配置新模块”。


库名称: mjlmodule
Java套件名称: au.com.example.mjlmodule
Java类名称: Start
[完]




不要删除MyJavaLibrary项目的根模块app。如果这样做,默认情况下,您的mjlmodule将成功运行一次,但后续的代码更新将不会合并到第二次和后续运行中。

可能有一种方法可以正确整理gradle文件,但是我对gradle的了解有限。

在您的Java库模块中,输入以下代码:


在新创建的Java类中,单击开始,添加一个main方法。确保您的main方法具有正确的签名(具体包括“ String [] args”)。例如,将以下类用于世界。 mjlmodule / java / au.com.example.mjlmodule /开始...

package au.com.example.mjlmodule;

public class Start {
public static void main(String[] args) {
System.out.println(getCoolString());
}

// Must be public because we want to reference the method directly later
public static String getCoolString() {
return "From My Java Library";
}
}

项目窗格> Android视图(从组合框)> Gradle脚本> build.gradle (Module: mjlmodule)


验证是否正确应用插件集:

apply plugin: 'java-library'

验证依赖关系,如下所示:

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
}

// You can delete or comment out ...
//sourceCompatibility = "1.7"
//targetCompatibility = "1.7"

使用独立安装的JDK,而不是Android的Embedded JDK。


文件>项目结构...> | SDK位置| > JDK位置:


“使用嵌入式JDK(推荐)”:未选中。
C:\ Program Files \ Java \ jdk1.8.0_161


工具> Android>使用Gradle文件同步项目(或单击黄色提示栏中的“立即同步”链接)。
运行>编辑配置…


单击加号+符号>应用
名称: MyJavaRun
主分类: au.com.example.mjlmodule.Start
工作目录:... \LibraryRefDemo\Libraries\MyJavaLibrary
使用模块的类路径: mjlmodule
JRE: Default
[好]

验证模块可以运行...


在运行三角形附近的工具栏上,确保已选择“ MyJavaRun”配置。单击运行绿色三角形。
(在gradle构建之后)在“运行”窗格中观察字符串输出:

From My Java Library





从其他地方复制Java代码文件(如果有):


将Java代码复制到:.. \ LibraryRefDemo \ Libraries \ MyJavaLibrary \ mjlmodule \ src \ main \ java \ au \ com \ example \ mjlmodule。
您可能必须在复制的代码中更改程序包名称。
在Android Studio的“项目窗格”中,观察这些文件的显示情况(您可能需要等待刷新事件。如有必要,请重新启动{Android Studio}以强制刷新)。


再次测试运行配置,确定:


对您的代码进行一些更改,例如:

public class Start {
public static void main(String[] args) {
System.out.println(getCoolString());
}

// Must be public because we want to reference the method directly later
public static String getCoolString() {
return "From My Java Library YYY";
}
}

在运行三角形附近的工具栏上,确保已选择“ MyJavaRun”配置。单击运行绿色三角形。
在“运行”窗格中观察更新后的字符串。

From My Java Library YYY



请注意,由于不支持最新的gradle插件,自2018年3月3日起,Intellij IDEA 2017.3无法运行MyJavaLibrary。我希望这将从IDEA 2018.1发生变化。

见...


  有时它将在3.0-alpha2和插件的最终3.0版本之间停止工作。
  
  gradle插件导出到Studio / IJ以设置项目的模型正在发生重大变化。现在,它以新旧两种方式发送信息,尽管根据构建设置,前者并不总是准确的。这将很快改变,这将破坏IJ,直到他们可以捆绑Studio插件3.0。


https://www.reddit.com/r/androiddev/comments/6c71av/using_android_gradle_plugin_300alpha1_with/dhssvlk/
Can't use Android Gradle Plugin 3.0.+ with IntelliJ IDEA

主项目中的参考Java库

从MyMainProject引用MyJavaLibrary模块(“ mjlmodule”):


{Android Studio}>文件>打开最近的> [MyMainProject]。在[此窗口]中打开。
在Android项目(“ MyMainProject”) settings.gradle (Project Settings)中添加mjlmodule信息:

include ':app'

include ':malmodule'
// Despite the name "project" we actually need to reference the module directory
// of a project. It doesn't matter whether there is a trailing slash '/' or not.
project(':malmodule').projectDir =
new File(settingsDir, '../Libraries/MyAndroidLibrary/malmodule/')

include ':mjlmodule'
// Despite the name "project" we actually need to reference the module directory
// of a project. It doesn't matter whether there is a trailing slash '/' or not.
project(':mjlmodule').projectDir =
new File(settingsDir, '../Libraries/MyJavaLibrary/mjlmodule/')

在MyMainProject的根模块 build.gradle (Module:app)中,添加mjmodule信息:

dependencies {
implementation project(':malmodule')
implementation project(':mjlmodule')
...
}

工具> Android>使用Gradle文件同步项目(或单击黄色的提示栏“立即同步”)。
观察mjlmodule现在在Project Pane(Android View)中被引用了。
按照上面的“创建Java项目/模块”中的指定添加运行配置。
请注意,我们可以使用Android的Embedded JDK,因为我们可以正常运行Java模块(大概是因为我们有一个带有完整根android模块的项目)。
验证模块可以作为Java App运行...


在运行三角形附近的工具栏上,确保已选择“ MyJavaRun”配置。单击运行绿色三角形。
在“运行”窗格中观察字符串输出:“来自My Java库YYY”。

验证您可以从MyMainProject引用MyJavaLibrary中的字符串资源:


在..LibraryRefDemo \ Libraries \ MyJavaLibrary \ mjlmodule \ src \ main \ java \ au \ com \ example \ mjlmodule \ Start.java中验证

package au.com.example.mjlmodule;

public class Start {
public static void main(String[] args) {
System.out.println(getCoolString());
}

// Must be public because we want to reference the method directly later
public static String getCoolString() {
return "From MyJavaLibrary YYY";
}
}

在MyMainProject中验证app / res / layout / activity_main.xml

<TextView
android:id="@+id/mymainproject_output"
android:layout_width="wrap_content"
...

在MyMainProject中添加一些代码以从MyJavaLibary拾取代码。在MyMainProject / app / java / au.com.example.mymainproject / MainActivity中添加对mjlmodule字符串的引用...

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

TextView textView = (TextView) findViewById(R.id.mymainproject_output);
String someString = getResources().getString(R.string.mymainproject_cool_string) + "\r\n";
someString += getResources().getString(au.com.example.malmodule.R.string.myandroidlibrary_cool_string) + "\r\n";
someString += au.com.example.mjlmodule.Start.getCoolString() + "\r\n";
myText.setText(someString);

}
}

运行MyMainProject。在工具栏上,选择“应用程序”配置。单击绿色箭头。
如果出现错误“无法安装”,则依次选择“生成”>“清理MyMainProject”。
观察来自库的字符串反映在模拟器(或连接的设备)中。

From MyMainProject
From My Android Library XXX
From My Java Library YYY


修改MyJavaLibrary中的字符串。 ... \ LibraryRefDemo \ Libraries \ MyJavaLibrary \ mjlmodule \ src \ main \ java \ au \ com \ example \ mjlmodule \ Start.java

public static String getCoolString() {
return "From My Java Library ZZZ";
}

运行>应用更改。观察该字符串反映在您的仿真器(或连接的设备)中。

From MyMainProject
From My Android Library XXX
From My Java Library ZZZ



请编辑

如果出现以下情况,请大胆编辑答案:


有错误;
它变得过时了。
您觉得可以使事情变得更清晰。
您可以简化步骤;要么
您可以想到进行编辑的其他一些很好的理由。


更新:


2018-03-14 04:52Z。首次发布...遵循过一次程序,并已对其完整性和正确性进行了审查(进行了一些小的更正)。捷豹
2018-10-16 04:11Z。在“从主Android项目引用自定义Android库”中添加了注释自定义Android库的MAIN / LAUNCHER意图的步骤。

关于android - 我们如何引用位于Android Main Project目录之外的自定义Android和Java库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49268039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com