Giter Site home page Giter Site logo

gzu-liyujiang / android_cn_oaid Goto Github PK

View Code? Open in Web Editor NEW
2.2K 19.0 315.0 11.61 MB

安卓设备唯一标识解决方案,可替代移动安全联盟(MSA)统一 SDK 闭源方案。包括国内手机厂商的开放匿名标识(OAID)、海外手机平台的安卓广告标识(AAID),另外也提供了 IMEI/MEID、AndroidID、WidevineID、PseudoID、GUID 等常见的设备标识的获取方法。

Home Page: https://gzu-liyujiang.github.io/Android_CN_OAID/

License: Other

Java 98.20% Batchfile 0.24% AIDL 1.57%
oaid guid uuid utdid imei imsi androidid deviceid uniqueid udid

android_cn_oaid's Introduction

Android_CN_OAID

Release APK Gradle Package

安卓设备唯一标识解决方案,可作为移动安全联盟统一 SDK (miit_mdid_xxx.aar)的替代方案。 注意,这个项目的初衷主要是针对个人开发者的APP,个人开发者没资格使用 MSA 的 SDK,企业的APP应该去申请使用 MSA 的 SDK。 本项目提供了国内各大手机厂商获取 OAID(开放匿名设备标识)及海外手机平台获取 AAID(安卓广告标识)的便携接口, 另外也提供了 IMEI/MEID、AndroidID、PseudoID、GUID 等常见的设备标识的获取方法。

接入指引

最新版本:jitpack更新日志 | JavaDoc

依赖配置

如果你的项目 Gradle 配置是在 7.0 以下,需要在 build.gradle 文件中加入:

allprojects {
    repositories {
        // JitPack 远程仓库
        maven { url 'https://jitpack.io' }
    }
}

如果你的 Gradle 配置是 7.0 及以上,可能需要在 settings.gradle 文件中加入:

dependencyResolutionManagement {
    repositories {
        // JitPack 远程仓库
        maven { url 'https://jitpack.io' }
    }
}

然后直接使用如下依赖即可:jitpack

dependencies {
    implementation 'com.github.gzu-liyujiang:Android_CN_OAID:最新版本号'
}

除了依赖从 Github 拉取代码构建的包外,也可以依赖从码云构建的包:

dependencies {
    implementation 'com.gitee.li_yu_jiang:Android_CN_OAID:最新版本号'
}

注意事项

  • 4.2.5.1 版本以后直接使用了华为官方广告标识服务SDK,与移动安全联盟 SDK 共存 的话可参考如下配置(PS:暂时没太多经历逆向华为的SDK重构包名来共存):
dependencies {
    implementation('com.github.gzu-liyujiang:Android_CN_OAID:最新版本号') {
        // 如果使用了移动安全联盟SDK,共存的话需排除掉本项目依赖的华为/荣耀官方广告标识服务SDK,因为移动安全联盟SDK也依赖了华为/荣耀的SDK
        // 如果华为官方广告标识服务SDK下载失败或编译报错的话,可考虑在 build.gradle 中增加以下配置:
        // repositories { maven { url 'https://developer.huawei.com/repo' } }
        // runtimeOnly "com.huawei.hms:ads-identifier:3.4.62.300"
        exclude group: 'com.huawei.hms', module: 'ads-identifier' 
        // 荣耀官方广告标识服务SDK同理:      
        // repositories { maven { url 'https://developer.hihonor.com/repo' } }
        // runtimeOnly "com.hihonor.mcs:ads-identifier:1.0.2.301"
        exclude group: 'com.hihonor.mcs', module: 'ads-identifier'
    }
}
  • 4.1.1 开始默认加入了 READ_PHONE_STATEWRITE_SETTINGSWRITE_EXTERNAL_STORAGE 权限以便适配低版本安卓系统。
  • 遵循最小必要原则保护用户隐私,若项目中没用到 IMEI 及 GUID,那么可酌情在 AndroidManifest.xml 中加入如下代码移除相关权限:
<manifest>
    <uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" tools:node="remove" />
</manifest>

代码示例

获取多个可能的设备标识,结合服务端引入拜占庭容错方案得到可靠的稳定的设备唯一标识:

  • 第一步(可选的,用于调用 getClientId() 预取 OAID ):
    // 在`Application#onCreate`里初始化,注意APP合规性,若最终用户未同意隐私政策则不要调用
    @Override
    public void onCreate() {
        super.onCreate();
        if (privacyPolicyAgreed) {
            DeviceIdentifier.register(this);
        }
    }
  • 第二步:
         // 获取IMEI,只支持Android 10之前的系统,需要READ_PHONE_STATE权限,可能为空
        DeviceIdentifier.getIMEI(this);
        // 获取安卓ID,可能为空
        DeviceIdentifier.getAndroidID(this);
        // 获取数字版权管理ID,可能为空。很鸡肋,在某些手机上还可能造成卡死或闪退,自4.2.7版本后已弃用
        DeviceIdentifier.getWidevineID();
        // 获取伪造ID,根据硬件信息生成,不会为空,有大概率会重复
        DeviceIdentifier.getPseudoID();
        // 获取GUID,随机生成,不会为空
        DeviceIdentifier.getGUID(this);
        // 是否支持OAID/AAID
        DeviceID.supportedOAID(this);
        // 获取OAID/AAID,同步调用
        DeviceIdentifier.getOAID(this);
        // 获取OAID/AAID,异步回调
        DeviceID.getOAID(this, new IGetter() {
            @Override
            public void onOAIDGetComplete(String result) {
                // 不同厂商的OAID/AAID格式是不一样的,可进行MD5、SHA1之类的哈希运算统一
            }

            @Override
            public void onOAIDGetError(Exception error) {
                // 获取OAID/AAID失败
            }
        });

混淆规则

本库自带consumer-rules.pro如下混淆规则,不混淆厂商的相关接口及类。若通过远程依赖的方式引用,则无需进行额外配置:

# 本库模块专用的混淆规则(注:“repeackage”拼写是历史遗留问题)
-keep class repeackage.com.uodis.opendevice.aidl.** { *; }
-keep interface repeackage.com.uodis.opendevice.aidl.** { *; }
-keep class repeackage.com.asus.msa.SupplementaryDID.** { *; }
-keep interface repeackage.com.asus.msa.SupplementaryDID.** { *; }
-keep class repeackage.com.bun.lib.** { *; }
-keep interface repeackage.com.bun.lib.** { *; }
-keep class repeackage.com.heytap.openid.** { *; }
-keep interface repeackage.com.heytap.openid.** { *; }
-keep class repeackage.com.samsung.android.deviceidservice.** { *; }
-keep interface repeackage.com.samsung.android.deviceidservice.** { *; }
-keep class repeackage.com.zui.deviceidservice.** { *; }
-keep interface repeackage.com.zui.deviceidservice.** { *; }
-keep class repeackage.com.coolpad.deviceidsupport.** { *; }
-keep interface repeackage.com.coolpad.deviceidsupport.** { *; }
-keep class repeackage.com.android.creator.** { *; }
-keep interface repeackage.com.android.creator.** { *; }
-keep class repeackage.com.google.android.gms.ads.identifier.internal.** { *; }
-keep interface repeackage.com.google.android.gms.ads.identifier.internal.* { *; }
-keep class repeackage.com.oplus.stdid.** {*; }
-keep interface repeackage.com.oplus.stdid.** {*; }
-keep class com.huawei.hms.ads.** {*; }
-keep interface com.huawei.hms.ads.** {*; }
-keep class com.hihonor.ads.** {*; }
-keep interface com.hihonor.ads.** {*; }
-keep class repeackage.com.qiku.id.** { *; }
-keep interface repeackage.com.qiku.id.** { *; }

支持情况

厂商或品牌 系统或框架
华为(Huawei) HMS Core 2.6.2+、Google Play Service 4.0+
荣耀(Honor) Magic UI 4/5/6、MagicOS 7.0+、Google Play Service 4.0+
小米(XiaoMi、Redmi、BlackShark) MIUI 10.2+、Google Play Service 4.0+
维沃(VIVO、IQOO) Funtouch OS 9+、OriginOS 1.0+、Google Play Service 4.0+
欧珀(OPPO、Realme) ColorOS 7.0+、Google Play Service 4.0+
三星(Samsung) Android 10+、Google Play Service 4.0+
联想(Lenovo) ZUI 11.4+、Google Play Service 4.0+
华硕(ASUS) Android 10+、Google Play Service 4.0+
魅族(Meizu) Android 10+、Google Play Service 4.0+
一加(OnePlus) Android 10+、Google Play Service 4.0+
努比亚(Nubia) Android 10+、Google Play Service 4.0+
酷派(Coolpad) CoolOS、Google Play Service 4.0+
酷赛(Coosea ) Android 10+、Google Play Service 4.0+
卓易(Droi ) Freeme OS、Google Play Service 4.0+
其他(ZTE、HTC、Motorola、……) SSUI、Google Play Service 4.0+

注:本项目的 OAID 获取接口主要参考北京数字联盟公开的代码以及逆向分析参考移动安全联盟的 SDK、HUAWEI Ads SDK、小米 DeviceId.jar、Google Play Services SDK 等。

效果预览

OAID(开放匿名设备标识符)

  • 华为手机 huawei
  • 荣耀手机 hono
  • 小米手机 xiaomi
  • 红米手机 redmi
  • 黑鲨手机 blackshark
  • 维沃手机 vivo_iqoo
  • 欧珀手机 oppo
  • 真我手机 realm
  • 三星手机 samsung
  • 魅族手机 meizu
  • 联想手机 lenovo
  • 一加手机 oneplus
  • 华硕手机 asus
  • 努比亚机 待验证
  • 酷派手机 待验证
  • 酷赛手机 待验证
  • 卓易手机 待验证

AAID(安卓广告标识符)

  • 谷歌手机 google
  • 中兴手机 zte
  • 摩托罗拉 motorola
  • 索尼手机 sony
  • 诺基亚机 nokia
  • HTC 手机 htc
  • LG 手机 lge

不支持 OAID 或 AAID

  • 用户关闭了广告标识符

disabled

  • 以下厂商或品牌手机截止2021年8月26日已验证尚不支持:

nonsupport

锤子(Smartisan)、360(360)、奇酷(QiKu)、海信(Hisense)、金立(Gionee)、
美图(Meitu)、糖果(SOAP)、格力(Gree)、朵唯(Doov)、优思(Uniscope)、
夏普(SHARP)、乐视(LeTV)、维图(VOTO)、宏碁(Acer)、TCL(TCL)、……

参考资料

OAID 是移动智能终端补充设备标识体系中的一员,官方定义为 Open Anonymous Device Identifier(开放匿名设备标识符), 华为称之为 Open Advertising ID (开放广告标识符),谷歌称之为 Android Advertising ID (安卓广告标识符)。

远程真机

许可协议

Copyright (c) 2016-present. gzu-liyujiang<[email protected]> and All Contributors.

The software is licensed under the Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
    http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
PURPOSE.
See the Mulan PSL v2 for more details.

IDE 推荐

支持开源,除了 Intellij IDEA Community / PyCharm Community 和 EAP 版本可免费使用,也可通过 申请开源开发许可证 来免费使用正版的 JetBrains 全家桶开发工具,尤其是 Intellij IDEA Ultimate 版本很强大。

android_cn_oaid's People

Contributors

10cl avatar andot avatar godvmxi avatar liyujiang-gzu avatar luoyesiqiu avatar mankinchung avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

android_cn_oaid's Issues

部分机型报错

QQ截图20210806102911
QQ截图20210806102951

如图,在低版本机型上会报错

DeviceID.register(this) oaid = DeviceID.getClientId()

小米MIX

java.lang.NoSuchMethodException: getDefaultUDID [class android.content.Context]

关于华为,荣耀手机获取不到oaid

isSupport-->true----->oaid--->00000000-0000-0000-0000-000000000000
支持获取oaid 但是获取到oaid 都为0的字符串 最后查到是因为用户设置了“匿名识别标识”为关闭 有没有什么办法可以曲线救国保证拿到相关的oaid

引入报错和最新版本问题

implementation 'com.github.gzu-liyujiang:Android_CN_OAID:${latest.version}'
您好,我直接这样引入报错,最新版本是1.0.2么

关于尝试移动安全联盟的接口去获取的判断问题

class MsaImpl implements IOAID {
private final Context context;

public MsaImpl(Context context) {
    this.context = context;
}

@Override
public boolean supported() {
    if (context == null) {
        return false;
    }
    try {
        PackageInfo pi = context.getPackageManager().getPackageInfo("com.mdid.msa", 0);
        return pi != null;
    } catch (Exception e) {
        OAIDLog.print(e);
        return false;
    }
}

这里为何是判断是否存在包"com.mdid.msa",我往demo加了个oaid_1.0.25版本,试了几部手机都是返回不支持。

HuaweiImpl调用崩溃

日志如下

    java.lang.IllegalArgumentException: Service not registered: com.github.gzuliyujiang.oaid.impl.HuaweiImpl$1@f4ac590
        at android.app.LoadedApk.forgetServiceDispatcher(LoadedApk.java:1832)
        at android.app.ContextImpl.unbindService(ContextImpl.java:1880)
        at com.github.gzuliyujiang.oaid.impl.HuaweiImpl$1.onServiceConnected(HuaweiImpl.java:76)
        at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:2037)
        at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:2069)
        at android.os.Handler.handleCallback(Handler.java:900)
        at android.os.Handler.dispatchMessage(Handler.java:103)
        at android.os.Looper.loop(Looper.java:219)
        at android.app.ActivityThread.main(ActivityThread.java:8349)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)

报错代码为HuaweiImpl -> doGet -> onServiceConnected ->

finally {
    context.unbindService(this);
}

不同手机具有相同的clientIdMd5

目前统计重复的有两个(线上实际用户统计)

相关文章(文章中包含了我所碰到的两种类型错误,除此之外还有空值,null的情形,"null"字符串)
设备ID又一坑【抛砖引玉】
https://zhuanlan.zhihu.com/p/63708748

IMEI变成0了
http://www.oneplusbbs.com/thread-4331675-1.html

1
9f89c84a559f573636a47ff8daed0d33
md5前的源数据为00000000-0000-0000-0000-000000000000
大量存在于华为/荣耀手机中,应该是华为手机的广告标识符(idfa),占比极高,大概能占据华为手机用户的1/5

2
cd9e459ea708a948d5c2f5a6ca8838cf
md5前的源数据为0,推测位imei

占比较少,存在于少量魅族和个别华为手机中,网络上有一加手机,小米手机案例,根据网络信息推测大概率为用户刷机所致

这部分特殊数据可能需要做下过滤

GUID相关疑问?

获取到的GUID是每次运行都不一样,还是在同一个手机上不会改变,还是卸载重新安装以后不一样,还是其他的情况时候会发生改变?集体什么时候发生改变。

获取oiad错误

提示com.github.gzuliyujiang.oiad.impl.XiaomiDeviceIdImple@1e6ad75

Crash at android 5.1(oppoR9m), caused by java.lang.NoSuchMethodError

01-07 01:29:19.758 10455-10455/com.tongcheng.transport.flavor.dazhou E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.tongcheng.transport.flavor.dazhou, PID: 10455
java.lang.NoSuchMethodError: No virtual method getMeid()Ljava/lang/String; in class Landroid/telephony/TelephonyManager; or its super classes (declaration of 'android.telephony.TelephonyManager' appears in /system/framework/framework.jar)
at com.github.gzuliyujiang.oaid.DeviceID.getIMEI(DeviceID.java:182)
at com.github.gzuliyujiang.oaid.DeviceID.getUniqueID(DeviceID.java:171)
at com.github.gzuliyujiang.oaid.DeviceID.register(DeviceID.java:65)

// Related project code about this issue
@NonNull
@SuppressWarnings("deprecation")
@SuppressLint({"HardwareIds", "MissingPermission"})
private static String getIMEI(Context context) {
    try {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        String imei = tm.getImei();
        if (TextUtils.isEmpty(imei)) {
            imei = tm.getMeid();
        }
        return imei;
    } catch (Exception e) {
        OAIDLog.print(e);
        return "";
    }
}

Should catch Throwable,for some crash caused by java.lang.Error instead for java.land.Exception,both of them extends java.lang.Throwable

And It is also need to replace Exception with Throwable for other method in your project because of android device compatibility problem

GUID 两次获取不一致

机器: HUAWEIP30
SDK: SDK 29 Android 10系统
两次安装demo,分别获取的 GUID 不一致,算是一个 bug 吗?

关于 queries 配置的问题

我测试模拟器、华为、oppo 机型,在 Android 11 以上的机器测试,不配置 queries 也可以获取 OAID,请问大佬为什么还需要配置?

image

华硕ROG 2

08-19 09:56:17.177 E/MtaSDK.CaughtExp(28712): Caused by: java.lang.SecurityException: Not allowed to bind to service Intent { act=com.asus.msa.action.ACCESS_DID cmp=com.asus.msa.SupplementaryDID/.SupplementaryDIDService }
08-19 09:56:17.177 E/MtaSDK.CaughtExp(28712): at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1677)
08-19 09:56:17.177 E/MtaSDK.CaughtExp(28712): at android.app.ContextImpl.bindService(ContextImpl.java:1612)
08-19 09:56:17.177 E/MtaSDK.CaughtExp(28712): at android.content.ContextWrapper.bindService(ContextWrapper.java:705)
08-19 09:56:17.177 E/MtaSDK.CaughtExp(28712): at com.github.gzuliyujiang.oaid.impl.AsusDeviceIdImpl.doGet(AsusDeviceIdImpl.java:62)

哪个方法最可靠

你好,最近项目需要获取唯一设备号,找了好多方法都不行,咱们这个里面哪个是最可靠的,不管是卸载重装还是什么情况,都是唯一不变的?多谢

OAID存储

OAID能否用Sp进行存储,这样的话每次APP启动的时候,从sp拿到的oaid并不为空。 拿到OAID的时候刷新sp。

每次初始化去拿的话会有一个问题, 就是打点时机比较早的话,可能还没有拿到oaid,导致上报为空。后续上报不为空。

或者在向外暴露一个获取oaid成功的接口,由开发者自己处理oaid的存储和一些其他操作。自由度也会比较高一些

OAID 有时能获取到,有时获取不到?

企业微信截图_e5e679e6-0807-4ba2-97d9-f819474e4524

数据反馈,同一个用户, 同一款设备。有时候上报oaid,有时候不上报。看这个上报应该是初始化完成了。

什么原因会导致这种情况啊?

机型是 VIVO V1809A, 用的版本是 4.0.1

咨询:关于混淆

我看readme上面写的是

-keep class repeackage.com.uodis.opendevice.aidl.** { ; }
-keep interface repeackage.com.uodis.opendevice.aidl.
* { ; }
-keep class repeackage.com.asus.msa.SupplementaryDID.
* { ; }
-keep interface repeackage.com.asus.msa.SupplementaryDID.
* { ; }
-keep class repeackage.com.bun.lib.
* { ; }
-keep interface repeackage.com.bun.lib.
* { ; }
-keep class repeackage.com.heytap.openid.
* { ; }
-keep interface repeackage.com.heytap.openid.
* { ; }
-keep class repeackage.com.samsung.android.deviceidservice.
* { ; }
-keep interface repeackage.com.samsung.android.deviceidservice.
* { ; }
-keep class repeackage.com.zui.deviceidservice.
* { ; }
-keep interface repeackage.com.zui.deviceidservice.
* { ; }
-keep class repeackage.com.coolpad.deviceidsupport.
* { ; }
-keep interface repeackage.com.coolpad.deviceidsupport.
* { ; }
-keep class repeackage.com.android.creator.
* { ; }
-keep interface repeackage.com.android.creator.
* { *; }

这个 "repeackage" 这里有没有写错?

关于依赖

需要兼容所有手机下面依赖都要导入吗

// 如果项目中已经使用了移动安全联盟的包 mdid_xxx.aar ,则可能需要取消相关有冲突的依赖项
//implementation 'com.github.gzu-liyujiang.Android_CN_OAID:OAID_ASUS:版本号' //华硕
//implementation 'com.github.gzu-liyujiang.Android_CN_OAID:OAID_BUN:版本号' //中兴、卓易
implementation 'com.github.gzu-liyujiang.Android_CN_OAID:OAID_HEYTAP:版本号' //欧珀、一加
//implementation 'com.github.gzu-liyujiang.Android_CN_OAID:OAID_SAMSUNG:版本号' //三星
implementation 'com.github.gzu-liyujiang.Android_CN_OAID:OAID_UODIS:版本号' //华为
implementation 'com.github.gzu-liyujiang.Android_CN_OAID:OAID_ZUI:版本号' //联想、摩托罗拉
implementation 'com.github.gzu-liyujiang.Android_CN_OAID:OAID_IMPL:版本号' //具体实现

如果用户关闭匿名设置,如何确定设备的唯一性?

以前是通过IMEI通过权限确定设备的唯一性,不过目前如果用户匿名权限关闭了,是不是就不能确定这个设备的唯一性了?看其他issues有的关闭权限返回的OAID是一个000000-000-0000-00000000这种常量,如何过滤掉这种未知的假OAID,未知常量的存在?

三星手机获取 OAID 失败

java.lang.NoSuchMethodError: No interface method getID()Ljava/lang/String; in class Lcom/samsung/android/deviceidservice/IDeviceIdService; or its super classes (declaration of 'com.samsung.android.deviceidservice.IDeviceIdService' appears in /data/app/~~4ngdABdmkys3tE5ryKg_Ew==/com.fenbi.android.zebraenglish-SrHAAnAcAXBQ_WqLx-Djqw==/base.apk!classes4.dex)
at com.github.gzuliyujiang.oaid.impl.SamsungImpl$1.onServiceConnected(SamsungImpl.java:72)
at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:2084)
at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:2116)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8462)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:596)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

依赖了官方的 SDK

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.