我正在开发一个我希望分发给其他开发人员的库项目.
在互联网上有很多关于这个主题的讨论,人们建议创建一个分发版本库项目,其中只包含我的库项目的jar和其他资源.这听起来不错.
然后,我突然发现有人建议创建Android Archive Library(AAR).但他们都使用名为Gradle的工具
我正在将Eclipse与Maven一起用于我的Android库项目.我的问题是,是否有可能为我的android库项目生成AAR实现 而不使用Gradle但仅使用Maven?如果是这样,怎么样?
我为应用程序开发了一个自定义首选项.它有两个自定义属性.我正在尝试将Preference移动到库项目以在其他项目中重用.我将Java文件与相应的布局和attr XML文件一起移动.这是库项目中的attr文件:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="NumberPickerPreference" >
<attr name="minValue" format="integer" />
<attr name="maxValue" format="integer" />
</declare-styleable>
</resources>
Run Code Online (Sandbox Code Playgroud)
这是清单:
<manifest package="com.mydomain.androiduilibrary">
</manifest>
Run Code Online (Sandbox Code Playgroud)
一个奇怪的表现肯定.当我生成库项目时,Android Studio中唯一放入清单的是SDK信息,然后生成一个警告,它已经在build.gradle文件中指定了,所以我删除了清单中的条目.
我使用bundleRelease任务生成AAR文件,并获取名为androiduilibrary-release.aar的文件.然后我转到需要使用此Preference的项目并选择"New Module | Import .JAR或.AAR Package",导航到AAR,它现在在我的项目中作为名为androiduilibrary-release的模块.我在Project Structure对话框中创建了一个模块依赖项,现在可以在Java代码中引用Preference.到现在为止还挺好.
但是,当我尝试在XML中引用Preference时,我的自定义属性出现以下错误:"错误:(9)在"com.mydomain.androiduilibrary"包中找不到属性"minValue"的资源标识符.这是XML:
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/location_service_settings_preference_header_title"
xmlns:custom="http://schemas.android.com/apk/res/com.mydomain.androiduilibrary">
<com.mydomain.androiduilibrary.NumberPickerPreference
android:title="@string/update_interval_preference_title"
android:key="@string/update_interval_preference_key"
android:defaultValue="@integer/update_interval_preference_default"
android:summary="@string/update_interval_preference_summary"
custom:minValue="@integer/update_interval_preference_min"
custom:maxValue="@integer/update_interval_preference_max"
android:dialogMessage="@string/update_interval_preference_dialog_message"
android:dialogTitle="@string/update_interval_preference_title" />
Run Code Online (Sandbox Code Playgroud)
我可以查看AAR内部,看到值是在R.txt中填充的:
int attr maxValue 0x7f010001
int attr minValue 0x7f010000
Run Code Online (Sandbox Code Playgroud)
它的清单正确创建:
<?xml version="1.0" encoding="UTF-8"?>
<manifest android:versionName="1.0" android:versionCode="1"
xmlns:android="http://schemas.android.com/apk/res/android" package="com.mydomain.androiduilibrary">
<uses-sdk android:targetSdkVersion="21" android:minSdkVersion="11"/>
</manifest>
Run Code Online (Sandbox Code Playgroud)
在调用自定义首选项时我也会收到警告:"此处不允许使用元素com.mydomain.androiduilibrary.NumberPickerPreference",所以我猜这也是一个问题.
我是否缺少一个允许我在XML中引用AAR元素的步骤?我正在使用Android Studio 1.0.2.提前致谢.
我想构建一个Android库项目(jar/aar).
假设我有主要的lib类,名为"LibManager",以及名为"LibUtil"的实用程序类.
并且说有意义的是,该类将与LibManager处于不同的包中,例如:
- com.test.mylib
- main
- LibManager.java
- util
- LibUtil.java
Run Code Online (Sandbox Code Playgroud)
但是,LibUtil是一个仅与我的库相关的util类.所以我不希望使用我的lib的项目可以访问LibUtil.java.
我知道我可以将所有lib的类放在同一个包中,并使用包范围(不指定范围),但是,它错过了使用包组织项目.
还有另一种方法可以实现我想要的吗?
我正在创建一个Android库(.aar文件),我需要使用JNI.(我非常清楚谷歌如果可能的话,不鼓励使用JNI/NDK,但在这种情况下,这是不可能的).
我从一个独立的hello-jni示例APP(首先学习JNI)开始,使用以下文件:
HelloJni.java
public class HelloJni extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText( stringFromJNI() );
setContentView(tv);
}
public native String stringFromJNI();
static {
System.loadLibrary("hello-jni");
}
}
Run Code Online (Sandbox Code Playgroud)
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)
Application.mk
APP_ABI := all
Run Code Online (Sandbox Code Playgroud)
你好,jni.c
#include <string.h>
#include <jni.h>
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
return (*env)->NewStringUTF(env, "Hello from JNI!");
}
Run Code Online (Sandbox Code Playgroud)
以下构建精美的应用程序(apk),我能够在我的设备上运行它,打印"来自JNI的Hello!" 正如所料.
现在,我做了同样的事情,但我没有使用apk,而是建立了一个库项目来生产aar.我保留了除HelloJni.java之外的所有文件,我将其更改为以下内容:
HelloJni.java
public class HelloJni …Run Code Online (Sandbox Code Playgroud) 我已经看到各种开发者发布的问题(Android Studio将两个.aar合并为一个和其他),但我没有看到一个明确的响应,使我能够创建一个包含一个或多个AAR或JAR的AAR(我可以使用JAR因为我不需要共享任何资源;只有类).这是我的库项目的app.gradle:
apply plugin: 'com.android.library'
android {
compileSdkVersion 19
buildToolsVersion "19.1.0"
defaultConfig {
minSdkVersion 16
targetSdkVersion 21
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile 'com.google.code.gson:gson:2.1'
compile ('libs/eventbus.jar')
compile project(':core-release')
compile project(':midware-release')
}
Run Code Online (Sandbox Code Playgroud)
同样,这个应用程序是一个库项目,需要两个其他库项目('核心发布','midware-release'),虽然我能够生成一个我可以在我的应用程序中使用的AAR文件,但应用程序无法找到依赖库项目的类,我必须将两个库项目的AAR添加到我的应用程序中.
这是app.gradle应用程序项目(无需手动添加JAR),无法找到依赖项目的类:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "com.app.sample"
minSdkVersion 19
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies …Run Code Online (Sandbox Code Playgroud) 我正在努力构建一个可以在其他应用程序中使用的SDK.
我的项目结构如下:
ProjectFolder
|
+--AndroidLibs
| |
| +--UI (android library - AAR)
| |
| +--Protocol (android library - AAR)
| |
| +--infra (android library - AAR)
|
+--SDK(depends on UI, Protocol and Infra)
|
+--APP(depends on SDK)
Run Code Online (Sandbox Code Playgroud)
如您所见,我们有3个不同的库,每个库都是我们系统中的模块(infra,ui和protocol).他们每个人都在创建一个AAR.
我们的SDK是一个包装器,包含对较低层的一些API调用.
我们想要创建一个依赖于所有其他AAR的AAR,但是出于某种原因,当我们尝试运行它时,它说他找不到某些类的源代码.
我发现了一些与此问题相关的问题,但它们没有奏效.也尝试使用transitive依赖项,但底线是相同的 - 找不到源代码.
transitive依赖项.我们还能做些什么吗?
所以,我在Android Studio中有一个项目,我在插件中使用它,它通过aar文件在Ionic项目中使用.我通过单击Android Studio右侧(其中显示Graddle)生成aar文件,扩展我的项目/任务/构建,然后单击汇编版本.Graddle开始工作,我在myProject/build/outputs/aar中有一个aar文件.一段时间没关系.我在该代码中检测到了一些错误,纠正了它们,并再次生成了aar.
然后,我将该aar文件复制并粘贴到plugin.xml文件中指定的文件夹中:
<resource-file src="aar/library.aar" target="aar/library.aar" />
Run Code Online (Sandbox Code Playgroud)
然后,我使用packagr编译项目(插件,我应该说):
"packagr": "ng-packagr -p package.json && cd dist && npm pack && move *.tgz ../../"
Run Code Online (Sandbox Code Playgroud)
这样,生成了tgz文件.之后,我转到项目根目录(使用该插件的那个)并且执行
npm install @namespace/my-plugin-name
Run Code Online (Sandbox Code Playgroud)
一切都很好看.我在一个设备中运行该项目......并且没有反映出aar中的变化.
难道我做错了什么?为什么这些变化没有反映出来?
我有一个由2个模块组成的Android库:
Project Root
+-- moduleA
| +-- src
| \-- build.gradle
|
+-- moduleB
| +-- src
| \-- build.gradle
|
+-- build.gradle
+-- settings.gradle
Run Code Online (Sandbox Code Playgroud)
settings.gradle
include ':moduleB', 'moduleA'
Run Code Online (Sandbox Code Playgroud)
moduleA /的build.gradle
apply plugin: 'com.android.library'
...
dependencies {
compile project(':moduleB')
}
Run Code Online (Sandbox Code Playgroud)
moduleB /的build.gradle
apply plugin: 'com.android.library'
...
Run Code Online (Sandbox Code Playgroud)
当我尝试使用gradle生成的AAR时,不包括moduleB的资源.我试图将两个AAR推送到maven本地,但结果相同.
如果我将moduleA的类型更改为application而不是library,则生成的APK包含正确的资源.
我应该怎么做才能获得包含两个模块资源的AAR?
我正在为我的项目添加一个库.它打包成一个AAR.但它有一个BroadcastReceiver听取BOOT_COMPLETED启动服务.我不想在我的应用程序中出现此行为.我希望它能在应用程序启动时启动.(这部分已经完成AAR,我假设用户强制停止了应用程序).
有没有办法修改他们的清单; 或者指定Gradle不合并他们的清单(我认为我必须在我自己的清单中宣布他们的活动); 或者覆盖他们的清单,并android:enabled="false为BroadcastReceiver"?
我也希望在清单中执行此操作,或者Gradle因为如果我以编程方式执行此操作,并且如果他们安装应用程序但从未打开它,那么下次用户重新启动手机时,库服务将自动启动.
回到历史
我有这个aar开发人员可以正常使用的android库
compile 'com.companyname.sdk:android-sdk:2.x'
Run Code Online (Sandbox Code Playgroud)
现在我们正在从头开始重新编写库来创建V3.
在这次重新组织中,我们设法将lib分解为模块.所以可以说在V3上我们会有以下工件
compile 'com.companyname.sdk:core:3.x'
compile 'com.companyname.sdk:extra_1:3.x'
compile 'com.companyname.sdk:extra_2:3.x'
compile 'com.companyname.sdk:extra_ ....
Run Code Online (Sandbox Code Playgroud)
这将在gradle结构上给出以下模块:
root:
|- test_app (apk just for testing, not deployed anywhere)
|- sdk (aka: core)
|- extra_1
|- extra_2
|- extra_ ... etc
Run Code Online (Sandbox Code Playgroud)
每个extra在他们的模块build.gradle有一个provided (':sdk'),这样可以使用一切从sdk模块,但不实际编译它自己内部.
但我还想为现有的主机应用程序提供一个简单的迁移路径.意思是,我想在V3上也有以下的神器组合core和extra_1(它基本上是V2上的当前内容).
compile 'com.companyname.sdk:android-sdk:3.0.0'
Run Code Online (Sandbox Code Playgroud)
这一切听起来都很理论,但是我很难把它想象成一个gradle结构,让我轻松导出所有这些.
我想要实现的目标
所以我希望能够在构建期间生成以下工件:
android-sdk包括core和extra_1coreextra_1我试过了什么
添加一个名为的额外模块legacy,com.android.library无需任何代码即可应用,并compile project为其他模块添加.它会生成一个空的aar
使用两个模块中的sourceSets添加核心/旧版buildTypes.从未生成2aar …