• Stars
    star
    2,309
  • Rank 19,938 (Top 0.4 %)
  • Language
    Java
  • License
    Apache License 2.0
  • Created over 6 years ago
  • Updated 8 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

🚀A lightweight, high availability Android version update framework.(一个轻量级、高可用性的Android版本更新框架)

XUpdate

api I Star

English | ChineseVideo tutorial

A lightweight, high availability Android version update framework. Click instruction document to experience it!

Please read 【wisdom of asking questions】 before raising the issue and strictly follow the issue template fill in and save everyone's time.

Please read the instruction document carefully before use, important things are to be repeated for three time!!!

Please read the instruction document carefully before use, important things are to be repeated for three time!!!

Please read the instruction document carefully before use, important things are to be repeated for three time!!!

About me

WeChat public number juejin zhihu CSDN jianshu segmentfault bilibili toutiao
我的Android开源之旅 Click me Click me Click me Click me Click me Click me Click me

Simplify use

If you want to use xupdate faster, reduce the difficulty of integration, support breakpoint continuation download and other expansion functions, you can try to use XUpdateAPI.

Rapid integration of X-Library

In order to facilitate the rapid integration of X-Library, I provide a template project for your reference: https://github.com/xuexiangjys/TemplateAppProject


Features

  • It supports Post or Get request to check version, and supports user-defined network requests.

  • Only version update under WiFi is supported。

  • Support silent download (background update) and automatic version update.

  • The user-friendly version update prompt pop-up window is provided to customize the theme style.

  • It supports user-defined version update checker, parser, prompter, downloader, install listener and error listener.

  • Support MD5 file verification, version ignore, version forced update and other functions.

  • It supports the user-defined file verification method【MD5 verification by default】.

  • Support custom request API interface.

  • Compatible with Android 6.0 ~ 11.0.

  • Support Chinese and English language (internationalization).

  • Support the use of the flutter plugin:flutter_xupdate

  • Support the use of react native plugin:react-native-xupdate

Stargazers over time

Stargazers over time

Composition structure

This framework refers to AppUpdate some ideas and UI, the various parts of the version update are separated to form the following parts:

  • IUpdateChecker: Check for the latest version.

  • IUpdateParser: Parsing the data results returned by the server.

  • IUpdatePrompter: Display the latest version information.

  • IUpdateDownloader: Download the latest version of APK installation package.

  • IUpdateHttpService: The interface for network request.

In addition, there are two listeners:

  • OnUpdateFailureListener: Listening error

  • OnInstallListener: Callback of application installation

Update core manager:

  • IUpdateProxy: Responsible for the process control of version update, calling update to start the version update process.

Update process

Process after calling update:

IUpdateProxy/XUpdate --- (update) ---> IUpdateChecker --->(Request the server to get the latest version information)---> IUpdateParser ---> (Parse the data returned by the server, and build the UpdateEntity)---> IUpdateProxy ---> (If there is no latest version, end it directly, otherwise proceed to the following process)

    ---Automatic mode---> IUpdateDownloader ---> (Download the latest app apk) ---> Install application

    ---Non automatic mode---> IUpdatePrompter ---> Prompt for version update

                                                        ---> click Update ---> IUpdateDownloader ---> (Download the latest app apk) ---> Jump to application installation UI

                                                        ---> Click cancel or ignore ---> End

Click to view the framework UML design diagram


1、Demonstration

  • Default version update

xupdate_default.png

  • Background update

xupdate_background.png

  • Force version update

xupdate_force.png

  • Ignored version update

xupdate_ignore.png

  • Custom pop up theme

xupdate_custom.png

  • Use the system pop-up prompt

xupdate_system.png

Demo update background service

Because GitHub is slow to visit recently, if you need to experience xupdate better, you can Click to build a simple version update service.

Demo Download

Pgyer Download

Pgyer Download password: xuexiangjys

downloads

xupdate_download_pugongying.png

GitHub Download

downloads

xupdate_download.png


2、Quick integration guide

At present, it supports the use of the mainstream development tool AndroidStudio and add dependency by configures build.gradle directly.

2.1、Add gradle dependency

1.In the project root directory build.gradle:

allprojects {
     repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}
  1. Then add in the dependencies of build.gradle of the application project (usually app):

The following is the version description. Choose one.

  • androidx project: above 2.0.0
dependencies {
  ...
  // androidx project
  implementation 'com.github.xuexiangjys:XUpdate:2.1.4'
}
  • support project: below 1.1.6
dependencies {
  ...
  // support project
  implementation 'com.github.xuexiangjys:XUpdate:1.1.6'
}

2.2、Initialization

Initialize settings at the top of the application:

XUpdate.get()
    .debug(true)
    .isWifiOnly(true)                                               // By default, only version updates are checked under WiFi
    .isGet(true)                                                    // The default setting uses Get request to check versions
    .isAutoMode(false)                                              // The default setting is non automatic mode
    .param("versionCode", UpdateUtils.getVersionCode(this))         // Set default public request parameters
    .param("appKey", getPackageName())
    .setOnUpdateFailureListener(new OnUpdateFailureListener() {     // Set listening for version update errors
        @Override
        public void onFailure(UpdateError error) {
            if (error.getCode() != CHECK_NO_NEW_VERSION) {          // Handling different errors
                ToastUtils.toast(error.toString());
            }
        }
    })
    .supportSilentInstall(true)                                     // Set whether silent installation is supported. The default is true
    .setIUpdateHttpService(new OKHttpUpdateHttpService())           // This must be set! Realize the network request function.
    .init(this);                                                    // This must be initialized

【note】: if there is any problem, you can open debug mode to track the problem. If you also need to log on disk, you can implement the following interface.

XUpdate.get().setILogger(new ILogger() {
    @Override
    public void log(int priority, String tag, String message, Throwable t) {
        // Realize the function of logging
    }
});

2.3、Version update entity information

(1) UpdateEntity

Field name Type Default value Description
mHasUpdate boolean false Whether have the latest version
mIsForce boolean false Force installation: app cannot be used without installation
mIsIgnorable boolean false Whether the version can be ignored
mVersionCode int 0 Latest version code
mVersionName String unknown_version Latest version name
mUpdateContent String "" Update content
mDownloadEntity DownloadEntity Download information entity
mIsSilent boolean false Whether to download silently: when there is a new version, do not prompt to download directly
mIsAutoInstall boolean true Whether to automatic install app when the download is completed

(2) DownloadEntity

Field name Type Default value Description
mDownloadUrl String "" Download address
mCacheDir String "" File download directory
mMd5 String "" The encrypted check value of the downloaded file (MD5 encryption is used by default), which is used to verify and prevent the downloaded APK file from being replaced (the latest demo has a tool for calculating the check value). Note that the MD5 value here is not the MD5 value of the application signature file!
mSize long 0 Size of download file【unit: KB】
mIsShowNotification boolean false Whether to show download progress in the notification bar

(3) PromptEntity

Field name Type Default value Description
mThemeColor int R.color.xupdate_default_theme_color Theme colors (background colors for progress bars and buttons)
mTopResId int R.drawable.xupdate_bg_app_top Top background image resource ID
mTopDrawableTag String "" Top background image drawable tag
mButtonTextColor int 0 Button text color
mSupportBackgroundUpdate boolean false Whether background updates are supported
mWidthRatio float -1(Unconstrained) The ratio of the width of the version update prompter to the screen
mHeightRatio float -1(Unconstrained) The ratio of the height of the version update prompter to the screen
mIgnoreDownloadError boolean false Whether to ignore the download exception (the update prompt box will not disappear if the download fails)

2.4、File encryption verification method

The default file encryption verification method used in this framework is MD5 encryption. Of course, if you don't want to use MD5 encryption, you can also customize the File Encryptor IFileEncryptor. The following is the implementation of MD5 File Encryptor for reference:

/**
 * The default file encryption calculation uses MD5 encryption
 *
 * @author xuexiang
 * @since 2019-09-06 14:21
 */
public class DefaultFileEncryptor implements IFileEncryptor {
    /**
     * Encrypted files
     *
     * @param file
     * @return
     */
    @Override
    public String encryptFile(File file) {
        return Md5Utils.getFileMD5(file);
    }

    /**
     * Verify that the file is valid (whether the encryption is consistent)
     *
     * @param encrypt The encrypted value, is considered to be valid if encrypt is empty.
     * @param file    File to be verified
     * @return Whether the document is valid
     */
    @Override
    public boolean isFileValid(String encrypt, File file) {
        return TextUtils.isEmpty(encrypt) || encrypt.equalsIgnoreCase(encryptFile(file));
    }
}

Finally, call the XUpdate.get().setIFileEncryptor method, settings will take effect.


3、Version update

3.1、Default version update

You can directly call the following code to complete the version update operation:

XUpdate.newBuild(getActivity())
        .updateUrl(mUpdateUrl)
        .update();

It should be noted that with the default version update, the JSON format returned by the request server should include the following contents:

{
  "Code": 0,
  "Msg": "",
  "UpdateStatus": 1,
  "VersionCode": 3,
  "VersionName": "1.0.2",
  "ModifyContent": "1、优化api接口。\r\n2、添加使用demo演示。\r\n3、新增自定义更新服务API接口。\r\n4、优化更新提示界面。",
  "DownloadUrl": "https://raw.githubusercontent.com/xuexiangjys/XUpdate/master/apk/xupdate_demo_1.0.2.apk",
  "ApkSize": 2048,
  "ApkMd5": ""
}

Field description:

  • Code: 0 means the request is successful, non-0 means failure.
  • Msg: Request error information.
  • UpdateStatus: 0 means no update, 1 means version update, no forced upgrade is required, and 2 represents version update and forced upgrade is required.
  • VersionCode: Version number, self incrementing. Used to compare whether the version is the latest version.
  • VersionName: Display name of version.
  • ModifyContent: Content of version update.
  • DownloadUrl: Download address of application APK file.
  • ApkSize: The file size of the application APK file, in KB.
  • ApkMd5: Apply the MD5 value of the APK file. If not, the APK cannot be guaranteed to be complete and will be downloaded again every time. The framework uses MD5 encryption by default.

3.2、Automatic version update

Automatic version update: auto check version + auto download APK + auto install APK (silent install).

You only need to set isAutoMode(true). However, if the device does not have root permission, it will not be able to complete automatic update (because the silent installation requires root permission).

XUpdate.newBuild(getActivity())
        .updateUrl(mUpdateUrl)
        .isAutoMode(true) // If you need to be completely unattended and update automatically, you need root permission【required for silent installation】
        .update();

3.3、Support background update

After enabling the background update, users can enter the background update after clicking the "background update" button.

XUpdate.newBuild(getActivity())
        .updateUrl(mUpdateUrl)
        .supportBackgroundUpdate(true)
        .update();

3.4、Force version update

If the user does not update, the program will not work normally. The server only needs to return the UpdateStatus field to 2.

Of course, if you customize the request return API, you only need to set the mIsForce field of UpdateEntity to true.

3.5、Custom version update prompt pop-up theme

By setting the update top picture, theme color, button text color, width to height ratio, etc

  • promptThemeColor: Set theme color
  • promptButtonTextColor: Set the text color of the button
  • promptTopResId: Set top background image Resource ID
  • promptTopDrawable: Set top background image drawable
  • promptTopBitmap: Set top background image bitmap
  • promptWidthRatio: Set the ratio of the width of the version update prompt to the screen. The default value is -1(No constraint is required).
  • promptHeightRatio: Set the ratio of the height of the version update prompt to the screen. The default value is -1(No constraint is required).
XUpdate.newBuild(getActivity())
        .updateUrl(mUpdateUrl)
        .promptThemeColor(ResUtils.getColor(R.color.update_theme_color))
        .promptButtonTextColor(Color.WHITE)
        .promptTopResId(R.mipmap.bg_update_top)
        .promptWidthRatio(0.7F)
        .update();

3.6、Custom version update parser

The implementation of IUpdateParser interface can realize the user-defined parser.

XUpdate.newBuild(getActivity())
        .updateUrl(mUpdateUrl3)
        .updateParser(new CustomUpdateParser()) // Set up a custom version update parser
        .update();

public class CustomUpdateParser implements IUpdateParser {
    @Override
    public UpdateEntity parseJson(String json) throws Exception {
        CustomResult result = JsonUtil.fromJson(json, CustomResult.class);
        if (result != null) {
            return new UpdateEntity()
                    .setHasUpdate(result.hasUpdate)
                    .setIsIgnorable(result.isIgnorable)
                    .setVersionCode(result.versionCode)
                    .setVersionName(result.versionName)
                    .setUpdateContent(result.updateLog)
                    .setDownloadUrl(result.apkUrl)
                    .setSize(result.apkSize);
        }
        return null;
    }
}

3.7、Custom version update checker + version update parser + version update prompter

  • By implementing the IUpdateChecker interface, the checker can be customized.

  • By implementing the IUpdateParser interface, the parser can be customized.

  • By implementing the IUpdatePrompter interface, the prompter can be customized.

XUpdate.newBuild(getActivity())
        .updateUrl(mUpdateUrl3)
        .updateChecker(new DefaultUpdateChecker() {
            @Override
            public void onBeforeCheck() {
                super.onBeforeCheck();
                CProgressDialogUtils.showProgressDialog(getActivity(), "查询中...");
            }
            @Override
            public void onAfterCheck() {
                super.onAfterCheck();
                CProgressDialogUtils.cancelProgressDialog(getActivity());
            }
        })
        .updateParser(new CustomUpdateParser())
        .updatePrompter(new CustomUpdatePrompter(getActivity()))
        .update();


public class CustomUpdatePrompter implements IUpdatePrompter {

    private Context mContext;

    public CustomUpdatePrompter(Context context) {
        mContext = context;
    }

    @Override
    public void showPrompt(@NonNull UpdateEntity updateEntity, @NonNull IUpdateProxy updateProxy, @NonNull PromptEntity promptEntity) {
        showUpdatePrompt(updateEntity, updateProxy);
    }

    /**
     * Show custom version update prompter
     *
     * @param updateEntity
     * @param updateProxy
     */
    private void showUpdatePrompt(final @NonNull UpdateEntity updateEntity, final @NonNull IUpdateProxy updateProxy) {
        String updateInfo = UpdateUtils.getDisplayUpdateInfo(mContext, updateEntity);

        new AlertDialog.Builder(mContext)
                .setTitle(String.format("是否升级到%s版本?", updateEntity.getVersionName()))
                .setMessage(updateInfo)
                .setPositiveButton("升级", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        updateProxy.startDownload(updateEntity, new OnFileDownloadListener() {
                            @Override
                            public void onStart() {
                                HProgressDialogUtils.showHorizontalProgressDialog(mContext, "下载进度", false);
                            }

                            @Override
                            public void onProgress(float progress, long total) {
                                HProgressDialogUtils.setProgress(Math.round(progress * 100));
                            }

                            @Override
                            public boolean onCompleted(File file) {
                                HProgressDialogUtils.cancel();
                                return true;
                            }

                            @Override
                            public void onError(Throwable throwable) {
                                HProgressDialogUtils.cancel();
                            }
                        });
                    }
                })
                .setNegativeButton("暂不升级", null)
                .setCancelable(false)
                .create()
                .show();
    }

3.8、Only use the downloader function to download APK

XUpdate.newBuild(getActivity())
        .apkCacheDir(PathUtils.getAppExtCachePath())  // Set the root directory of the download cache
        .build()
        .download(mDownloadUrl, new OnFileDownloadListener() {   // Set the download address and download listener
            @Override
            public void onStart() {
                HProgressDialogUtils.showHorizontalProgressDialog(getContext(), "下载进度", false);
            }

            @Override
            public void onProgress(float progress, long total) {
                HProgressDialogUtils.setProgress(Math.round(progress * 100));
            }

            @Override
            public boolean onCompleted(File file) {
                HProgressDialogUtils.cancel();
                ToastUtils.toast("apk下载完毕,文件路径:" + file.getPath());
                return false;
            }

            @Override
            public void onError(Throwable throwable) {
                HProgressDialogUtils.cancel();
            }
        });

3.9、Only use the APK installed features of XUpdate

_XUpdate.startInstallApk(getContext(), FileUtils.getFileByPath(PathUtils.getFilePathByUri(getContext(), data.getData()))); // Set the path where the file is located

If your APK installation is different, you can implement your own APK installer. You only need to implement the OnInstallListener interface and use the XUpdate.setOnInstallListener set it to take effect.

3.10、International

Due to the limited level of the author, only Chinese and English are supported【the default language is English】. If you need to support other languages, you only need to create a new corresponding language file under the res of your own project to translate in multiple languages.

Please refer to xupdate_strings.xml

What? You don't know Android's multilingual configuration yet? I suggest you take a look at this article:Android项目国际化多国语言适配

Proguard

-keep class com.xuexiang.xupdate.entity.** { *; }

// Note: if you use a custom API parser for parsing, you need to add confusion to your custom API entities. Here are the custom API entity obfuscation rules configured in this demo:
-keep class com.xuexiang.xupdatedemo.entity.** { *; }

Related links


Thanks

https://github.com/WVector/AppUpdate

Sponsor

Your support is the driving force of my maintenance. I will list the list of all the reward personnel at the bottom as the voucher. Please leave the notes of the support items before rewarding!

pay.png

Thank you for your sponsorship:

Name Money Platform
*天 100¥ WeChat
*航 10¥ Alipay
X*? 18.88¥ WeChat
*网 1¥ WeChat
Joe 88.88¥ WeChat

WeChat Subscription

More information, please scan my personal WeChat Subscription:【我的Android开源之旅】

Contact

More Repositories

1

XUI

💍A simple and elegant Android native UI framework, free your hands! (一个简洁而优雅的Android原生UI框架,解放你的双手!)
Java
4,849
star
2

flutter_template

The project of the empty template with Flutter has built the basic framework to realize the functions of internationalization, theme peeling, login and registration, etc.(Flutter空壳模板工程,已搭建基础框架,实现国际化、主题换肤、登录注册、自动路由注册等功能,可在此基础上简单修改实现自己的应用功能)
Dart
897
star
3

TemplateAppProject

Android template project, fast construction (integrated XUI, XUtil, XAOP, XPage, XUpdate, XHttp2, Umeng Statistics and Walle multi-channel package). Android空壳模板工程,快速搭建(集成了XUI、XUtil、XAOP、XPage、XUpdate、XHttp2、友盟统计和walle多渠道打包)
Java
838
star
4

XPush

🚀一个轻量级、可插拔的Android消息推送框架。一键集成推送(极光推送、友盟推送、信鸽推送、华为、小米推送等),提供有效的保活机制,支持推送的拓展,充分解耦推送和业务逻辑,解放你的双手!
Java
767
star
5

XAOP

🔥A lightweight AOP(Android) application framework. Includes the most practical AOP applications.(一个轻量级的AOP(Android)应用框架。囊括了最实用的AOP应用)
Java
733
star
6

XHttp2

💪A powerful network request library, encapsulated using the RxJava2 + Retrofit2 + OKHttp combination.(一个功能强悍的网络请求库,使用RxJava2 + Retrofit2 + OKHttp组合进行封装)
Java
403
star
7

XPage

🔥A very useful Fragment page framework!(一个非常方便实用的fragment页面框架!)
Java
393
star
8

flutter_xupdate

A Flutter plugin for XUpdate(Android Version Update Library)
Dart
290
star
9

XUtil

一个方便实用的Android工具类库
Java
224
star
10

XUpdateService

Use Spring Boot easy build, Gradle build, and provide update service for XUpdate.(使用Spring Boot简易搭建,Gradle构建,为XUpdate提供更新服务)
Java
217
star
11

FlutterSample

Flutter使用指南,包含众多组件和插件的使用
Dart
205
star
12

XQRCode

A very convenient and practical qrcode scanning, analysis, generation library.(一个非常方便实用的二维码扫描、解析、生成库)
Java
193
star
13

XTask

一个拓展性极强的Android任务执行框架。可自由定义和组合任务来实现你想要的功能,尤其适用于处理复杂的业务流程,可灵活添加前置任务或者调整执行顺序。例如:应用的启动初始化流程。
Java
146
star
14

TemplateSimpleProject

简化版的Android空壳模板工程,快速搭建(集成了XUI、XUtil、XAOP、XPage、友盟统计和walle多渠道打包)
Java
131
star
15

xupdate-management

使用Vue.js编写的版本更新管理后台,为XUpdate提供版本更新管理
Vue
116
star
16

XVideo

一个能自动进行压缩的小视频录制库
C
102
star
17

XUpdateAPI

简化XUpdate的使用, 一键实现版本更新功能!
Java
92
star
18

RxUtil2

一个实用的RxJava2工具类库
Java
90
star
19

AndroidAdvancedLearning

Android进阶学习(源码分析、经验技术、感悟等)
71
star
20

XFloatView

一个简易的悬浮窗实现方案
Java
66
star
21

architect-java

成为架构师必须要看的算法实例
Java
56
star
22

TemplateAppProject-kotlin

Android空壳模板工程(kotlin版本),快速搭建(集成了XUI、XUtil、XAOP、XPage、XUpdate、XHttp2、友盟统计和walle多渠道打包)
Kotlin
56
star
23

XOrmlite

一个方便实用的OrmLite数据库框架,支持一键集成。
Java
55
star
24

react-native-xupdate

A React-Native plugin for XUpdate(Android Version Update Library)
Java
53
star
25

XHttpApi

一个简单的spring boot搭建的api服务,为XHttp提供服务支持。包括:常用的数据库数据增、删、改、查,文件上传下载,全局异常捕获、权限认证、日志记录等。
Java
50
star
26

TemplateAndServer

简化版的Android服务端模板,用于接口模拟测试。
Java
49
star
27

RxBus

一个简易的Android事件通知库,使用RxJava和Javassist设计,拒绝使用反射,保证性能高效稳定。
Java
43
star
28

Protobuf-gRPC-Android

教你如何使用ProtoBuf,通过gRPC服务在android上进行网络请求
Java
42
star
29

XRouter

一个轻量级的Android路由框架,基于ARouter上进行改良,优化Fragment的使用,可结合XPage使用。
Java
42
star
30

XLog

一个简易的日志打印框架(支持打印策略自定义,默认提供2种策略:logcat打印和磁盘打印)
Java
37
star
31

XIPC

一个Android通用的IPC(进程通信)框架。该项目主要是模仿饿了么开源项目Hermes的设计进行的自我理解改写。
Java
36
star
32

flutter_app_update_example

演示如何使用现有的flutter插件实现应用内的版本更新功能
Dart
33
star
33

flutter_update_dialog

Application version update dialog.
Dart
31
star
34

RxUtil

[DEPRECATED]囊括了最实用的RxJava工具类集合
Java
31
star
35

XMark

一个简易的埋点解决方案(基于JakeWharton的hugo基础上改造)
Java
29
star
36

RxJava3Sample

RxJava3使用演示, 包含简介、例子、日志和源码等内容。
Java
28
star
37

XTCP

一个便捷的TCP消息包拼装和解析框架
Java
24
star
38

TemplateSimpleProject-kotlin

简化版的Android空壳模版工程(kotlin版本),快速搭建(集成了XUI、XUtil、XAOP、XPage、友盟统计和walle多渠道打包)
Kotlin
22
star
39

TinkerTest

演示如何使用腾讯的热修复框架-Tinker
Java
21
star
40

MarqueeTextView

Android滚动字幕,支持动态添加和删除,支持消息数据的更新
Java
20
star
41

CloudBlindDate

云相亲,一种解决地域、时间、距离的快捷相亲方式。利用TemplateAppProject快速开发,半天完成主体功能。
Java
19
star
42

XPush-MQTT

MQTT在Android上的使用,目前已集成了XPush
Java
17
star
43

KotlinSample

Kotlin相关使用案例
Kotlin
15
star
44

AndroidPerformanceSample

Android性能优化实践
Java
14
star
45

AppAnalyticsDemo

App应用统计分析演示,集合了友盟数据统计/推送,Bugly的日志上报/更新以及美团的多渠道打包等
Java
13
star
46

XNoBug

一个轻量、高扩展性的Android日志上报框架。
Java
12
star
47

SandHookTest

SandHook在Android上的Hook应用
Java
11
star
48

OCRCamera

一个能够快速识别卡片的智能照相机,可配合百度OCR文字识别使用。
Java
9
star
49

GoogleComponentsDemo

Google Architecture Components 演示程序
Java
8
star
50

Navigation_XPage

Google官方Fragment页面框架Navigation和XPage开源框架的使用对比。
Java
8
star
51

AutoSizeTest

使用AndroidAutoSize屏幕适配演示
Java
8
star
52

UtilXX

UtilXX是Android的开源工具框架
Java
8
star
53

PhantomTest

满帮集团插件化框架Phantom使用演示
Java
8
star
54

CameraView

分别使用camera api1、api2和google的CameraView来实现照相机功能
Java
8
star
55

JPushSample

极光推送Android客户端使用指南
Java
7
star
56

UIThemeSample

Android的UI主题使用案例
Kotlin
7
star
57

JNI-CMake

Android使用CMake和Android.mk进行JNI开发演示
C++
6
star
58

WebRTC-Android

WebRTC在Android上的使用
Java
6
star
59

react-native-marquee-textview

MarqueeTextview for React Native
Java
6
star
60

TemplateSimpleProject-databinding

简化版的Android空壳模版工程(kotlin-databinding版本),快速搭建(集成了XUI、XUtil、XAOP、XPage、友盟统计和walle多渠道打包)
Kotlin
6
star
61

TemplateProject

模版空壳Android工程,快速搭建(添加了XUtil、XPage和XAOP)
Java
6
star
62

mace_demo

小米mace 深度学习框架 已经编译成功的android demo
Java
5
star
63

BuglyTest

腾讯Bugly(日志上报、运营统计、应用升级平台)接入演示demo
Java
5
star
64

AndroidStudioTemplates

Android Studio 自定义模板
FreeMarker
5
star
65

order

中小企业的订餐小系统
JavaScript
5
star
66

DeviceMonitor

监测手机或者指定应用的流量
Java
5
star
67

MyMVP

Dagger2 + Dagger2-android + ARouter + ButterKnife + MVP 的使用演示
Java
4
star
68

GreenDaoDemo

GreenDao数据库使用演示
Java
4
star
69

DataBindingSample

DataBinding使用集合
Kotlin
3
star
70

MyMVVM

ARouter + DataBinding + MVVM 的使用演示
Java
3
star
71

Resource

存放资源(图片、视频、gif等)
3
star
72

springboot-grpc-api

基于grpc-spring-boot-starter搭建起的grpc服务
Java
2
star
73

flutter_android_interactive

演示如何在android现有项目中集成flutter项目,进行混合开发
Dart
2
star
74

ComposeDemo

Compose的使用演示
Kotlin
2
star
75

XFtpClient

一个使用C++和java分别实现的FTP客户端
C++
2
star
76

TensorFlowDemo

TensorFlow在Android上使用案例的集合
Java
1
star
77

ImageProcess-Java

图片处理,使用opencv-java接口
Java
1
star
78

XSocialShare

社会化分享SDK
Java
1
star
79

uni-app-learn

uni-app 前端跨平台框架学习Demo
Vue
1
star
80

wechat-app-mall

微信小程序商城
1
star
81

SocialShareDemo

社会化分享演示
Java
1
star
82

xuexiangjys

1
star
83

VirtualApkTest

滴滴的VirtualApk插件化使用演示
Java
1
star