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

如何限制仅指定示例应用可访问我开发的AAR文件?

如何限制AAR仅允许指定示例应用调用

嘿,这个需求在开发私有SDK或者内部组件时挺常见的,我给你整理几个实用的实现方案,从代码校验到依赖层面都有覆盖:

1. 签名验证(最安全的核心方案)

每个Android应用的签名都是唯一且不可伪造的(除非拿到你的签名密钥),所以在AAR里添加签名校验逻辑是最靠谱的方式:

步骤:

  • 先获取你的示例应用的签名哈希值:
    可以用keytool命令生成,比如针对发布签名文件:
    keytool -list -v -keystore your-release-key.jks -alias your-alias
    
    找到SHA-256的哈希值,去掉冒号后转成Base64(或者直接用代码在示例应用里获取)。
  • 在AAR的核心初始化方法或入口类里添加校验逻辑:
    public void init(Context context) {
        // 替换成你的示例应用的签名哈希(提前获取好)
        String allowedSignatureHash = "abcdef1234567890...";
        try {
            PackageInfo packageInfo = context.getPackageManager()
                .getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);
            
            for (Signature signature : packageInfo.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA-256");
                md.update(signature.toByteArray());
                String currentHash = Base64.encodeToString(md.digest(), Base64.NO_WRAP);
                
                if (!allowedSignatureHash.equals(currentHash)) {
                    throw new SecurityException("Unauthorized access: Invalid signature");
                }
            }
        } catch (Exception e) {
            throw new SecurityException("Failed to verify app signature", e);
        }
        // 执行正常的初始化逻辑
    }
    
    这样一来,只有持有相同签名的示例应用才能通过校验,其他应用调用时会直接抛出安全异常。

2. 包名校验(快速辅助限制)

这个方法简单易实现,但安全性稍弱(包名可以被伪造,但伪造包名的应用无法和你的示例应用共存于同一设备,因为签名不同),可以和签名验证配合使用:

public void init(Context context) {
    // 替换成你的示例应用的包名
    String allowedPackageName = "com.your.example.app";
    String currentPackageName = context.getPackageName();
    
    if (!allowedPackageName.equals(currentPackageName)) {
        throw new SecurityException("Unauthorized access: Invalid package name");
    }
    // 后续逻辑
}

3. 私有Maven仓库+权限控制(依赖层面限制)

如果你的AAR是通过Gradle依赖引入的,可以把AAR发布到私有Maven仓库(比如Nexus、GitLab Maven),只给示例应用的项目开放访问权限:

在示例应用的build.gradle里配置私有仓库:

repositories {
    maven {
        url "https://your-private-repo-url.com/maven"
        credentials {
            username = "your-repo-username"
            password = "your-repo-password"
        }
    }
}

其他项目没有仓库的访问凭证,就无法拉取到这个AAR,从源头上限制了获取渠道。

4. 代码混淆+加密(增加反编译难度)

对AAR的核心代码进行混淆,同时把签名哈希、包名等敏感信息加密存储,能大幅提高别人反编译篡改的难度:

  • 在AAR的proguard-rules.pro里添加混淆规则,比如:
    # 混淆核心类和方法名
    -keepclassmembers class com.your.aar.core.** {
        private *;
    }
    -obfuscationdictionary proguard-dictionary.txt
    
  • 把签名哈希等敏感信息加密后硬编码在代码里,校验时再解密对比。

推荐组合方案

想要最稳妥的限制效果,建议结合签名验证+私有Maven仓库:

  1. 私有仓库确保只有授权项目能获取AAR;
  2. 签名验证确保即使AAR被泄露,非授权应用也无法正常调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:39:05