标签: aar

仅使用maven创建Android存档库(AAR)

我正在开发一个我希望分发给其他开发人员的库项目.

在互联网上有很多关于这个主题的讨论,人们建议创建一个分发版本库项目,其中只包含我的库项目的jar和其他资源.这听起来不错.

然后,我突然发现有人建议创建Android Archive Library(AAR).但他们都使用名为Gradle的工具

我正在将Eclipse与Maven一起用于我的Android库项目.我的问题是,是否有可能为我的android库项目生成AAR实现 而不使用Gradle但仅使用Maven?如果是这样,怎么样?

eclipse android maven android-library aar

7
推荐指数
1
解决办法
4428
查看次数

无法在XML中找到AAR中的资源标识符

我为应用程序开发了一个自定义首选项.它有两个自定义属性.我正在尝试将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 android-library android-studio aar

7
推荐指数
1
解决办法
6162
查看次数

如何防止Android库项目中的类访问和使用包

我想构建一个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的类放在同一个包中,并使用包范围(不指定范围),但是,它错过了使用包组织项目.

还有另一种方法可以实现我想要的吗?

java android jar aar

7
推荐指数
0
解决办法
609
查看次数

如何将JNI与AAR库一起使用?

我正在创建一个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)

java-native-interface android android-ndk aar

7
推荐指数
1
解决办法
6250
查看次数

使用多个AAR/JAR创建AAR

我已经看到各种开发者发布的问题(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)

dependency-management android-gradle-plugin aar

7
推荐指数
1
解决办法
8631
查看次数

创建一个依赖于多个AAR的AAR

我正在努力构建一个可以在其他应用程序中使用的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依赖项,但底线是相同的 - 找不到源代码.

  1. android-studio-how-to-package-one-aar-from-multi-library-projects:一个答案就是没有解决方案(Google员工).
  2. create-an-aar-with-multiple-aars-jars:使用transitive依赖项.
  3. 创建Mojo以创建具有所有"aar"依赖关系的AAR

我们还能做些什么吗?

android module gradle android-gradle-plugin aar

7
推荐指数
1
解决办法
1890
查看次数

更新aar文件不会反映更改

所以,我在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中的变化.

难道我做错了什么?为什么这些变化没有反映出来?

android visual-studio android-studio ionic-framework aar

7
推荐指数
1
解决办法
1317
查看次数

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?

java resources android gradle aar

6
推荐指数
1
解决办法
442
查看次数

排除或覆盖AAR清单

我正在为我的项目添加一个库.它打包成一个AAR.但它有一个BroadcastReceiver听取BOOT_COMPLETED启动服务.我不想在我的应用程序中出现此行为.我希望它能在应用程序启动时启动.(这部分已经完成AAR,我假设用户强制停止了应用程序).

有没有办法修改他们的清单; 或者指定Gradle不合并他们的清单(我认为我必须在我自己的清单中宣布他们的活动); 或者覆盖他们的清单,并android:enabled="falseBroadcastReceiver"?

我也希望在清单中执行此操作,或者Gradle因为如果我以编程方式执行此操作,并且如果他们安装应用程序但从未打开它,那么下次用户重新启动手机时,库服务将自动启动.

android gradle android-manifest aar

6
推荐指数
1
解决办法
1438
查看次数

使用多模块android库进行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上也有以下的神器组合coreextra_1(它基本上是V2上的当前内容).

compile 'com.companyname.sdk:android-sdk:3.0.0'
Run Code Online (Sandbox Code Playgroud)

这一切听起来都很理论,但是我很难把它想象成一个gradle结构,让我轻松导出所有这些.

我想要实现的目标

所以我希望能够在构建期间生成以下工件:

  • android-sdk包括coreextra_1
  • core
  • extra_1
  • ......所有其他额外的东西

我试过了什么

  • 添加一个名为的额外模块legacy,com.android.library无需任何代码即可应用,并compile project为其他模块添加.它会生成一个空的aar

  • 使用两个模块中的sourceSets添加核心/旧版buildTypes.从未生成2aar …

android gradle android-library android-gradle-plugin aar

6
推荐指数
1
解决办法
1091
查看次数