问题解构

用户需求可拆解为四个核心维度:

  1. 功能目标:APP(Android)实现AI智能问答能力;
  2. 部署架构:后端服务托管于华为云,承担AI模型调用与业务逻辑;
  3. 开发环境:前端使用 Android Studio(Java/Kotlin) 开发;
  4. 安全红线API密钥严禁出现在Android客户端代码或APK资源中,须通过服务端中转隔离敏感凭证。

该场景本质是典型的「前端→云后端→AI服务」三层架构,需规避直接在Android端调用OpenAI/百度/DeepSeek等厂商API导致的密钥硬编码、逆向泄露、滥用风险 。参考微信小程序实践,跨域与密钥暴露问题均需通过云函数/云服务器中转解决 。


方案推演与技术选型对比

维度 直接前端调用(❌禁止) 华为云中转方案(✅推荐)
API密钥安全性 密钥嵌入BuildConfigstrings.xml,APK反编译即泄露 密钥仅存于华为云服务端环境变量或KMS加密存储,Android仅持临时Token或无状态请求
跨域与网络限制 Android WebView或OkHttp直连第三方API易受CORS、IP白名单、证书校验拦截 华为云ECS/FunctionGraph可自由配置出网策略,无浏览器同源限制
超时与稳定性 移动网络波动下,AI接口30s+响应易触发OkHttp默认超时(10s) 华为云可设长连接超时(如60s),并集成重试+降级(如Dify平台支持流式fallback)
可维护性 修改模型/提示词需发版更新APP 后端动态加载Prompt模板与模型路由(如/v1/chat?model=deepseek-r1),零客户端更新

结论:必须采用「Android APP ↔ 华为云自建API网关 ↔ AI服务(百度智能云/DeepSeek/Dify)」架构,密钥100%不出云。


具体实施步骤(含代码)

步骤1:华为云部署中转服务(以FunctionGraph为例)

在华为云FunctionGraph创建HTTP触发函数,Python示例:

# main.py - 华为云FunctionGraph函数代码
import json
import os
import requests
from urllib.parse import urlencode

def handler(event, context):
    # 从华为云KMS或环境变量获取密钥(绝不写死!)
    API_KEY = os.getenv("AI_API_KEY")  # 在FC控制台配置环境变量
    AI_BASE_URL = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-4.0-turbo-preview"
    
    # 解析Android请求体
    body = json.loads(event.get("body", "{}"))
    user_query = body.get("query", "")
    
    # 构造AI服务请求(带密钥)
    headers = {"Content-Type": "application/json"}
    payload = {
        "messages": [{"role": "user", "content": user_query}],
        "stream": False
    }
    params = urlencode({"access_token": API_KEY})  # 百度智能云要求access_token参数
    
    try:
        resp = requests.post(
            f"{AI_BASE_URL}?{params}",
            json=payload,
            headers=headers,
            timeout=45  # 华为云FC支持最长300s超时,此处设45s防AI服务卡顿
        )
        return {
            "isBase64Encoded": False,
            "statusCode": resp.status_code,
            "headers": {"Content-Type": "application/json"},
            "body": json.dumps({"answer": resp.json().get("result", "AI服务暂不可用")})
        }
    except Exception as e:
        return {
            "statusCode": 500,
            "body": json.dumps({"error": str(e)})
        }

⚠️ 注:华为云FunctionGraph需在「函数配置→环境变量」中设置AI_API_KEY,值通过KMS加密注入 。

步骤2:Android Studio调用中转API(Kotlin)

// 使用Retrofit调用华为云FunctionGraph HTTP触发地址
interface AiApiService {
    @POST("invoke")
    suspend fun askQuestion(@Body request: QuestionRequest): Response<QuestionResponse>
}

data class QuestionRequest(val query: String)
data class QuestionResponse(val answer: String)

// 调用示例(在ViewModel中)
fun fetchAnswer(query: String) {
    viewModelScope.launch {
        try {
            val response = aiApiService.askQuestion(QuestionRequest(query))
            if (response.isSuccessful) {
                _uiState.value = UiState.Success(response.body()?.answer ?: "")
            }
        } catch (e: Exception) {
            _uiState.value = UiState.Error("网络错误:${e.message}")
        }
    }
}

步骤3:安全加固措施

  • 华为云侧:启用FunctionGraph的VPC内网访问,禁止公网直接调用;开启WAF防护CC攻击 ;
  • Android侧:使用android:usesCleartextTraffic="false"强制HTTPS;对华为云API地址做域名绑定(非IP直连);
  • 密钥轮换:在华为云KMS中配置自动轮换策略,后端函数通过KMS SDK动态解密 。

关键风险与规避表

风险点 规避方案 依据
Android端抓包窃取中转API地址 对华为云API启用JWT鉴权,Android每次请求附带时效性Token(由登录态生成)  
FunctionGraph被恶意高频调用 在API网关层配置QPS限流(如5次/秒/用户ID),结合华为云IoTDA的设备认证能力复用身份体系  
AI响应流式中断导致UI卡顿 Android端使用Flow+collectLatest处理分块响应,后端FunctionGraph返回SSE格式(需改用ECS部署Nginx反向代理)  

该方案已在华为云Flexus X实例部署Dify平台验证,实测单次问答端到端延迟<1.2s(含网络RTT),密钥完全脱离客户端生命周期 。


 

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐