You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android AAR集成Chaquopy时build.gradle.kts编译报错求助

解决Chaquopy在Android Library(AAR)中的编译错误与无侵入式封装方案

一、修复build.gradle.kts编译错误

你的编译错误源于Chaquopy配置位置错误、Gradle Kotlin DSL语法不规范及依赖冗余,以下是修正后的完整代码:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    id("com.android.library")
    kotlin("android")
    id("gradle-pega-android-module")
    id("com.chaquo.python") version "13.0.0"
}

group = "com.***.***"
version = "0.1-SNAPSHOT"

android {
    compileSdk = 33

    defaultConfig {
        minSdk = 23
        targetSdk = 33
        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

        ndk {
            abiFilters("armeabi-v7a", "arm64-v8a", "x86", "x86_64")
        }
    }

    // Chaquopy配置需放在android块下,而非defaultConfig内
    chaquopy {
        python {
            pip {
                install("six")
                install("pandas")
            }
        }
    }

    // 修正sourceSets的Kotlin DSL语法
    sourceSets.named("main") {
        jni.srcDirs.set(emptyList())
        jniLibs.srcDir("src/main/libs")
        jniLibs.srcDirs.set(listOf("../distribution/gperf/lib", "../distribution/conda-android-python/lib"))
    }
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        jvmTarget = "11"
    }
}

dependencies {
    implementation("androidx.appcompat:appcompat:1.4.1")
    androidTestImplementation("androidx.test:runner:1.4.0")
    androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0-alpha06")
    testImplementation("junit:junit:4.12")
    implementation("com.google.mlkit:image-labeling:17.0.7")
    implementation("com.google.android.gms:play-services-mlkit-text-recognition:18.0.2")
    implementation("com.google.android.gms:play-services-mlkit-image-labeling:16.0.8")
    // 移除冗余的Chaquopy Gradle依赖,插件已通过plugins块引入
}

关键修正点:

  • 将python配置块从defaultConfig移至android.chaquopy下,符合Chaquopy Kotlin DSL的配置规范
  • 用sourceSets.named("main")替代错误的sourceSets.main调用,同时用set()方法修改srcDirs(Kotlin DSL要求使用可变集合的set方法而非直接赋值)
  • 移除dependencies中多余的com.chaquo.python:gradle依赖,插件已通过plugins声明加载

二、无侵入式AAR封装方案(无需修改主应用)

要实现主应用无需任何代码修改即可运行你的Python脚本,核心是自动初始化Chaquopy环境,具体步骤:

  1. 打包Python代码:将你的Python脚本放在AAR模块的src/main/python目录下,Chaquopy会自动将其打包到AAR中。

  2. 自动初始化逻辑:在AAR中创建一个ContentProvider,利用Android组件的自动启动特性,在应用启动时完成Chaquopy初始化:

class PythonInitProvider : ContentProvider() {
    override fun onCreate(): Boolean {
        context?.let {
            // 初始化Chaquopy Python环境
            Python.start(AndroidPlatform(it))
        }
        return true
    }

    // 实现其他ContentProvider必需的空方法
    override fun query(uri: Uri, projection: Array<String>?, selection: String?, selectionArgs: Array<String>?, sortOrder: String?): Cursor? = null
    override fun getType(uri: Uri): String? = null
    override fun insert(uri: Uri, values: ContentValues?): Uri? = null
    override fun delete(uri: Uri, selection: String?, selectionArgs: Array<String>?): Int = 0
    override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array<String>?): Int = 0
}
  1. 注册ContentProvider:在AAR的AndroidManifest.xml中注册该Provider,注意设置唯一的authorities避免冲突:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application>
        <provider
            android:name=".PythonInitProvider"
            android:authorities="com.***.***.python.init.provider"
            android:exported="false" />
    </application>
</manifest>
  1. 封装调用接口:在AAR中提供静态工具类,暴露Python脚本的调用方法,主应用只需调用这些方法即可执行逻辑(若无需主动触发,可在初始化后自动执行脚本)。

三、替代方案(若Chaquopy兼容性问题无法解决)

如果主应用的AGP版本或环境与Chaquopy不兼容,可考虑以下方案:

  • 预编译Python解释器与脚本:使用交叉编译工具(如Termux的Android编译链)将Python解释器和脚本打包成ARM/x86架构的可执行文件,放入AAR的jniLibs目录,在AAR中通过Runtime.exec执行,需注意文件权限和路径处理。
  • 使用Python静态库:将Python解释器编译为静态库,通过JNI在AAR中调用,直接加载并执行Python脚本,这种方式体积更小,但开发复杂度较高。

内容的提问来源于stack exchange,提问作者Srinivas Sarda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:55:11