我有一个现有的iOS应用程序,并希望添加一大块代码,我一直在开发另一个项目,以方便测试.新的块基本上处理将图像保存到各种共享服务等.因为共享代码需要大量的测试和未来的更新,我想知道将代码块合并到我现有的应用程序中的最佳方法是什么.
我不知道它应该是静态库,动态库还是框架,老实说,我不确定区别是什么,或者我应该如何去做它并在Xcode中设置它.
我所知道的是,我需要/想要为共享代码保留单独的测试和更新应用程序,并让主应用程序使用它.
如果你还不能说,我不是一个git wiz.我只是一个简单的单人开发人员.
任何帮助或方向将不胜感激.谢谢!
我们建立了一个我们分发给客户的图书馆.我们分发原始的aar文件供他们使用.我们还使用GitHub的原始访问API来提供Maven存储库.
现在为了保持整洁,我们将库分成几个模块:
include ':library'
include ':geohash'
include ':networkstate'
include ':okvolley'
include ':volley'
Run Code Online (Sandbox Code Playgroud)
library是一个Android库,所以是volley和okvolley和networkstate.
现在,当我发布时library,依赖树看起来像这样:
\--- com.sensorberg.sdk:sensorberg-sdk:0.10.0-SNAPSHOT
+--- com.squareup.okhttp:okhttp-urlconnection:2.2.0
| \--- com.squareup.okhttp:okhttp:2.2.0
| \--- com.squareup.okio:okio:1.2.0
+--- com.google.code.gson:gson:2.3.1
+--- android-sdk:okvolley:unspecified
| +--- com.squareup.okhttp:okhttp-urlconnection:2.2.0 (*)
| +--- com.google.code.gson:gson:2.3.1
| +--- android-near-gradle:volley:unspecified
| \--- com.squareup.okhttp:okhttp:2.2.0 (*)
+--- android-sdk:networkstate:unspecified
+--- com.squareup.okhttp:okhttp:2.2.0 (*)
+--- android-sdk:volley:unspecified
\--- com.loopj.android:android-async-http:1.4.5
Run Code Online (Sandbox Code Playgroud)
正如您所见,android-sdk:networkstate:unspecified并android-sdk:okvolley:unspecified显示在外部依赖项列表中.
我想library用捆绑的本地模块创建我的aar.它应该做一个本地清单合并和远jar ...并合并所有模块的依赖性.只显示外部模块.
我确实尝试从build/output/aar相应模块的文件夹中引用本地aar文件,但这似乎也行不通.它仍然似乎用他们的名字引用本地模块而不是合并jar的清单......
有人做过这样的事吗?在Android之外,这将被称为fatjar,并且有像musketyr/gradle-fatjar-plugin这样的插件,可以用Gradle生成一个胖子.
我在我的本地模块上试过这个
if (project.ext.libraryBuild …Run Code Online (Sandbox Code Playgroud) 我正在构建一个打包为aar并分发给第三方开发人员的Android库.
结构非常简单:
项目--- libraryA --- libraryB
libraryA需要libraryB,这就是为什么在它的gradle文件中有这个:
compile project(':libraryB')
Run Code Online (Sandbox Code Playgroud)
而settings.gradle有
include ':libraryB', ':libraryA'
Run Code Online (Sandbox Code Playgroud)
但是,如果我将项目构建为aar,它只包含libraryA.我错过了什么?
我阅读了对此的回答:Android Studio如何从多个库项目中打包单个AAR?
这还不可能吗?我认为将代码拆分成多个模块并不是一种不好的做法?
这是我的开发项目结构:
projectFolder
|
+--App
|
+--MyLib
|
+--Libraries
|
+--LibA
MyLib依赖于LibA,我将MyLib打包为AAR并将其发布到Maven 仓库,但当我将MyLib作为远程aar依赖项包含在另一个项目(TestProj)中时,我得到了构建错误(无法解析LibA的依赖关系,LibA不包含在MyLib的发布中),这是TestProj的 app文件夹中的build.gradel :
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile ('xxx.xxxxxx:yyyyy:1.0-SNAPSHOT@aar'){
transitive = true
}
}
Run Code Online (Sandbox Code Playgroud)
这是MyLib的build.gradle :
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':Libraries:LibA')
}
Run Code Online (Sandbox Code Playgroud)
我如何能释放MyLib中与力霸已经打包在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依赖项,但底线是相同的 - 找不到源代码.
transitive依赖项.我们还能做些什么吗?
你能帮我理解构建android库的一般概念,并在用户的应用程序中使用它.
所以,有以下情况:
在android studio中有以下模块:
核心
数据
绘图
并且有一个模块
应用程序
依赖于上述模块.
app.gradle
dependencies {
compile project(':core')
compile project(':data')
compile project(':drawing')
}
Run Code Online (Sandbox Code Playgroud)
所以我可以从Android Studio运行该应用程序.
但我希望有类似AAR文件的东西,并将其包含在任何应用程序中,以便能够再次使用它而无需创建相同的模块.
我对Gradle不是很熟悉,所以我不确定是否可能以及如何做到这一点.
像许多其他人一样,我试图从我的多模块Android项目生成一个AAR文件.
根据这篇文章,由于各种限制(res和依赖关系管理,清单合并,......),Android团队目前不支持它.
我想提出适合我需求的自己的解决方案.我知道我没有重复的资源,外部依赖项(如支持库)是由使用我的lib的人提供的.
我的结构类似于:
/root
|- lib1
|- lib2
|- lib3
Run Code Online (Sandbox Code Playgroud)
为了实现我的目标,我创建了另一个名为的库模块,distribute它将包含所有其他模块.然后我可以共享生成的distribute.aar文件.
/root
|- lib1
|- lib2
|- lib3
|- distribute
Run Code Online (Sandbox Code Playgroud)
这是模块的build.gradle文件distribute:
apply from: '../common.gradle' // This simply configure properties shared accross all modules
apply plugin: 'com.android.library'
def allModules = rootProject.allprojects.collect { it.name } - [rootProject.name, name]
def whiteLabelDependencies = [
whiteLabel1: allModules - ['lib2'],
whiteLabel2: allModules,
]
android {
def buildTypeNames = buildTypes.collect { it.name }
def whiteLabelTypes = …Run Code Online (Sandbox Code Playgroud) 我有一个使用library.aar和的Android Studio库项目library.jar.当我出口它mylib.aar,并使用这个新的AAR到不同的应用程序/项目,它无法找到在定义的类library.aar和library.jar.
我build.gradle看起来像这样:
apply plugin: 'com.android.library'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
minSdkVersion 15
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile project(':library_dot_aar')
compile project(':library_dot_jar')
}
Run Code Online (Sandbox Code Playgroud)
我在Android Studio中导入了AAR和JAR文件New -> Module -> Import .JAR or .AAR Package,并将它们作为依赖项添加到Project Structure -> Module Settings -> Dependencies -> Add Module Dependencies.
当我解压缩mylib.aar它只有25KB(考虑library.aar超过300KB,我假设mylib.aar的大小将在相同的范围内)并且包含的依赖项不包括在其中.如何导出包含其内部所有依赖项的AAR?
我正在为供应商制作一个库项目,它需要 Android Volley 作为依赖项。我已使用此在 Android Studio 中创建 aar 文件来创建 .aar 文件并将其包含在测试项目中,我正在使用此使用“flatDirs”将本地 .aar 文件添加到 Gradle 构建不起作用。该库链接良好,项目编译没有错误。但在运行时测试应用程序崩溃并表示找不到 Volley
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/android/volley/toolbox/Volley;
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.android.volley.toolbox.Volley" on path: DexPathList[[zip file "/data/app/in.gridsync.acttest-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
Run Code Online (Sandbox Code Playgroud)
我的库项目的 Gradle 文件是这样的
apply plugin: 'com.android.library'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled …Run Code Online (Sandbox Code Playgroud)