张波

提交代码

Showing 57 changed files with 3064 additions and 0 deletions
  1 +*.iml
  2 +.gradle
  3 +/local.properties
  4 +/.idea
  5 +.DS_Store
  6 +/build
  7 +/captures
  8 +.externalNativeBuild
  9 +.cxx
  10 +local.properties
  1 +/build
  1 +plugins {
  2 + id 'com.android.application'
  3 + id 'kotlin-android'
  4 + id 'kotlin-android-extensions'
  5 +}
  6 +
  7 +android {
  8 + compileSdkVersion var.compileSdkVersion
  9 + buildToolsVersion var.buildToolsVersion
  10 +
  11 + defaultConfig {
  12 + applicationId "com.example.myapplication"
  13 + minSdkVersion var.minSdkVersion
  14 + targetSdkVersion var.targetSdkVersion
  15 + versionCode 1
  16 + versionName "1.0"
  17 +
  18 + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
  19 + multiDexEnabled true
  20 + ndk {
  21 + // noinspection ChromeOsAbiSupport
  22 + abiFilters "armeabi-v7a", "arm64-v8a", "x86"
  23 + }
  24 +
  25 + javaCompileOptions {
  26 + annotationProcessorOptions {
  27 + arguments = [AROUTER_MODULE_NAME: project.getName()]
  28 + }
  29 + }
  30 + }
  31 +
  32 + buildTypes {
  33 + release {
  34 + minifyEnabled false
  35 + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  36 + }
  37 + }
  38 +
  39 + lintOptions {
  40 + abortOnError false
  41 + }
  42 +
  43 + compileOptions {
  44 + // Java兼容性设置为Java 8
  45 + sourceCompatibility JavaVersion.VERSION_1_8
  46 + targetCompatibility JavaVersion.VERSION_1_8
  47 + }
  48 +}
  49 +
  50 +repositories {
  51 + flatDir {
  52 + dirs 'libs'
  53 + }
  54 +}
  55 +
  56 +dependencies {
  57 +// implementation 'androidx.appcompat:appcompat:1.6.1'
  58 + implementation "com.google.android.material:material:1.4.0"
  59 +// implementation project(path: ':wdlog')
  60 + api(name: "wdlog-debug-v1.0.0", ext: "aar")
  61 +}
No preview for this file type
  1 +# Add project specific ProGuard rules here.
  2 +# You can control the set of applied configuration files using the
  3 +# proguardFiles setting in build.gradle.
  4 +#
  5 +# For more details, see
  6 +# http://developer.android.com/guide/developing/tools/proguard.html
  7 +
  8 +# If your project uses WebView with JS, uncomment the following
  9 +# and specify the fully qualified class name to the JavaScript interface
  10 +# class:
  11 +#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
  12 +# public *;
  13 +#}
  14 +
  15 +# Uncomment this to preserve the line number information for
  16 +# debugging stack traces.
  17 +#-keepattributes SourceFile,LineNumberTable
  18 +
  19 +# If you keep the line number information, uncomment this to
  20 +# hide the original source file name.
  21 +#-renamesourcefileattribute SourceFile
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3 + xmlns:tools="http://schemas.android.com/tools"
  4 + package="com.example.myapplication">
  5 + <!-- 请求网络 -->
  6 + <uses-permission android:name="android.permission.INTERNET" />
  7 + <uses-feature
  8 + android:name="android.software.leanback"
  9 + android:required="false" />
  10 + <application
  11 + android:name=".MyApplication"
  12 + android:allowBackup="true"
  13 + android:fullBackupContent="@xml/backup_rules"
  14 + android:icon="@mipmap/ic_launcher"
  15 + android:label="@string/app_name"
  16 + android:roundIcon="@mipmap/ic_launcher_round"
  17 + android:supportsRtl="true"
  18 + android:theme="@style/Theme.MyApplication"
  19 + tools:targetApi="31">
  20 +
  21 + <activity
  22 + android:name="com.example.myapplication.MainActivity"
  23 + android:exported="true"
  24 + android:launchMode="singleTask">
  25 + <intent-filter>
  26 + <action android:name="android.intent.action.MAIN" />
  27 + <category android:name="android.intent.category.LAUNCHER" />
  28 + </intent-filter>
  29 + </activity>
  30 + </application>
  31 +</manifest>
  1 +
  2 +package com.example.myapplication;
  3 +
  4 +import android.app.Activity;
  5 +import android.os.Bundle;
  6 +
  7 +import androidx.annotation.Nullable;
  8 +
  9 +/**
  10 + * @ProjectName: PeopleDailyVideo
  11 + * @Package: com.people.displayui.main
  12 + * @ClassName: WelcomeActivity
  13 + * @Description: 启动APP过渡页面
  14 + * @Author: wd
  15 + * @CreateDate: 2022/10/28 17:36
  16 + * @UpdateUser: wd
  17 + * @UpdateDate: 2022/10/28 17:36
  18 + * @UpdateRemark: 更新说明:
  19 + * @Version: 1.0
  20 + */
  21 +public class MainActivity extends Activity {
  22 +
  23 + @Override
  24 + protected void onCreate(@Nullable Bundle savedInstanceState) {
  25 + super.onCreate(savedInstanceState);
  26 + // 直接进入首页
  27 + }
  28 +}
  1 +
  2 +package com.example.myapplication;
  3 +
  4 +import android.app.Application;
  5 +import android.util.Log;
  6 +
  7 +import com.wd.base.log.Logger;
  8 +import com.wd.base.log.LoggerDefaultInit;
  9 +
  10 +
  11 +/**
  12 + * @author devel
  13 + * @time 2024/8/28 星期三 16:23
  14 + */
  15 +public class MyApplication extends Application {
  16 + @Override
  17 + public void onCreate() {
  18 + super.onCreate();
  19 + Log.e("zzzz","MyApplication onCreate");
  20 + LoggerDefaultInit.getInstance().init(true);
  21 + // test
  22 + Logger.t("zzzz").e("zzzz lalalalla");
  23 + }
  24 +}
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<vector xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:width="108dp"
  4 + android:height="108dp"
  5 + android:viewportWidth="108"
  6 + android:viewportHeight="108">
  7 + <path
  8 + android:fillColor="#3DDC84"
  9 + android:pathData="M0,0h108v108h-108z" />
  10 + <path
  11 + android:fillColor="#00000000"
  12 + android:pathData="M9,0L9,108"
  13 + android:strokeWidth="0.8"
  14 + android:strokeColor="#33FFFFFF" />
  15 + <path
  16 + android:fillColor="#00000000"
  17 + android:pathData="M19,0L19,108"
  18 + android:strokeWidth="0.8"
  19 + android:strokeColor="#33FFFFFF" />
  20 + <path
  21 + android:fillColor="#00000000"
  22 + android:pathData="M29,0L29,108"
  23 + android:strokeWidth="0.8"
  24 + android:strokeColor="#33FFFFFF" />
  25 + <path
  26 + android:fillColor="#00000000"
  27 + android:pathData="M39,0L39,108"
  28 + android:strokeWidth="0.8"
  29 + android:strokeColor="#33FFFFFF" />
  30 + <path
  31 + android:fillColor="#00000000"
  32 + android:pathData="M49,0L49,108"
  33 + android:strokeWidth="0.8"
  34 + android:strokeColor="#33FFFFFF" />
  35 + <path
  36 + android:fillColor="#00000000"
  37 + android:pathData="M59,0L59,108"
  38 + android:strokeWidth="0.8"
  39 + android:strokeColor="#33FFFFFF" />
  40 + <path
  41 + android:fillColor="#00000000"
  42 + android:pathData="M69,0L69,108"
  43 + android:strokeWidth="0.8"
  44 + android:strokeColor="#33FFFFFF" />
  45 + <path
  46 + android:fillColor="#00000000"
  47 + android:pathData="M79,0L79,108"
  48 + android:strokeWidth="0.8"
  49 + android:strokeColor="#33FFFFFF" />
  50 + <path
  51 + android:fillColor="#00000000"
  52 + android:pathData="M89,0L89,108"
  53 + android:strokeWidth="0.8"
  54 + android:strokeColor="#33FFFFFF" />
  55 + <path
  56 + android:fillColor="#00000000"
  57 + android:pathData="M99,0L99,108"
  58 + android:strokeWidth="0.8"
  59 + android:strokeColor="#33FFFFFF" />
  60 + <path
  61 + android:fillColor="#00000000"
  62 + android:pathData="M0,9L108,9"
  63 + android:strokeWidth="0.8"
  64 + android:strokeColor="#33FFFFFF" />
  65 + <path
  66 + android:fillColor="#00000000"
  67 + android:pathData="M0,19L108,19"
  68 + android:strokeWidth="0.8"
  69 + android:strokeColor="#33FFFFFF" />
  70 + <path
  71 + android:fillColor="#00000000"
  72 + android:pathData="M0,29L108,29"
  73 + android:strokeWidth="0.8"
  74 + android:strokeColor="#33FFFFFF" />
  75 + <path
  76 + android:fillColor="#00000000"
  77 + android:pathData="M0,39L108,39"
  78 + android:strokeWidth="0.8"
  79 + android:strokeColor="#33FFFFFF" />
  80 + <path
  81 + android:fillColor="#00000000"
  82 + android:pathData="M0,49L108,49"
  83 + android:strokeWidth="0.8"
  84 + android:strokeColor="#33FFFFFF" />
  85 + <path
  86 + android:fillColor="#00000000"
  87 + android:pathData="M0,59L108,59"
  88 + android:strokeWidth="0.8"
  89 + android:strokeColor="#33FFFFFF" />
  90 + <path
  91 + android:fillColor="#00000000"
  92 + android:pathData="M0,69L108,69"
  93 + android:strokeWidth="0.8"
  94 + android:strokeColor="#33FFFFFF" />
  95 + <path
  96 + android:fillColor="#00000000"
  97 + android:pathData="M0,79L108,79"
  98 + android:strokeWidth="0.8"
  99 + android:strokeColor="#33FFFFFF" />
  100 + <path
  101 + android:fillColor="#00000000"
  102 + android:pathData="M0,89L108,89"
  103 + android:strokeWidth="0.8"
  104 + android:strokeColor="#33FFFFFF" />
  105 + <path
  106 + android:fillColor="#00000000"
  107 + android:pathData="M0,99L108,99"
  108 + android:strokeWidth="0.8"
  109 + android:strokeColor="#33FFFFFF" />
  110 + <path
  111 + android:fillColor="#00000000"
  112 + android:pathData="M19,29L89,29"
  113 + android:strokeWidth="0.8"
  114 + android:strokeColor="#33FFFFFF" />
  115 + <path
  116 + android:fillColor="#00000000"
  117 + android:pathData="M19,39L89,39"
  118 + android:strokeWidth="0.8"
  119 + android:strokeColor="#33FFFFFF" />
  120 + <path
  121 + android:fillColor="#00000000"
  122 + android:pathData="M19,49L89,49"
  123 + android:strokeWidth="0.8"
  124 + android:strokeColor="#33FFFFFF" />
  125 + <path
  126 + android:fillColor="#00000000"
  127 + android:pathData="M19,59L89,59"
  128 + android:strokeWidth="0.8"
  129 + android:strokeColor="#33FFFFFF" />
  130 + <path
  131 + android:fillColor="#00000000"
  132 + android:pathData="M19,69L89,69"
  133 + android:strokeWidth="0.8"
  134 + android:strokeColor="#33FFFFFF" />
  135 + <path
  136 + android:fillColor="#00000000"
  137 + android:pathData="M19,79L89,79"
  138 + android:strokeWidth="0.8"
  139 + android:strokeColor="#33FFFFFF" />
  140 + <path
  141 + android:fillColor="#00000000"
  142 + android:pathData="M29,19L29,89"
  143 + android:strokeWidth="0.8"
  144 + android:strokeColor="#33FFFFFF" />
  145 + <path
  146 + android:fillColor="#00000000"
  147 + android:pathData="M39,19L39,89"
  148 + android:strokeWidth="0.8"
  149 + android:strokeColor="#33FFFFFF" />
  150 + <path
  151 + android:fillColor="#00000000"
  152 + android:pathData="M49,19L49,89"
  153 + android:strokeWidth="0.8"
  154 + android:strokeColor="#33FFFFFF" />
  155 + <path
  156 + android:fillColor="#00000000"
  157 + android:pathData="M59,19L59,89"
  158 + android:strokeWidth="0.8"
  159 + android:strokeColor="#33FFFFFF" />
  160 + <path
  161 + android:fillColor="#00000000"
  162 + android:pathData="M69,19L69,89"
  163 + android:strokeWidth="0.8"
  164 + android:strokeColor="#33FFFFFF" />
  165 + <path
  166 + android:fillColor="#00000000"
  167 + android:pathData="M79,19L79,89"
  168 + android:strokeWidth="0.8"
  169 + android:strokeColor="#33FFFFFF" />
  170 +</vector>
  1 +<vector xmlns:android="http://schemas.android.com/apk/res/android"
  2 + xmlns:aapt="http://schemas.android.com/aapt"
  3 + android:width="108dp"
  4 + android:height="108dp"
  5 + android:viewportWidth="108"
  6 + android:viewportHeight="108">
  7 + <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
  8 + <aapt:attr name="android:fillColor">
  9 + <gradient
  10 + android:endX="85.84757"
  11 + android:endY="92.4963"
  12 + android:startX="42.9492"
  13 + android:startY="49.59793"
  14 + android:type="linear">
  15 + <item
  16 + android:color="#44000000"
  17 + android:offset="0.0" />
  18 + <item
  19 + android:color="#00000000"
  20 + android:offset="1.0" />
  21 + </gradient>
  22 + </aapt:attr>
  23 + </path>
  24 + <path
  25 + android:fillColor="#FFFFFF"
  26 + android:fillType="nonZero"
  27 + android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
  28 + android:strokeWidth="1"
  29 + android:strokeColor="#00000000" />
  30 +</vector>
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:id="@+id/rl_parent"
  4 + android:layout_width="match_parent"
  5 + android:layout_height="match_parent"
  6 + android:background="@color/white" />
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
  3 + <background android:drawable="@drawable/ic_launcher_background" />
  4 + <foreground android:drawable="@drawable/ic_launcher_foreground" />
  5 + <monochrome android:drawable="@drawable/ic_launcher_foreground" />
  6 +</adaptive-icon>
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
  3 + <background android:drawable="@drawable/ic_launcher_background" />
  4 + <foreground android:drawable="@drawable/ic_launcher_foreground" />
  5 + <monochrome android:drawable="@drawable/ic_launcher_foreground" />
  6 +</adaptive-icon>
No preview for this file type
No preview for this file type
No preview for this file type
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<resources>
  3 + <color name="purple_200">#FFBB86FC</color>
  4 + <color name="purple_500">#FF6200EE</color>
  5 + <color name="purple_700">#FF3700B3</color>
  6 + <color name="teal_200">#FF03DAC5</color>
  7 + <color name="teal_700">#FF018786</color>
  8 + <color name="black">#FF000000</color>
  9 + <color name="white">#FFFFFFFF</color>
  10 +</resources>
  1 +<resources>
  2 + <string name="app_name">My Application</string>
  3 +</resources>
  1 +<resources xmlns:tools="http://schemas.android.com/tools">
  2 + <!-- Base application theme. -->
  3 + <style name="Theme.MyApplication" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
  4 + <!-- Primary brand color. -->
  5 + <item name="colorPrimary">@color/purple_500</item>
  6 + <item name="colorPrimaryVariant">@color/purple_700</item>
  7 + <item name="colorOnPrimary">@color/white</item>
  8 + <!-- Secondary brand color. -->
  9 + <item name="colorSecondary">@color/teal_200</item>
  10 + <item name="colorSecondaryVariant">@color/teal_700</item>
  11 + <item name="colorOnSecondary">@color/black</item>
  12 + <!-- Status bar color. -->
  13 + <item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
  14 + <!-- Customize your theme here. -->
  15 + </style>
  16 +</resources>
  1 +<?xml version="1.0" encoding="utf-8"?><!--
  2 + Sample backup rules file; uncomment and customize as necessary.
  3 + See https://developer.android.com/guide/topics/data/autobackup
  4 + for details.
  5 + Note: This file is ignored for devices older that API 31
  6 + See https://developer.android.com/about/versions/12/backup-restore
  7 +-->
  8 +<full-backup-content>
  9 + <!--
  10 + <include domain="sharedpref" path="."/>
  11 + <exclude domain="sharedpref" path="device.xml"/>
  12 +-->
  13 +</full-backup-content>
  1 +apply plugin: 'maven'
  2 +
  3 +buildscript {
  4 + ext.kotlin_version = "1.4.32"
  5 + repositories {
  6 + mavenLocal()
  7 + mavenCentral()
  8 + // 以下四行代码为阿里gradle源,需要的人自己放開使用
  9 + maven { url 'https://maven.aliyun.com/repository/google' }
  10 + maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
  11 + maven { url 'https://maven.aliyun.com/repository/public' }
  12 + maven { url 'https://maven.aliyun.com/repository/jcenter' }
  13 + maven { url 'https://maven.aliyun.com/nexus/content/repositories/releases' }
  14 + //阿里云 maven
  15 + maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
  16 + maven { url 'https://maven.aliyun.com/repository/releases' }
  17 +
  18 + google()
  19 +
  20 + maven { url "https://jitpack.io" }
  21 + //华为
  22 + maven { url 'https://developer.huawei.com/repo/' }
  23 + //阿里云QuickTracking
  24 + maven { url 'https://repo1.maven.org/maven2/' }
  25 +
  26 + maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
  27 + maven {
  28 + url 'https://maven.aliyun.com/nexus/content/repositories/google/'
  29 + name 'aliyun-google'
  30 + }
  31 +
  32 + // TingYun
  33 + maven { url "https://nexus2.tingyun.com/nexus/content/repositories/snapshots/" }
  34 + }
  35 +
  36 + dependencies {
  37 + classpath "com.android.tools.build:gradle:4.0.2"
  38 + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
  39 + classpath 'com.billy.android:autoregister:1.4.2'
  40 + // NOTE: Do not place your application dependencies here; they belong
  41 + // in the individual module build.gradle files
  42 + }
  43 +}
  44 +
  45 +allprojects {
  46 + repositories {
  47 + mavenLocal()
  48 + mavenCentral()
  49 + // 以下四行代码为阿里gradle源,需要的人自己放開使用
  50 + maven { url 'https://maven.aliyun.com/repository/google' }
  51 + maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
  52 + maven { url 'https://maven.aliyun.com/repository/public' }
  53 + maven { url 'https://maven.aliyun.com/repository/jcenter' }
  54 + maven { url 'https://maven.aliyun.com/nexus/content/repositories/releases' }
  55 + //阿里云 maven
  56 + maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
  57 + maven { url 'https://maven.aliyun.com/repository/releases' }
  58 + google()
  59 +
  60 + maven { url "https://jitpack.io" }
  61 + //华为
  62 + maven { url 'https://developer.huawei.com/repo/' }
  63 + //阿里云QuickTracking
  64 + maven { url 'https://repo1.maven.org/maven2/' }
  65 + maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
  66 + maven {
  67 + url 'https://maven.aliyun.com/nexus/content/repositories/google/'
  68 + name 'aliyun-google'
  69 + }
  70 +
  71 + flatDir { dirs 'src/main/libs' }
  72 + }
  73 +
  74 + project.configurations.configureEach {
  75 + resolutionStrategy.eachDependency { details ->
  76 + if (details.requested.group == 'com.android.android.support' && !details.requested.name.contains('multidex')) {
  77 + details.useVersion "28.0.0"
  78 + }
  79 +
  80 + }
  81 + }
  82 +
  83 + // 强制依赖
  84 + configurations.configureEach {
  85 + exclude group: 'com.alipay.android.phone.thirdparty', module: 'securityguard-build'
  86 + resolutionStrategy {
  87 + force 'androidx.activity:activity:1.2.1'
  88 + force 'androidx.annotation:annotation:1.1.0'
  89 + force 'androidx.appcompat:appcompat:1.2.0'
  90 + force 'androidx.arch.core:core-common:2.1.0'
  91 + force 'androidx.arch.core:core-runtime:2.1.0'
  92 + force 'androidx.core:core-ktx:1.6.0'
  93 + force 'androidx.core:core:1.5.0'
  94 + force 'androidx.collection:collection:1.1.0'
  95 + force 'androidx.constraintlayout:constraintlayout:2.0.4'
  96 + force 'androidx.constraintlayout:constraintlayout-solver:2.0.4'
  97 + force 'androidx.coordinatorlayout:coordinatorlayout:1.1.0'
  98 + force 'androidx.fragment:fragment:1.3.1'
  99 + force 'androidx.lifecycle:lifecycle-common:2.3.0'
  100 + force 'androidx.multidex:multidex:2.0.1'
  101 + force 'androidx.recyclerview:recyclerview:1.2.0'
  102 + force 'androidx.vectordrawable:vectordrawable:1.1.0'
  103 + force 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
  104 + force 'com.squareup.okhttp3:okhttp:4.9.1'
  105 + force 'com.squareup.okio:okio:2.7.0'
  106 + force 'org.jetbrains.kotlin:kotlin-stdlib:1.4.32'
  107 + force 'org.jetbrains.kotlin:kotilin-stdlib-jdk8:1.4.32'
  108 + force 'org.jetbrains:annotations:15.0'
  109 + force 'net.sf.proguard:proguard-base:6.1.0'
  110 + }
  111 + }
  112 +}
  113 +
  114 +ext {
  115 + var = [
  116 + // SDK And Tools
  117 + applicationId : "com.wondertek.dss",
  118 + minSdkVersion : 25,
  119 + targetSdkVersion : 30,
  120 + compileSdkVersion: 30,
  121 + buildToolsVersion: "30.0.3",
  122 + // 版本号,正式版本 1.0.0 1000080 后两位,80即标识为发布版本
  123 + // 测试版本 1.0.0_TF1 1000001 后两位,01即为测试版本号,01-79
  124 + // 升级版本 1.0.0_RC1 1000081 后两位,81即为升级版本号,81-99
  125 + versionName : "1.0.0", // release正式
  126 + debugVnName : "", // debug开发模式 用于区分debug模式下上报的日志
  127 + versionCode : 100,
  128 + //此版本号是SDK版本,不能随便改
  129 + aar_version : "1.0.0",
  130 + ]
  131 +
  132 +}
  1 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2 +<profiles version="12">
  3 + <profile kind="CodeFormatterProfile" name="WonderTek_CodeFormatter_Convention_v1.0"
  4 + version="12">
  5 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert" />
  6 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations"
  7 + value="insert" />
  8 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration"
  9 + value="insert" />
  10 + <setting
  11 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression"
  12 + value="do not insert" />
  13 + <setting
  14 + id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration"
  15 + value="insert" />
  16 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment"
  17 + value="common_lines" />
  18 + <setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries"
  19 + value="true" />
  20 + <setting
  21 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters"
  22 + value="insert" />
  23 + <setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter"
  24 + value="do not insert" />
  25 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package"
  26 + value="insert" />
  27 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation"
  28 + value="common_lines" />
  29 + <setting
  30 + id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant"
  31 + value="do not insert" />
  32 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1" />
  33 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while"
  34 + value="do not insert" />
  35 + <setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags"
  36 + value="insert" />
  37 + <setting
  38 + id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration"
  39 + value="do not insert" />
  40 + <setting
  41 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws"
  42 + value="do not insert" />
  43 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement"
  44 + value="common_lines" />
  45 + <setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true" />
  46 + <setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4" />
  47 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator"
  48 + value="do not insert" />
  49 + <setting
  50 + id="org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration"
  51 + value="common_lines" />
  52 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments"
  53 + value="insert" />
  54 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments"
  55 + value="insert" />
  56 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits"
  57 + value="do not insert" />
  58 + <setting
  59 + id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration"
  60 + value="do not insert" />
  61 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for"
  62 + value="insert" />
  63 + <setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off" />
  64 + <setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="1" />
  65 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="49" />
  66 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1" />
  67 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1" />
  68 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator"
  69 + value="insert" />
  70 + <setting
  71 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations"
  72 + value="insert" />
  73 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement"
  74 + value="common_lines" />
  75 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant"
  76 + value="16" />
  77 + <setting
  78 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference"
  79 + value="do not insert" />
  80 + <setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true" />
  81 + <setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch"
  82 + value="true" />
  83 + <setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on" />
  84 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block"
  85 + value="insert" />
  86 + <setting
  87 + id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return"
  88 + value="insert" />
  89 + <setting
  90 + id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration"
  91 + value="20" />
  92 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter"
  93 + value="do not insert" />
  94 + <setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line"
  95 + value="false" />
  96 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field"
  97 + value="insert" />
  98 + <setting
  99 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments"
  100 + value="insert" />
  101 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block"
  102 + value="insert" />
  103 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator"
  104 + value="do not insert" />
  105 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations"
  106 + value="1" />
  107 + <setting
  108 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer"
  109 + value="do not insert" />
  110 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for"
  111 + value="do not insert" />
  112 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch"
  113 + value="do not insert" />
  114 + <setting
  115 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments"
  116 + value="do not insert" />
  117 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method"
  118 + value="insert" />
  119 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch"
  120 + value="do not insert" />
  121 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references"
  122 + value="16" />
  123 + <setting
  124 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration"
  125 + value="insert" />
  126 + <setting
  127 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression"
  128 + value="do not insert" />
  129 + <setting
  130 + id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant"
  131 + value="insert" />
  132 + <setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column"
  133 + value="false" />
  134 + <setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error" />
  135 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter"
  136 + value="insert" />
  137 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits"
  138 + value="insert" />
  139 + <setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block"
  140 + value="true" />
  141 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration"
  142 + value="end_of_line" />
  143 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard"
  144 + value="do not insert" />
  145 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation"
  146 + value="do not insert" />
  147 + <setting
  148 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments"
  149 + value="do not insert" />
  150 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch"
  151 + value="insert" />
  152 + <setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="120" />
  153 + <setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="false" />
  154 + <setting
  155 + id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression"
  156 + value="do not insert" />
  157 + <setting
  158 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant"
  159 + value="insert" />
  160 + <setting
  161 + id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation"
  162 + value="do not insert" />
  163 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator"
  164 + value="insert" />
  165 + <setting
  166 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration"
  167 + value="insert" />
  168 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for"
  169 + value="do not insert" />
  170 + <setting
  171 + id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments"
  172 + value="true" />
  173 + <setting
  174 + id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable"
  175 + value="insert" />
  176 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration"
  177 + value="end_of_line" />
  178 + <setting
  179 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation"
  180 + value="do not insert" />
  181 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch"
  182 + value="16" />
  183 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for"
  184 + value="insert" />
  185 + <setting
  186 + id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body"
  187 + value="0" />
  188 + <setting
  189 + id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments"
  190 + value="insert" />
  191 + <setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line"
  192 + value="false" />
  193 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16" />
  194 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause"
  195 + value="common_lines" />
  196 + <setting
  197 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference"
  198 + value="insert" />
  199 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer"
  200 + value="do not insert" />
  201 + <setting
  202 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations"
  203 + value="insert" />
  204 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation"
  205 + value="do not insert" />
  206 + <setting
  207 + id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call"
  208 + value="16" />
  209 + <setting
  210 + id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header"
  211 + value="true" />
  212 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces"
  213 + value="insert" />
  214 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default"
  215 + value="do not insert" />
  216 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional"
  217 + value="insert" />
  218 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line" />
  219 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration"
  220 + value="end_of_line" />
  221 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_lambda_body"
  222 + value="end_of_line" />
  223 + <setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true" />
  224 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters"
  225 + value="do not insert" />
  226 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch"
  227 + value="insert" />
  228 + <setting
  229 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation"
  230 + value="do not insert" />
  231 + <setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true" />
  232 + <setting
  233 + id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration"
  234 + value="20" />
  235 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_type_parameters" value="16" />
  236 + <setting
  237 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments"
  238 + value="insert" />
  239 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation"
  240 + value="16" />
  241 + <setting
  242 + id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration"
  243 + value="20" />
  244 + <setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error" />
  245 + <setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment"
  246 + value="true" />
  247 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement"
  248 + value="do not insert" />
  249 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try"
  250 + value="insert" />
  251 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing"
  252 + value="do not insert" />
  253 + <setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment"
  254 + value="true" />
  255 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer"
  256 + value="insert" />
  257 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator"
  258 + value="insert" />
  259 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator"
  260 + value="do not insert" />
  261 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer"
  262 + value="20" />
  263 + <setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column"
  264 + value="true" />
  265 + <setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1" />
  266 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation"
  267 + value="common_lines" />
  268 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case"
  269 + value="insert" />
  270 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis"
  271 + value="do not insert" />
  272 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources"
  273 + value="do not insert" />
  274 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert"
  275 + value="insert" />
  276 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if"
  277 + value="do not insert" />
  278 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments"
  279 + value="do not insert" />
  280 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter"
  281 + value="insert" />
  282 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration"
  283 + value="insert" />
  284 + <setting
  285 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression"
  286 + value="do not insert" />
  287 + <setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true" />
  288 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement"
  289 + value="insert" />
  290 + <setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false" />
  291 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="20" />
  292 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body"
  293 + value="insert" />
  294 + <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header"
  295 + value="true" />
  296 + <setting
  297 + id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration"
  298 + value="do not insert" />
  299 + <setting
  300 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant"
  301 + value="do not insert" />
  302 + <setting
  303 + id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration"
  304 + value="16" />
  305 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration"
  306 + value="0" />
  307 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression"
  308 + value="16" />
  309 + <setting
  310 + id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer"
  311 + value="do not insert" />
  312 + <setting
  313 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters"
  314 + value="do not insert" />
  315 + <setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line"
  316 + value="false" />
  317 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if"
  318 + value="insert" />
  319 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type"
  320 + value="insert" />
  321 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block"
  322 + value="insert" />
  323 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration"
  324 + value="end_of_line" />
  325 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case"
  326 + value="end_of_line" />
  327 + <setting
  328 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration"
  329 + value="do not insert" />
  330 + <setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false" />
  331 + <setting
  332 + id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression"
  333 + value="16" />
  334 + <setting
  335 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation"
  336 + value="do not insert" />
  337 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while"
  338 + value="insert" />
  339 + <setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled" />
  340 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch"
  341 + value="do not insert" />
  342 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="16" />
  343 + <setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true" />
  344 + <setting
  345 + id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration"
  346 + value="do not insert" />
  347 + <setting id="org.eclipse.jdt.core.formatter.wrap_before_conditional_operator"
  348 + value="true" />
  349 + <setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases"
  350 + value="true" />
  351 + <setting
  352 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression"
  353 + value="do not insert" />
  354 + <setting
  355 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized"
  356 + value="do not insert" />
  357 + <setting id="org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines"
  358 + value="2147483647" />
  359 + <setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries"
  360 + value="true" />
  361 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration"
  362 + value="end_of_line" />
  363 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for"
  364 + value="insert" />
  365 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="16" />
  366 + <setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations"
  367 + value="false" />
  368 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause"
  369 + value="common_lines" />
  370 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation"
  371 + value="80" />
  372 + <setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column"
  373 + value="false" />
  374 + <setting id="org.eclipse.jdt.core.compiler.source" value="1.8" />
  375 + <setting
  376 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized"
  377 + value="do not insert" />
  378 + <setting
  379 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws"
  380 + value="insert" />
  381 + <setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4" />
  382 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant"
  383 + value="insert" />
  384 + <setting
  385 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression"
  386 + value="insert" />
  387 + <setting
  388 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference"
  389 + value="do not insert" />
  390 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional"
  391 + value="insert" />
  392 + <setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true" />
  393 + <setting
  394 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer"
  395 + value="insert" />
  396 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try"
  397 + value="do not insert" />
  398 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources"
  399 + value="insert" />
  400 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="1" />
  401 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation"
  402 + value="do not insert" />
  403 + <setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer"
  404 + value="1" />
  405 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard"
  406 + value="do not insert" />
  407 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1" />
  408 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration"
  409 + value="16" />
  410 + <setting
  411 + id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration"
  412 + value="16" />
  413 + <setting
  414 + id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw"
  415 + value="insert" />
  416 + <setting id="org.eclipse.jdt.core.formatter.wrap_before_assignment_operator"
  417 + value="false" />
  418 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement"
  419 + value="do not insert" />
  420 + <setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.8" />
  421 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch"
  422 + value="end_of_line" />
  423 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces"
  424 + value="do not insert" />
  425 + <setting
  426 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters"
  427 + value="insert" />
  428 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation"
  429 + value="do not insert" />
  430 + <setting
  431 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer"
  432 + value="do not insert" />
  433 + <setting
  434 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression"
  435 + value="do not insert" />
  436 + <setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true" />
  437 + <setting
  438 + id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration"
  439 + value="do not insert" />
  440 + <setting
  441 + id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters"
  442 + value="insert" />
  443 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration"
  444 + value="common_lines" />
  445 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16" />
  446 + <setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false" />
  447 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_type_arguments" value="16" />
  448 + <setting
  449 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference"
  450 + value="do not insert" />
  451 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator"
  452 + value="do not insert" />
  453 + <setting
  454 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant"
  455 + value="do not insert" />
  456 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation"
  457 + value="16" />
  458 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations"
  459 + value="do not insert" />
  460 + <setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line"
  461 + value="true" />
  462 + <setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch"
  463 + value="true" />
  464 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement"
  465 + value="do not insert" />
  466 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator"
  467 + value="insert" />
  468 + <setting
  469 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration"
  470 + value="do not insert" />
  471 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1" />
  472 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label"
  473 + value="do not insert" />
  474 + <setting
  475 + id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header"
  476 + value="true" />
  477 + <setting
  478 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression"
  479 + value="do not insert" />
  480 + <setting
  481 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration"
  482 + value="do not insert" />
  483 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional"
  484 + value="insert" />
  485 + <setting
  486 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference"
  487 + value="do not insert" />
  488 + <setting
  489 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters"
  490 + value="do not insert" />
  491 + <setting
  492 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments"
  493 + value="do not insert" />
  494 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast"
  495 + value="do not insert" />
  496 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert"
  497 + value="insert" />
  498 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1" />
  499 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement"
  500 + value="do not insert" />
  501 + <setting
  502 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference"
  503 + value="do not insert" />
  504 + <setting
  505 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference"
  506 + value="do not insert" />
  507 + <setting
  508 + id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression"
  509 + value="16" />
  510 + <setting
  511 + id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer"
  512 + value="do not insert" />
  513 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration"
  514 + value="insert" />
  515 + <setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true" />
  516 + <setting
  517 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration"
  518 + value="do not insert" />
  519 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if"
  520 + value="do not insert" />
  521 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon"
  522 + value="do not insert" />
  523 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator"
  524 + value="do not insert" />
  525 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try"
  526 + value="do not insert" />
  527 + <setting
  528 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments"
  529 + value="do not insert" />
  530 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast"
  531 + value="do not insert" />
  532 + <setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true" />
  533 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow"
  534 + value="insert" />
  535 + <setting
  536 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration"
  537 + value="do not insert" />
  538 + <setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false" />
  539 + <setting
  540 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration"
  541 + value="insert" />
  542 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration"
  543 + value="16" />
  544 + <setting
  545 + id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference"
  546 + value="do not insert" />
  547 + <setting
  548 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters"
  549 + value="do not insert" />
  550 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for"
  551 + value="do not insert" />
  552 + <setting
  553 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws"
  554 + value="insert" />
  555 + <setting
  556 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression"
  557 + value="do not insert" />
  558 + <setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body"
  559 + value="true" />
  560 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16" />
  561 + <setting
  562 + id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments"
  563 + value="insert" />
  564 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator"
  565 + value="do not insert" />
  566 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer"
  567 + value="end_of_line" />
  568 + <setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true" />
  569 + <setting
  570 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration"
  571 + value="insert" />
  572 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters"
  573 + value="insert" />
  574 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch"
  575 + value="do not insert" />
  576 + <setting id="org.eclipse.jdt.core.compiler.compliance" value="1.8" />
  577 + <setting
  578 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference"
  579 + value="do not insert" />
  580 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation"
  581 + value="insert" />
  582 + <setting
  583 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments"
  584 + value="do not insert" />
  585 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration"
  586 + value="common_lines" />
  587 + <setting
  588 + id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer"
  589 + value="do not insert" />
  590 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case"
  591 + value="do not insert" />
  592 + <setting
  593 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations"
  594 + value="do not insert" />
  595 + <setting
  596 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration"
  597 + value="insert" />
  598 + <setting
  599 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference"
  600 + value="do not insert" />
  601 + <setting
  602 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration"
  603 + value="do not insert" />
  604 + <setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested"
  605 + value="true" />
  606 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast"
  607 + value="insert" />
  608 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant"
  609 + value="end_of_line" />
  610 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration"
  611 + value="end_of_line" />
  612 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="1" />
  613 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for"
  614 + value="insert" />
  615 + <setting
  616 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized"
  617 + value="insert" />
  618 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments"
  619 + value="do not insert" />
  620 + <setting
  621 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration"
  622 + value="do not insert" />
  623 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header"
  624 + value="16" />
  625 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while"
  626 + value="do not insert" />
  627 + <setting
  628 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant"
  629 + value="do not insert" />
  630 + <setting
  631 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments"
  632 + value="do not insert" />
  633 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation"
  634 + value="do not insert" />
  635 + <setting
  636 + id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters"
  637 + value="do not insert" />
  638 + <setting
  639 + id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header"
  640 + value="true" />
  641 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow"
  642 + value="insert" />
  643 + <setting
  644 + id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration"
  645 + value="insert" />
  646 + <setting
  647 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws"
  648 + value="do not insert" />
  649 + <setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="false" />
  650 + <setting
  651 + id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters"
  652 + value="do not insert" />
  653 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional"
  654 + value="insert" />
  655 + <setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description"
  656 + value="false" />
  657 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement"
  658 + value="do not insert" />
  659 + <setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space" />
  660 + <setting
  661 + id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations"
  662 + value="do not insert" />
  663 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1" />
  664 + <setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120" />
  665 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation"
  666 + value="do not insert" />
  667 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch"
  668 + value="insert" />
  669 + </profile>
  670 +</profiles>
  1 +# Project-wide Gradle settings.
  2 +# IDE (e.g. Android Studio) users:
  3 +# Gradle settings configured through the IDE *will override*
  4 +# any settings specified in this file.
  5 +# For more details on how to configure your build environment visit
  6 +# http://www.gradle.org/docs/current/userguide/build_environment.html
  7 +# Specifies the JVM arguments used for the daemon process.
  8 +# The setting is particularly useful for tweaking memory settings.
  9 +#org.gradle.jvmargs=-Xmx2048m
  10 +# When configured, Gradle will run in incubating parallel mode.
  11 +# This option should only be used with decoupled projects. More details, visit
  12 +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
  13 +# org.gradle.parallel=true
  14 +# AndroidX package structure to make it clearer which packages are bundled with the
  15 +# Android operating system, and which are packaged with your app's APK
  16 +# https://developer.android.com/topic/libraries/support-library/androidx-rn
  17 +android.useAndroidX=true
  18 +# Automatically convert third-party libraries to use AndroidX
  19 +android.enableJetifier=true
  20 +android.enableResourceOptimizations=false
  21 +#建议您关闭 R8 后再进行混淆
  22 +android.enableR8=false
  23 +android.enableR8.libraries=false
  24 +# 如果使用最新稳定版本 Android Studio 3.5 或以上,那么您需要在 gradle.properties 里面新增
  25 +android.buildOnlyTargetAbi=false
  26 +#网络请求接口版本 202204151851
  27 +requestVersion=107
  28 +#设置组件是否作为app还是lib,true是lib ,false 是app
  29 +#分享
  30 +isShareModule=true
  31 +#播放器
  32 +isPlayerModule=true
  33 +#是否直播模块运行 false可以单独运行
  34 +isLiveModule=true
  35 +org.gradle.daemon=true
  36 +org.gradle.parallel=true
  37 +org.gradle.configureondemand=true
  38 +org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
  39 +# Kotlin code style for this project: "official" or "obsolete":
  40 +kotlin.code.style=official
  41 +# Enables namespacing of each library's R class so that its R class includes only the
  42 +# resources declared in the library itself and none from the library's dependencies,
  43 +# thereby reducing the size of the R class for that library
  44 +#android.nonTransitiveRClass=true
  45 +
  46 +
No preview for this file type
  1 +#Fri Oct 23 14:37:25 CST 2020
  2 +distributionBase=GRADLE_USER_HOME
  3 +distributionPath=wrapper/dists
  4 +zipStoreBase=GRADLE_USER_HOME
  5 +zipStorePath=wrapper/dists
  6 +distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-6.8-all.zip
  1 +#!/usr/bin/env sh
  2 +
  3 +##############################################################################
  4 +##
  5 +## Gradle start up script for UN*X
  6 +##
  7 +##############################################################################
  8 +
  9 +# Attempt to set APP_HOME
  10 +# Resolve links: $0 may be a link
  11 +PRG="$0"
  12 +# Need this for relative symlinks.
  13 +while [ -h "$PRG" ] ; do
  14 + ls=`ls -ld "$PRG"`
  15 + link=`expr "$ls" : '.*-> \(.*\)$'`
  16 + if expr "$link" : '/.*' > /dev/null; then
  17 + PRG="$link"
  18 + else
  19 + PRG=`dirname "$PRG"`"/$link"
  20 + fi
  21 +done
  22 +SAVED="`pwd`"
  23 +cd "`dirname \"$PRG\"`/" >/dev/null
  24 +APP_HOME="`pwd -P`"
  25 +cd "$SAVED" >/dev/null
  26 +
  27 +APP_NAME="Gradle"
  28 +APP_BASE_NAME=`basename "$0"`
  29 +
  30 +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
  31 +DEFAULT_JVM_OPTS=""
  32 +
  33 +# Use the maximum available, or set MAX_FD != -1 to use that value.
  34 +MAX_FD="maximum"
  35 +
  36 +warn () {
  37 + echo "$*"
  38 +}
  39 +
  40 +die () {
  41 + echo
  42 + echo "$*"
  43 + echo
  44 + exit 1
  45 +}
  46 +
  47 +# OS specific support (must be 'true' or 'false').
  48 +cygwin=false
  49 +msys=false
  50 +darwin=false
  51 +nonstop=false
  52 +case "`uname`" in
  53 + CYGWIN* )
  54 + cygwin=true
  55 + ;;
  56 + Darwin* )
  57 + darwin=true
  58 + ;;
  59 + MINGW* )
  60 + msys=true
  61 + ;;
  62 + NONSTOP* )
  63 + nonstop=true
  64 + ;;
  65 +esac
  66 +
  67 +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
  68 +
  69 +# Determine the Java command to use to start the JVM.
  70 +if [ -n "$JAVA_HOME" ] ; then
  71 + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
  72 + # IBM's JDK on AIX uses strange locations for the executables
  73 + JAVACMD="$JAVA_HOME/jre/sh/java"
  74 + else
  75 + JAVACMD="$JAVA_HOME/bin/java"
  76 + fi
  77 + if [ ! -x "$JAVACMD" ] ; then
  78 + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
  79 +
  80 +Please set the JAVA_HOME variable in your environment to match the
  81 +location of your Java installation."
  82 + fi
  83 +else
  84 + JAVACMD="java"
  85 + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
  86 +
  87 +Please set the JAVA_HOME variable in your environment to match the
  88 +location of your Java installation."
  89 +fi
  90 +
  91 +# Increase the maximum file descriptors if we can.
  92 +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
  93 + MAX_FD_LIMIT=`ulimit -H -n`
  94 + if [ $? -eq 0 ] ; then
  95 + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
  96 + MAX_FD="$MAX_FD_LIMIT"
  97 + fi
  98 + ulimit -n $MAX_FD
  99 + if [ $? -ne 0 ] ; then
  100 + warn "Could not set maximum file descriptor limit: $MAX_FD"
  101 + fi
  102 + else
  103 + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
  104 + fi
  105 +fi
  106 +
  107 +# For Darwin, add options to specify how the application appears in the dock
  108 +if $darwin; then
  109 + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
  110 +fi
  111 +
  112 +# For Cygwin, switch paths to Windows format before running java
  113 +if $cygwin ; then
  114 + APP_HOME=`cygpath --path --mixed "$APP_HOME"`
  115 + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
  116 + JAVACMD=`cygpath --unix "$JAVACMD"`
  117 +
  118 + # We build the pattern for arguments to be converted via cygpath
  119 + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
  120 + SEP=""
  121 + for dir in $ROOTDIRSRAW ; do
  122 + ROOTDIRS="$ROOTDIRS$SEP$dir"
  123 + SEP="|"
  124 + done
  125 + OURCYGPATTERN="(^($ROOTDIRS))"
  126 + # Add a user-defined pattern to the cygpath arguments
  127 + if [ "$GRADLE_CYGPATTERN" != "" ] ; then
  128 + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
  129 + fi
  130 + # Now convert the arguments - kludge to limit ourselves to /bin/sh
  131 + i=0
  132 + for arg in "$@" ; do
  133 + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
  134 + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
  135 +
  136 + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
  137 + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
  138 + else
  139 + eval `echo args$i`="\"$arg\""
  140 + fi
  141 + i=$((i+1))
  142 + done
  143 + case $i in
  144 + (0) set -- ;;
  145 + (1) set -- "$args0" ;;
  146 + (2) set -- "$args0" "$args1" ;;
  147 + (3) set -- "$args0" "$args1" "$args2" ;;
  148 + (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
  149 + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
  150 + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
  151 + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
  152 + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
  153 + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
  154 + esac
  155 +fi
  156 +
  157 +# Escape application args
  158 +save () {
  159 + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
  160 + echo " "
  161 +}
  162 +APP_ARGS=$(save "$@")
  163 +
  164 +# Collect all arguments for the java command, following the shell quoting and substitution rules
  165 +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
  166 +
  167 +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
  168 +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
  169 + cd "$(dirname "$0")"
  170 +fi
  171 +
  172 +exec "$JAVACMD" "$@"
  1 +@if "%DEBUG%" == "" @echo off
  2 +@rem ##########################################################################
  3 +@rem
  4 +@rem Gradle startup script for Windows
  5 +@rem
  6 +@rem ##########################################################################
  7 +
  8 +@rem Set local scope for the variables with windows NT shell
  9 +if "%OS%"=="Windows_NT" setlocal
  10 +
  11 +set DIRNAME=%~dp0
  12 +if "%DIRNAME%" == "" set DIRNAME=.
  13 +set APP_BASE_NAME=%~n0
  14 +set APP_HOME=%DIRNAME%
  15 +
  16 +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
  17 +set DEFAULT_JVM_OPTS=
  18 +
  19 +@rem Find java.exe
  20 +if defined JAVA_HOME goto findJavaFromJavaHome
  21 +
  22 +set JAVA_EXE=java.exe
  23 +%JAVA_EXE% -version >NUL 2>&1
  24 +if "%ERRORLEVEL%" == "0" goto init
  25 +
  26 +echo.
  27 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
  28 +echo.
  29 +echo Please set the JAVA_HOME variable in your environment to match the
  30 +echo location of your Java installation.
  31 +
  32 +goto fail
  33 +
  34 +:findJavaFromJavaHome
  35 +set JAVA_HOME=%JAVA_HOME:"=%
  36 +set JAVA_EXE=%JAVA_HOME%/bin/java.exe
  37 +
  38 +if exist "%JAVA_EXE%" goto init
  39 +
  40 +echo.
  41 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
  42 +echo.
  43 +echo Please set the JAVA_HOME variable in your environment to match the
  44 +echo location of your Java installation.
  45 +
  46 +goto fail
  47 +
  48 +:init
  49 +@rem Get command-line arguments, handling Windows variants
  50 +
  51 +if not "%OS%" == "Windows_NT" goto win9xME_args
  52 +
  53 +:win9xME_args
  54 +@rem Slurp the command line arguments.
  55 +set CMD_LINE_ARGS=
  56 +set _SKIP=2
  57 +
  58 +:win9xME_args_slurp
  59 +if "x%~1" == "x" goto execute
  60 +
  61 +set CMD_LINE_ARGS=%*
  62 +
  63 +:execute
  64 +@rem Setup the command line
  65 +
  66 +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
  67 +
  68 +@rem Execute Gradle
  69 +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
  70 +
  71 +:end
  72 +@rem End local scope for the variables with windows NT shell
  73 +if "%ERRORLEVEL%"=="0" goto mainEnd
  74 +
  75 +:fail
  76 +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
  77 +rem the _cmd.exe /c_ return code!
  78 +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
  79 +exit /b 1
  80 +
  81 +:mainEnd
  82 +if "%OS%"=="Windows_NT" endlocal
  83 +
  84 +:omega
  1 +rootProject.name = "wdlog"
  2 +include ':app'
  3 +include ':wdlog'
  1 +plugins {
  2 + id 'com.android.library'
  3 + id 'kotlin-android'
  4 +}
  5 +
  6 +android {
  7 + compileSdkVersion var.compileSdkVersion
  8 +
  9 + defaultConfig {
  10 + minSdkVersion var.minSdkVersion
  11 + targetSdkVersion var.targetSdkVersion
  12 + versionCode var.versionCode
  13 + versionName var.versionName
  14 +
  15 + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  16 + consumerProguardFiles "consumer-rules.pro"
  17 +
  18 + buildConfigField "String", "API_VERSION", "\"${requestVersion}\""
  19 + }
  20 +
  21 + buildTypes {
  22 + release {
  23 + minifyEnabled false
  24 + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  25 + }
  26 + }
  27 + compileOptions {
  28 + sourceCompatibility JavaVersion.VERSION_1_8
  29 + targetCompatibility JavaVersion.VERSION_1_8
  30 + }
  31 +
  32 + // 自定义AAR包名
  33 + android.libraryVariants.all { variant ->
  34 + variant.outputs.all {
  35 + if (outputFileName != null && outputFileName.endsWith(".aar")) {
  36 + def fileName = "${project.name}-${buildType.name}-v${var.aar_version}.aar"
  37 + outputFileName = fileName
  38 + }
  39 + }
  40 + }
  41 +}
  42 +
  43 +dependencies {
  44 + implementation 'androidx.annotation:annotation:1.8.2'
  45 +}
  1 +# Add project specific ProGuard rules here.
  2 +# You can control the set of applied configuration files using the
  3 +# proguardFiles setting in build.gradle.
  4 +#
  5 +# For more details, see
  6 +# http://developer.android.com/guide/developing/tools/proguard.html
  7 +
  8 +# If your project uses WebView with JS, uncomment the following
  9 +# and specify the fully qualified class name to the JavaScript interface
  10 +# class:
  11 +#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
  12 +# public *;
  13 +#}
  14 +
  15 +# Uncomment this to preserve the line number information for
  16 +# debugging stack traces.
  17 +#-keepattributes SourceFile,LineNumberTable
  18 +
  19 +# If you keep the line number information, uncomment this to
  20 +# hide the original source file name.
  21 +#-renamesourcefileattribute SourceFile
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3 + package="com.wd.log">
  4 +
  5 +</manifest>
  1 +
  2 +package com.wd.base.log;
  3 +
  4 +import static com.wd.base.log.Utils.checkNotNull;
  5 +
  6 +import androidx.annotation.NonNull;
  7 +import androidx.annotation.Nullable;
  8 +
  9 +/**
  10 + * Android terminal log output implementation for {@link LogAdapter}.
  11 + * Prints output to LogCat with pretty borders.
  12 + *
  13 + * <pre>
  14 + * ┌──────────────────────────
  15 + * │ Method stack history
  16 + * ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
  17 + * │ Log message
  18 + * └──────────────────────────
  19 + * </pre>
  20 + */
  21 +public class AndroidLogAdapter implements LogAdapter {
  22 +
  23 + @NonNull
  24 + private final FormatStrategy formatStrategy;
  25 +
  26 + public AndroidLogAdapter() {
  27 + this.formatStrategy = PrettyFormatStrategy.newBuilder().build();
  28 + }
  29 +
  30 + public AndroidLogAdapter(@NonNull FormatStrategy formatStrategy) {
  31 + this.formatStrategy = checkNotNull(formatStrategy);
  32 + }
  33 +
  34 + @Override
  35 + public boolean isLoggable(int priority, @Nullable String tag) {
  36 + return true;
  37 + }
  38 +
  39 + @Override
  40 + public void log(int priority, @Nullable String tag, @NonNull String message) {
  41 + formatStrategy.log(priority, tag, message);
  42 + }
  43 +
  44 +}
  1 +
  2 +package com.wd.base.log;
  3 +
  4 +import static com.wd.base.log.Utils.checkNotNull;
  5 +
  6 +import java.io.File;
  7 +import java.text.SimpleDateFormat;
  8 +import java.util.Date;
  9 +import java.util.Locale;
  10 +
  11 +import android.os.Environment;
  12 +import android.os.Handler;
  13 +import android.os.HandlerThread;
  14 +
  15 +import androidx.annotation.NonNull;
  16 +import androidx.annotation.Nullable;
  17 +
  18 +/**
  19 + * CSV formatted file logging for Android.
  20 + * Writes to CSV the following data:
  21 + * epoch timestamp, ISO8601 timestamp (human-readable), log level, tag, log message.
  22 + */
  23 +public class CsvFormatStrategy implements FormatStrategy {
  24 +
  25 + private static final String NEW_LINE = System.getProperty("line.separator");
  26 +
  27 + private static final String NEW_LINE_REPLACEMENT = " <br> ";
  28 +
  29 + private static final String SEPARATOR = ",";
  30 +
  31 + @NonNull
  32 + private final Date date;
  33 +
  34 + @NonNull
  35 + private final SimpleDateFormat dateFormat;
  36 +
  37 + @NonNull
  38 + private final LogStrategy logStrategy;
  39 +
  40 + @Nullable
  41 + private final String tag;
  42 +
  43 + private CsvFormatStrategy(@NonNull CsvFormatStrategy.Builder builder) {
  44 + checkNotNull(builder);
  45 +
  46 + date = builder.date;
  47 + dateFormat = builder.dateFormat;
  48 + logStrategy = builder.logStrategy;
  49 + tag = builder.tag;
  50 + }
  51 +
  52 + @NonNull
  53 + public static CsvFormatStrategy.Builder newBuilder() {
  54 + return new CsvFormatStrategy.Builder();
  55 + }
  56 +
  57 + @Override
  58 + public void log(int priority, @Nullable String onceOnlyTag, @NonNull String message) {
  59 + checkNotNull(message);
  60 +
  61 + String tag = formatTag(onceOnlyTag);
  62 +
  63 + date.setTime(System.currentTimeMillis());
  64 +
  65 + StringBuilder builder = new StringBuilder();
  66 +
  67 + // machine-readable date/time
  68 + builder.append(Long.toString(date.getTime()));
  69 +
  70 + // human-readable date/time
  71 + builder.append(SEPARATOR);
  72 + builder.append(dateFormat.format(date));
  73 +
  74 + // level
  75 + builder.append(SEPARATOR);
  76 + builder.append(Utils.logLevel(priority));
  77 +
  78 + // tag
  79 + builder.append(SEPARATOR);
  80 + builder.append(tag);
  81 +
  82 + // message
  83 + if (message.contains(NEW_LINE)) {
  84 + // a new line would break the CSV format, so we replace it here
  85 + message = message.replaceAll(NEW_LINE, NEW_LINE_REPLACEMENT);
  86 + }
  87 + builder.append(SEPARATOR);
  88 + builder.append(message);
  89 +
  90 + // new line
  91 + builder.append(NEW_LINE);
  92 +
  93 + logStrategy.log(priority, tag, builder.toString());
  94 + }
  95 +
  96 + @Nullable
  97 + private String formatTag(@Nullable String tag) {
  98 + if (!Utils.isEmpty(tag) && !Utils.equals(this.tag, tag)) {
  99 + return this.tag + "-" + tag;
  100 + }
  101 + return this.tag;
  102 + }
  103 +
  104 + public static final class Builder {
  105 + private static final int MAX_BYTES = 500 * 1024; // 500K averages to a 4000 lines per file
  106 +
  107 + Date date;
  108 +
  109 + SimpleDateFormat dateFormat;
  110 +
  111 + LogStrategy logStrategy;
  112 +
  113 + String tag = "PRETTY_LOGGER";
  114 +
  115 + private Builder() {
  116 + }
  117 +
  118 + @NonNull
  119 + public CsvFormatStrategy.Builder date(@Nullable Date val) {
  120 + date = val;
  121 + return this;
  122 + }
  123 +
  124 + @NonNull
  125 + public CsvFormatStrategy.Builder dateFormat(@Nullable SimpleDateFormat val) {
  126 + dateFormat = val;
  127 + return this;
  128 + }
  129 +
  130 + @NonNull
  131 + public CsvFormatStrategy.Builder logStrategy(@Nullable LogStrategy val) {
  132 + logStrategy = val;
  133 + return this;
  134 + }
  135 +
  136 + @NonNull
  137 + public CsvFormatStrategy.Builder tag(@Nullable String tag) {
  138 + this.tag = tag;
  139 + return this;
  140 + }
  141 +
  142 + @NonNull
  143 + public CsvFormatStrategy build() {
  144 + if (date == null) {
  145 + date = new Date();
  146 + }
  147 + if (dateFormat == null) {
  148 + dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss.SSS", Locale.UK);
  149 + }
  150 + if (logStrategy == null) {
  151 + String diskPath = Environment.getExternalStorageDirectory().getAbsolutePath();
  152 + String folder = diskPath + File.separatorChar + "logger";
  153 +
  154 + HandlerThread ht = new HandlerThread("AndroidFileLogger." + folder);
  155 + ht.start();
  156 + Handler handler = new DiskLogStrategy.WriteHandler(ht.getLooper(), folder, MAX_BYTES);
  157 + logStrategy = new DiskLogStrategy(handler);
  158 + }
  159 + return new CsvFormatStrategy(this);
  160 + }
  161 + }
  162 +}
  1 +package com.wd.base.log;
  2 +
  3 +
  4 +import static com.wd.base.log.Utils.checkNotNull;
  5 +
  6 +import androidx.annotation.NonNull;
  7 +import androidx.annotation.Nullable;
  8 +
  9 +
  10 +/**
  11 + * This is used to saves log messages to the disk.
  12 + * By default it uses {@link CsvFormatStrategy} to translates text message into CSV format.
  13 + */
  14 +public class DiskLogAdapter implements LogAdapter {
  15 +
  16 + @NonNull private final FormatStrategy formatStrategy;
  17 +
  18 + public DiskLogAdapter() {
  19 + formatStrategy = CsvFormatStrategy.newBuilder().build();
  20 + }
  21 +
  22 + public DiskLogAdapter(@NonNull FormatStrategy formatStrategy) {
  23 + this.formatStrategy = checkNotNull(formatStrategy);
  24 + }
  25 +
  26 + @Override public boolean isLoggable(int priority, @Nullable String tag) {
  27 + return true;
  28 + }
  29 +
  30 + @Override public void log(int priority, @Nullable String tag, @NonNull String message) {
  31 + formatStrategy.log(priority, tag, message);
  32 + }
  33 +}
  34 +
  1 +
  2 +package com.wd.base.log;
  3 +
  4 +import static com.wd.base.log.Utils.checkNotNull;
  5 +
  6 +import java.io.File;
  7 +import java.io.FileWriter;
  8 +import java.io.IOException;
  9 +
  10 +import android.os.Handler;
  11 +import android.os.Looper;
  12 +import android.os.Message;
  13 +
  14 +import androidx.annotation.NonNull;
  15 +import androidx.annotation.Nullable;
  16 +
  17 +/**
  18 + * Abstract class that takes care of background threading the file log operation on Android.
  19 + * implementing classes are free to directly perform I/O operations there.
  20 + * Writes all logs to the disk with CSV format.
  21 + */
  22 +public class DiskLogStrategy implements LogStrategy {
  23 +
  24 + @NonNull
  25 + private final Handler handler;
  26 +
  27 + public DiskLogStrategy(@NonNull Handler handler) {
  28 + this.handler = checkNotNull(handler);
  29 + }
  30 +
  31 + @Override
  32 + public void log(int level, @Nullable String tag, @NonNull String message) {
  33 + checkNotNull(message);
  34 +
  35 + // do nothing on the calling thread, simply pass the tag/msg to the background thread
  36 + handler.sendMessage(handler.obtainMessage(level, message));
  37 + }
  38 +
  39 + static class WriteHandler extends Handler {
  40 +
  41 + @NonNull
  42 + private final String folder;
  43 +
  44 + private final int maxFileSize;
  45 +
  46 + WriteHandler(@NonNull Looper looper, @NonNull String folder, int maxFileSize) {
  47 + super(checkNotNull(looper));
  48 + this.folder = checkNotNull(folder);
  49 + this.maxFileSize = maxFileSize;
  50 + }
  51 +
  52 + @SuppressWarnings("checkstyle:emptyblock")
  53 + @Override
  54 + public void handleMessage(@NonNull Message msg) {
  55 + String content = (String) msg.obj;
  56 +
  57 + FileWriter fileWriter = null;
  58 + File logFile = getLogFile(folder, "logs");
  59 +
  60 + try {
  61 + fileWriter = new FileWriter(logFile, true);
  62 +
  63 + writeLog(fileWriter, content);
  64 +
  65 + fileWriter.flush();
  66 + fileWriter.close();
  67 + } catch (IOException e) {
  68 + if (fileWriter != null) {
  69 + try {
  70 + fileWriter.flush();
  71 + fileWriter.close();
  72 + } catch (IOException e1) {
  73 + /* fail silently */ }
  74 + }
  75 + }
  76 + }
  77 +
  78 + /**
  79 + * This is always called on a single background thread.
  80 + * Implementing classes must ONLY write to the fileWriter and nothing more.
  81 + * The abstract class takes care of everything else including close the stream and catching IOException
  82 + *
  83 + * @param fileWriter an instance of FileWriter already initialised to the correct file
  84 + */
  85 + private void writeLog(@NonNull FileWriter fileWriter, @NonNull String content) throws IOException {
  86 + checkNotNull(fileWriter);
  87 + checkNotNull(content);
  88 +
  89 + fileWriter.append(content);
  90 + }
  91 +
  92 + private File getLogFile(@NonNull String folderName, @NonNull String fileName) {
  93 + checkNotNull(folderName);
  94 + checkNotNull(fileName);
  95 +
  96 + File folder = new File(folderName);
  97 + if (!folder.exists()) {
  98 + // TODO: What if folder is not created, what happens then?
  99 + folder.mkdirs();
  100 + }
  101 +
  102 + int newFileCount = 0;
  103 + File newFile;
  104 + File existingFile = null;
  105 +
  106 + newFile = new File(folder, String.format("%s_%s.csv", fileName, newFileCount));
  107 + while (newFile.exists()) {
  108 + existingFile = newFile;
  109 + newFileCount++;
  110 + newFile = new File(folder, String.format("%s_%s.csv", fileName, newFileCount));
  111 + }
  112 +
  113 + if (existingFile != null) {
  114 + if (existingFile.length() >= maxFileSize) {
  115 + return newFile;
  116 + }
  117 + return existingFile;
  118 + }
  119 +
  120 + return newFile;
  121 + }
  122 + }
  123 +}
  1 +
  2 +package com.wd.base.log;
  3 +
  4 +import androidx.annotation.NonNull;
  5 +import androidx.annotation.Nullable;
  6 +
  7 +/**
  8 + * Used to determine how messages should be printed or saved.
  9 + */
  10 +public interface FormatStrategy {
  11 +
  12 + void log(int priority, @Nullable String tag, @NonNull String message);
  13 +}
  1 +
  2 +package com.wd.base.log;
  3 +
  4 +import androidx.annotation.NonNull;
  5 +import androidx.annotation.Nullable;
  6 +
  7 +/**
  8 + * Provides a common interface to emits logs through. This is a required contract for Logger.
  9 + *
  10 + * @see AndroidLogAdapter
  11 + * @see DiskLogAdapter
  12 + */
  13 +public interface LogAdapter {
  14 +
  15 + /**
  16 + * Used to determine whether log should be printed out or not.
  17 + *
  18 + * @param priority is the log level e.g. DEBUG, WARNING
  19 + * @param tag is the given tag for the log message
  20 + * @return is used to determine if log should printed.
  21 + * If it is true, it will be printed, otherwise it'll be ignored.
  22 + */
  23 + boolean isLoggable(int priority, @Nullable String tag);
  24 +
  25 + /**
  26 + * Each log will use this pipeline
  27 + *
  28 + * @param priority is the log level e.g. DEBUG, WARNING
  29 + * @param tag is the given tag for the log message.
  30 + * @param message is the given message for the log message.
  31 + */
  32 + void log(int priority, @Nullable String tag, @NonNull String message);
  33 +}
  1 +
  2 +package com.wd.base.log;
  3 +
  4 +import androidx.annotation.NonNull;
  5 +import androidx.annotation.Nullable;
  6 +
  7 +/**
  8 + * Determines destination target for the logs such as Disk, Logcat etc.
  9 + *
  10 + * @see LogcatLogStrategy
  11 + * @see DiskLogStrategy
  12 + */
  13 +public interface LogStrategy {
  14 +
  15 + /**
  16 + * This is invoked by Logger each time a log message is processed.
  17 + * Interpret this method as last destination of the log in whole pipeline.
  18 + *
  19 + * @param priority is the log level e.g. DEBUG, WARNING
  20 + * @param tag is the given tag for the log message.
  21 + * @param message is the given message for the log message.
  22 + */
  23 + void log(int priority, @Nullable String tag, @NonNull String message);
  24 +}
  1 +
  2 +package com.wd.base.log;
  3 +
  4 +import static com.wd.base.log.Utils.checkNotNull;
  5 +
  6 +import android.util.Log;
  7 +
  8 +import androidx.annotation.NonNull;
  9 +import androidx.annotation.Nullable;
  10 +
  11 +/**
  12 + * LogCat implementation for {@link LogStrategy}
  13 + * This simply prints out all logs to Logcat by using standard {@link Log} class.
  14 + */
  15 +public class LogcatLogStrategy implements LogStrategy {
  16 +
  17 + static final String DEFAULT_TAG = "NO_TAG";
  18 +
  19 + @Override
  20 + public void log(int priority, @Nullable String tag, @NonNull String message) {
  21 + checkNotNull(message);
  22 +
  23 + if (tag == null) {
  24 + tag = DEFAULT_TAG;
  25 + }
  26 +
  27 + Log.println(priority, tag, message);
  28 + }
  29 +}
  1 +
  2 +package com.wd.base.log;
  3 +
  4 +import static com.wd.base.log.Utils.checkNotNull;
  5 +
  6 +import androidx.annotation.NonNull;
  7 +import androidx.annotation.Nullable;
  8 +
  9 +/**
  10 + * Logger, but more pretty, simple and powerful
  11 + */
  12 +public final class Logger {
  13 +
  14 + public static final int VERBOSE = 2;
  15 +
  16 + public static final int DEBUG = 3;
  17 +
  18 + public static final int INFO = 4;
  19 +
  20 + public static final int WARN = 5;
  21 +
  22 + public static final int ERROR = 6;
  23 +
  24 + public static final int ASSERT = 7;
  25 +
  26 + @NonNull
  27 + private static Printer printer = new LoggerPrinter();
  28 +
  29 + private Logger() {
  30 + // no instance
  31 + }
  32 +
  33 + public static void printer(@NonNull Printer printer) {
  34 + Logger.printer = checkNotNull(printer);
  35 + }
  36 +
  37 + public static void addLogAdapter(@NonNull LogAdapter adapter) {
  38 + printer.addAdapter(checkNotNull(adapter));
  39 + }
  40 +
  41 + public static void clearLogAdapters() {
  42 + printer.clearLogAdapters();
  43 + }
  44 +
  45 + /**
  46 + * Given tag will be used as tag only once for this method call regardless of the tag that's been
  47 + * set during initialization. After this invocation, the general tag that's been set will
  48 + * be used for the subsequent log calls
  49 + */
  50 + public static Printer t(@Nullable String tag) {
  51 + return printer.t(tag);
  52 + }
  53 +
  54 + /**
  55 + * General log function that accepts all configurations as parameter
  56 + */
  57 + public static void log(int priority, @Nullable String tag, @Nullable String message,
  58 + @Nullable Throwable throwable) {
  59 + printer.log(priority, tag, message, throwable);
  60 + }
  61 +
  62 + public static void d(@NonNull String message, @Nullable Object... args) {
  63 + printer.d(message, args);
  64 + }
  65 +
  66 + public static void d(@Nullable Object object) {
  67 + printer.d(object);
  68 + }
  69 +
  70 + public static void e(@NonNull String message, @Nullable Object... args) {
  71 + printer.e(null, message, args);
  72 + }
  73 +
  74 + public static void e(@Nullable Throwable throwable, @NonNull String message, @Nullable Object... args) {
  75 + printer.e(throwable, message, args);
  76 + }
  77 +
  78 + public static void i(@NonNull String message, @Nullable Object... args) {
  79 + printer.i(message, args);
  80 + }
  81 +
  82 + public static void v(@NonNull String message, @Nullable Object... args) {
  83 + printer.v(message, args);
  84 + }
  85 +
  86 + public static void w(@NonNull String message, @Nullable Object... args) {
  87 + printer.w(message, args);
  88 + }
  89 +
  90 + /**
  91 + * Tip: Use this for exceptional situations to log
  92 + * ie: Unexpected errors etc
  93 + */
  94 + public static void wtf(@NonNull String message, @Nullable Object... args) {
  95 + printer.wtf(message, args);
  96 + }
  97 +
  98 + /**
  99 + * Formats the given json content and print it
  100 + */
  101 + public static void json(@Nullable String json) {
  102 + printer.json(json);
  103 + }
  104 +
  105 + /**
  106 + * Formats the given xml content and print it
  107 + */
  108 + public static void xml(@Nullable String xml) {
  109 + printer.xml(xml);
  110 + }
  111 +
  112 +}
  1 +
  2 +package com.wd.base.log;
  3 +
  4 +/**
  5 + * @author yangchenggong
  6 + * @date 2022/7/4 15:18
  7 + */
  8 +public class LoggerDefaultInit {
  9 + private static volatile LoggerDefaultInit s = null;
  10 +
  11 + private LoggerDefaultInit() {
  12 + System.out.println("构造方法");
  13 + }
  14 +
  15 + public static LoggerDefaultInit getInstance() {
  16 + if (s == null) {
  17 + // 这里可能被其他线程插入,并抢先实例化Singleton
  18 + synchronized (LoggerDefaultInit.class) {
  19 + if (s == null) {
  20 + try {
  21 + // 将问题极端化
  22 + Thread.sleep(50);
  23 + } catch (InterruptedException e) {
  24 + }
  25 + s = new LoggerDefaultInit();
  26 + }
  27 + }
  28 + }
  29 + return s;
  30 + }
  31 +
  32 + /**
  33 + * 是否显示 Log
  34 + *
  35 + * @param isShow 编译debug展示
  36 + */
  37 + public void init(boolean isShow) {
  38 + FormatStrategy formatStrategy =
  39 + PrettyFormatStrategy.newBuilder().showThreadInfo(false).methodCount(1).tag("RMLog").build();
  40 +
  41 + Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy) {
  42 + @Override
  43 + public boolean isLoggable(int priority, String tag) {
  44 + return isShow;
  45 + }
  46 + });
  47 + }
  48 +}
  1 +
  2 +package com.wd.base.log;
  3 +
  4 +import static com.wd.base.log.Logger.ASSERT;
  5 +import static com.wd.base.log.Logger.DEBUG;
  6 +import static com.wd.base.log.Logger.ERROR;
  7 +import static com.wd.base.log.Logger.INFO;
  8 +import static com.wd.base.log.Logger.VERBOSE;
  9 +import static com.wd.base.log.Logger.WARN;
  10 +import static com.wd.base.log.Utils.checkNotNull;
  11 +
  12 +import java.io.StringReader;
  13 +import java.io.StringWriter;
  14 +import java.util.ArrayList;
  15 +import java.util.List;
  16 +
  17 +import javax.xml.transform.OutputKeys;
  18 +import javax.xml.transform.Source;
  19 +import javax.xml.transform.Transformer;
  20 +import javax.xml.transform.TransformerException;
  21 +import javax.xml.transform.TransformerFactory;
  22 +import javax.xml.transform.stream.StreamResult;
  23 +import javax.xml.transform.stream.StreamSource;
  24 +
  25 +import org.json.JSONArray;
  26 +import org.json.JSONException;
  27 +import org.json.JSONObject;
  28 +
  29 +import androidx.annotation.NonNull;
  30 +import androidx.annotation.Nullable;
  31 +
  32 +class LoggerPrinter implements Printer {
  33 +
  34 + /**
  35 + * It is used for json pretty print
  36 + */
  37 + private static final int JSON_INDENT = 2;
  38 +
  39 + /**
  40 + * Provides one-time used tag for the log message
  41 + */
  42 + private final ThreadLocal<String> localTag = new ThreadLocal<>();
  43 +
  44 + private final List<LogAdapter> logAdapters = new ArrayList<>();
  45 +
  46 + @Override
  47 + public Printer t(String tag) {
  48 + if (tag != null) {
  49 + localTag.set(tag);
  50 + }
  51 + return this;
  52 + }
  53 +
  54 + @Override
  55 + public void d(@NonNull String message, @Nullable Object... args) {
  56 + log(DEBUG, null, message, args);
  57 + }
  58 +
  59 + @Override
  60 + public void d(@Nullable Object object) {
  61 + log(DEBUG, null, Utils.toString(object));
  62 + }
  63 +
  64 + @Override
  65 + public void e(@NonNull String message, @Nullable Object... args) {
  66 + e(null, message, args);
  67 + }
  68 +
  69 + @Override
  70 + public void e(@Nullable Throwable throwable, @NonNull String message, @Nullable Object... args) {
  71 + log(ERROR, throwable, message, args);
  72 + }
  73 +
  74 + @Override
  75 + public void w(@NonNull String message, @Nullable Object... args) {
  76 + log(WARN, null, message, args);
  77 + }
  78 +
  79 + @Override
  80 + public void i(@NonNull String message, @Nullable Object... args) {
  81 + log(INFO, null, message, args);
  82 + }
  83 +
  84 + @Override
  85 + public void v(@NonNull String message, @Nullable Object... args) {
  86 + log(VERBOSE, null, message, args);
  87 + }
  88 +
  89 + @Override
  90 + public void wtf(@NonNull String message, @Nullable Object... args) {
  91 + log(ASSERT, null, message, args);
  92 + }
  93 +
  94 + @Override
  95 + public void json(@Nullable String json) {
  96 + if (Utils.isEmpty(json)) {
  97 + d("Empty/Null json content");
  98 + return;
  99 + }
  100 + try {
  101 + json = json.trim();
  102 + if (json.startsWith("{")) {
  103 + JSONObject jsonObject = new JSONObject(json);
  104 + String message = jsonObject.toString(JSON_INDENT);
  105 + d(message);
  106 + return;
  107 + }
  108 + if (json.startsWith("[")) {
  109 + JSONArray jsonArray = new JSONArray(json);
  110 + String message = jsonArray.toString(JSON_INDENT);
  111 + d(message);
  112 + return;
  113 + }
  114 + e("Invalid Json");
  115 + } catch (JSONException e) {
  116 + e("Invalid Json");
  117 + }
  118 + }
  119 +
  120 + @Override
  121 + public void xml(@Nullable String xml) {
  122 + if (Utils.isEmpty(xml)) {
  123 + d("Empty/Null xml content");
  124 + return;
  125 + }
  126 + try {
  127 + Source xmlInput = new StreamSource(new StringReader(xml));
  128 + StreamResult xmlOutput = new StreamResult(new StringWriter());
  129 + Transformer transformer = TransformerFactory.newInstance().newTransformer();
  130 + transformer.setOutputProperty(OutputKeys.INDENT, "yes");
  131 + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
  132 + transformer.transform(xmlInput, xmlOutput);
  133 + d(xmlOutput.getWriter().toString().replaceFirst(">", ">\n"));
  134 + } catch (TransformerException e) {
  135 + e("Invalid xml");
  136 + }
  137 + }
  138 +
  139 + @Override
  140 + public synchronized void log(int priority, @Nullable String tag, @Nullable String message,
  141 + @Nullable Throwable throwable) {
  142 + if (throwable != null && message != null) {
  143 + message += " : " + Utils.getStackTraceString(throwable);
  144 + }
  145 + if (throwable != null && message == null) {
  146 + message = Utils.getStackTraceString(throwable);
  147 + }
  148 + if (Utils.isEmpty(message)) {
  149 + message = "Empty/NULL log message";
  150 + }
  151 +
  152 + for (LogAdapter adapter : logAdapters) {
  153 + if (adapter.isLoggable(priority, tag)) {
  154 + adapter.log(priority, tag, message);
  155 + }
  156 + }
  157 + }
  158 +
  159 + @Override
  160 + public void clearLogAdapters() {
  161 + logAdapters.clear();
  162 + }
  163 +
  164 + @Override
  165 + public void addAdapter(@NonNull LogAdapter adapter) {
  166 + logAdapters.add(checkNotNull(adapter));
  167 + }
  168 +
  169 + /**
  170 + * This method is synchronized in order to avoid messy of logs' order.
  171 + */
  172 + private synchronized void log(int priority, @Nullable Throwable throwable, @NonNull String msg,
  173 + @Nullable Object... args) {
  174 + checkNotNull(msg);
  175 +
  176 + String tag = getTag();
  177 + String message = createMessage(msg, args);
  178 + log(priority, tag, message, throwable);
  179 + }
  180 +
  181 + /**
  182 + * @return the appropriate tag based on local or global
  183 + */
  184 + @Nullable
  185 + private String getTag() {
  186 + String tag = localTag.get();
  187 + if (tag != null) {
  188 + localTag.remove();
  189 + return tag;
  190 + }
  191 + return null;
  192 + }
  193 +
  194 + @NonNull
  195 + private String createMessage(@NonNull String message, @Nullable Object... args) {
  196 + return args == null || args.length == 0 ? message : String.format(message, args);
  197 + }
  198 +}
  1 +
  2 +package com.wd.base.log;
  3 +
  4 +import static com.wd.base.log.Utils.checkNotNull;
  5 +
  6 +import androidx.annotation.NonNull;
  7 +import androidx.annotation.Nullable;
  8 +
  9 +/**
  10 + * Draws borders around the given log message along with additional information such as :
  11 + * <ul>
  12 + * <li>Thread information</li>
  13 + * <li>Method stack trace</li>
  14 + * </ul>
  15 + *
  16 + * <pre>
  17 + * ┌──────────────────────────
  18 + * │ Method stack history
  19 + * ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
  20 + * │ Thread information
  21 + * ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
  22 + * │ Log message
  23 + * └──────────────────────────
  24 + * </pre>
  25 + */
  26 +public class PrettyFormatStrategy implements FormatStrategy {
  27 +
  28 + /**
  29 + * Android's max limit for a log entry is ~4076 bytes,
  30 + * so 4000 bytes is used as chunk size since default charset
  31 + * is UTF-8
  32 + */
  33 + private static final int CHUNK_SIZE = 4000;
  34 +
  35 + /**
  36 + * The minimum stack trace index, starts at this class after two native calls.
  37 + */
  38 + private static final int MIN_STACK_OFFSET = 5;
  39 +
  40 + /**
  41 + * Drawing toolbox
  42 + */
  43 + private static final char TOP_LEFT_CORNER = '┌';
  44 +
  45 + private static final char BOTTOM_LEFT_CORNER = '└';
  46 +
  47 + private static final char MIDDLE_CORNER = '├';
  48 +
  49 + private static final char HORIZONTAL_LINE = '│';
  50 +
  51 + private static final String DOUBLE_DIVIDER = "────────────────────────────────────────────────────────";
  52 +
  53 + private static final String SINGLE_DIVIDER = "┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄";
  54 +
  55 + private static final String TOP_BORDER = TOP_LEFT_CORNER + DOUBLE_DIVIDER + DOUBLE_DIVIDER;
  56 +
  57 + private static final String BOTTOM_BORDER = BOTTOM_LEFT_CORNER + DOUBLE_DIVIDER + DOUBLE_DIVIDER;
  58 +
  59 + private static final String MIDDLE_BORDER = MIDDLE_CORNER + SINGLE_DIVIDER + SINGLE_DIVIDER;
  60 +
  61 + private final int methodCount;
  62 +
  63 + private final int methodOffset;
  64 +
  65 + private final boolean showThreadInfo;
  66 +
  67 + @NonNull
  68 + private final LogStrategy logStrategy;
  69 +
  70 + @Nullable
  71 + private final String tag;
  72 +
  73 + private PrettyFormatStrategy(@NonNull PrettyFormatStrategy.Builder builder) {
  74 + checkNotNull(builder);
  75 +
  76 + methodCount = builder.methodCount;
  77 + methodOffset = builder.methodOffset;
  78 + showThreadInfo = builder.showThreadInfo;
  79 + logStrategy = builder.logStrategy;
  80 + tag = builder.tag;
  81 + }
  82 +
  83 + @NonNull
  84 + public static PrettyFormatStrategy.Builder newBuilder() {
  85 + return new PrettyFormatStrategy.Builder();
  86 + }
  87 +
  88 + @Override
  89 + public void log(int priority, @Nullable String onceOnlyTag, @NonNull String message) {
  90 + checkNotNull(message);
  91 +
  92 + String tag = formatTag(onceOnlyTag);
  93 +
  94 + logTopBorder(priority, tag);
  95 + logHeaderContent(priority, tag, methodCount);
  96 +
  97 + // get bytes of message with system's default charset (which is UTF-8 for Android)
  98 + byte[] bytes = message.getBytes();
  99 + int length = bytes.length;
  100 + if (length <= CHUNK_SIZE) {
  101 + if (methodCount > 0) {
  102 + logDivider(priority, tag);
  103 + }
  104 + logContent(priority, tag, message);
  105 + logBottomBorder(priority, tag);
  106 + return;
  107 + }
  108 + if (methodCount > 0) {
  109 + logDivider(priority, tag);
  110 + }
  111 + for (int i = 0; i < length; i += CHUNK_SIZE) {
  112 + int count = Math.min(length - i, CHUNK_SIZE);
  113 + // create a new String with system's default charset (which is UTF-8 for Android)
  114 + logContent(priority, tag, new String(bytes, i, count));
  115 + }
  116 + logBottomBorder(priority, tag);
  117 + }
  118 +
  119 + private void logTopBorder(int logType, @Nullable String tag) {
  120 + logChunk(logType, tag, TOP_BORDER);
  121 + }
  122 +
  123 + @SuppressWarnings("StringBufferReplaceableByString")
  124 + private void logHeaderContent(int logType, @Nullable String tag, int methodCount) {
  125 + StackTraceElement[] trace = Thread.currentThread().getStackTrace();
  126 + if (showThreadInfo) {
  127 + logChunk(logType, tag, HORIZONTAL_LINE + " Thread: " + Thread.currentThread().getName());
  128 + logDivider(logType, tag);
  129 + }
  130 + String level = "";
  131 +
  132 + int stackOffset = getStackOffset(trace) + methodOffset;
  133 +
  134 + // corresponding method count with the current stack may exceeds the stack trace. Trims the count
  135 + if (methodCount + stackOffset > trace.length) {
  136 + methodCount = trace.length - stackOffset - 1;
  137 + }
  138 +
  139 + for (int i = methodCount; i > 0; i--) {
  140 + int stackIndex = i + stackOffset;
  141 + if (stackIndex >= trace.length) {
  142 + continue;
  143 + }
  144 + StringBuilder builder = new StringBuilder();
  145 + builder.append(HORIZONTAL_LINE)
  146 + .append(' ')
  147 + .append(level)
  148 + .append(getSimpleClassName(trace[stackIndex].getClassName()))
  149 + .append(".")
  150 + .append(trace[stackIndex].getMethodName())
  151 + .append(" ")
  152 + .append(" (")
  153 + .append(trace[stackIndex].getFileName())
  154 + .append(":")
  155 + .append(trace[stackIndex].getLineNumber())
  156 + .append(")");
  157 + level += " ";
  158 + logChunk(logType, tag, builder.toString());
  159 + }
  160 + }
  161 +
  162 + private void logBottomBorder(int logType, @Nullable String tag) {
  163 + logChunk(logType, tag, BOTTOM_BORDER);
  164 + }
  165 +
  166 + private void logDivider(int logType, @Nullable String tag) {
  167 + logChunk(logType, tag, MIDDLE_BORDER);
  168 + }
  169 +
  170 + private void logContent(int logType, @Nullable String tag, @NonNull String chunk) {
  171 + checkNotNull(chunk);
  172 +
  173 + String[] lines = chunk.split(System.getProperty("line.separator"));
  174 + for (String line : lines) {
  175 + logChunk(logType, tag, HORIZONTAL_LINE + " " + line);
  176 + }
  177 + }
  178 +
  179 + private void logChunk(int priority, @Nullable String tag, @NonNull String chunk) {
  180 + checkNotNull(chunk);
  181 +
  182 + logStrategy.log(priority, tag, chunk);
  183 + }
  184 +
  185 + private String getSimpleClassName(@NonNull String name) {
  186 + checkNotNull(name);
  187 +
  188 + int lastIndex = name.lastIndexOf(".");
  189 + return name.substring(lastIndex + 1);
  190 + }
  191 +
  192 + /**
  193 + * Determines the starting index of the stack trace, after method calls made by this class.
  194 + *
  195 + * @param trace the stack trace
  196 + * @return the stack offset
  197 + */
  198 + private int getStackOffset(@NonNull StackTraceElement[] trace) {
  199 + checkNotNull(trace);
  200 +
  201 + for (int i = MIN_STACK_OFFSET; i < trace.length; i++) {
  202 + StackTraceElement e = trace[i];
  203 + String name = e.getClassName();
  204 + if (!name.equals(LoggerPrinter.class.getName()) && !name.equals(Logger.class.getName())) {
  205 + return --i;
  206 + }
  207 + }
  208 + return -1;
  209 + }
  210 +
  211 + @Nullable
  212 + private String formatTag(@Nullable String tag) {
  213 + if (!Utils.isEmpty(tag) && !Utils.equals(this.tag, tag)) {
  214 + return this.tag + "-" + tag;
  215 + }
  216 + return this.tag;
  217 + }
  218 +
  219 + public static class Builder {
  220 + int methodCount = 2;
  221 +
  222 + int methodOffset = 0;
  223 +
  224 + boolean showThreadInfo = true;
  225 +
  226 + @Nullable
  227 + LogStrategy logStrategy;
  228 +
  229 + @Nullable
  230 + String tag = "PRETTY_LOGGER";
  231 +
  232 + private Builder() {
  233 + }
  234 +
  235 + @NonNull
  236 + public PrettyFormatStrategy.Builder methodCount(int val) {
  237 + methodCount = val;
  238 + return this;
  239 + }
  240 +
  241 + @NonNull
  242 + public PrettyFormatStrategy.Builder methodOffset(int val) {
  243 + methodOffset = val;
  244 + return this;
  245 + }
  246 +
  247 + @NonNull
  248 + public PrettyFormatStrategy.Builder showThreadInfo(boolean val) {
  249 + showThreadInfo = val;
  250 + return this;
  251 + }
  252 +
  253 + @NonNull
  254 + public PrettyFormatStrategy.Builder logStrategy(@Nullable LogStrategy val) {
  255 + logStrategy = val;
  256 + return this;
  257 + }
  258 +
  259 + @NonNull
  260 + public PrettyFormatStrategy.Builder tag(@Nullable String tag) {
  261 + this.tag = tag;
  262 + return this;
  263 + }
  264 +
  265 + @NonNull
  266 + public PrettyFormatStrategy build() {
  267 + if (logStrategy == null) {
  268 + logStrategy = new LogcatLogStrategy();
  269 + }
  270 + return new PrettyFormatStrategy(this);
  271 + }
  272 + }
  273 +
  274 +}
  1 +
  2 +package com.wd.base.log;
  3 +
  4 +import androidx.annotation.NonNull;
  5 +import androidx.annotation.Nullable;
  6 +
  7 +/**
  8 + * A proxy interface to enable additional operations.
  9 + * Contains all possible Log message usages.
  10 + */
  11 +public interface Printer {
  12 +
  13 + void addAdapter(@NonNull LogAdapter adapter);
  14 +
  15 + Printer t(@Nullable String tag);
  16 +
  17 + void d(@NonNull String message, @Nullable Object... args);
  18 +
  19 + void d(@Nullable Object object);
  20 +
  21 + void e(@NonNull String message, @Nullable Object... args);
  22 +
  23 + void e(@Nullable Throwable throwable, @NonNull String message, @Nullable Object... args);
  24 +
  25 + void w(@NonNull String message, @Nullable Object... args);
  26 +
  27 + void i(@NonNull String message, @Nullable Object... args);
  28 +
  29 + void v(@NonNull String message, @Nullable Object... args);
  30 +
  31 + void wtf(@NonNull String message, @Nullable Object... args);
  32 +
  33 + /**
  34 + * Formats the given json content and print it
  35 + */
  36 + void json(@Nullable String json);
  37 +
  38 + /**
  39 + * Formats the given xml content and print it
  40 + */
  41 + void xml(@Nullable String xml);
  42 +
  43 + void log(int priority, @Nullable String tag, @Nullable String message, @Nullable Throwable throwable);
  44 +
  45 + void clearLogAdapters();
  46 +}
  1 +
  2 +package com.wd.base.log;
  3 +
  4 +import static com.wd.base.log.Logger.ASSERT;
  5 +import static com.wd.base.log.Logger.DEBUG;
  6 +import static com.wd.base.log.Logger.ERROR;
  7 +import static com.wd.base.log.Logger.INFO;
  8 +import static com.wd.base.log.Logger.VERBOSE;
  9 +import static com.wd.base.log.Logger.WARN;
  10 +
  11 +import java.io.PrintWriter;
  12 +import java.io.StringWriter;
  13 +import java.net.UnknownHostException;
  14 +import java.util.Arrays;
  15 +
  16 +import androidx.annotation.NonNull;
  17 +import androidx.annotation.Nullable;
  18 +
  19 +/**
  20 + * Provides convenient methods to some common operations
  21 + */
  22 +final class Utils {
  23 +
  24 + private Utils() {
  25 + // Hidden constructor.
  26 + }
  27 +
  28 + /**
  29 + * Returns true if the string is null or 0-length.
  30 + *
  31 + * @param str the string to be examined
  32 + * @return true if str is null or zero length
  33 + */
  34 + static boolean isEmpty(CharSequence str) {
  35 + return str == null || str.length() == 0;
  36 + }
  37 +
  38 + /**
  39 + * Returns true if a and b are equal, including if they are both null.
  40 + * <p>
  41 + * <i>Note: In platform versions 1.1 and earlier, this method only worked well if
  42 + * both the arguments were instances of String.</i>
  43 + * </p>
  44 + *
  45 + * @param a first CharSequence to check
  46 + * @param b second CharSequence to check
  47 + * @return true if a and b are equal
  48 + * <p>
  49 + * NOTE: Logic slightly change due to strict policy on CI -
  50 + * "Inner assignments should be avoided"
  51 + */
  52 + static boolean equals(CharSequence a, CharSequence b) {
  53 + if (a == b)
  54 + return true;
  55 + if (a != null && b != null) {
  56 + int length = a.length();
  57 + if (length == b.length()) {
  58 + if (a instanceof String && b instanceof String) {
  59 + return a.equals(b);
  60 + } else {
  61 + for (int i = 0; i < length; i++) {
  62 + if (a.charAt(i) != b.charAt(i))
  63 + return false;
  64 + }
  65 + return true;
  66 + }
  67 + }
  68 + }
  69 + return false;
  70 + }
  71 +
  72 + /**
  73 + * Copied from "android.util.Log.getStackTraceString()" in order to avoid usage of Android stack
  74 + * in unit tests.
  75 + *
  76 + * @return Stack trace in form of String
  77 + */
  78 + static String getStackTraceString(Throwable tr) {
  79 + if (tr == null) {
  80 + return "";
  81 + }
  82 +
  83 + // This is to reduce the amount of log spew that apps do in the non-error
  84 + // condition of the network being unavailable.
  85 + Throwable t = tr;
  86 + while (t != null) {
  87 + if (t instanceof UnknownHostException) {
  88 + return "";
  89 + }
  90 + t = t.getCause();
  91 + }
  92 +
  93 + StringWriter sw = new StringWriter();
  94 + PrintWriter pw = new PrintWriter(sw);
  95 + tr.printStackTrace(pw);
  96 + pw.flush();
  97 + return sw.toString();
  98 + }
  99 +
  100 + static String logLevel(int value) {
  101 + switch (value) {
  102 + case VERBOSE:
  103 + return "VERBOSE";
  104 + case DEBUG:
  105 + return "DEBUG";
  106 + case INFO:
  107 + return "INFO";
  108 + case WARN:
  109 + return "WARN";
  110 + case ERROR:
  111 + return "ERROR";
  112 + case ASSERT:
  113 + return "ASSERT";
  114 + default:
  115 + return "UNKNOWN";
  116 + }
  117 + }
  118 +
  119 + public static String toString(Object object) {
  120 + if (object == null) {
  121 + return "null";
  122 + }
  123 + if (!object.getClass().isArray()) {
  124 + return object.toString();
  125 + }
  126 + if (object instanceof boolean[]) {
  127 + return Arrays.toString((boolean[]) object);
  128 + }
  129 + if (object instanceof byte[]) {
  130 + return Arrays.toString((byte[]) object);
  131 + }
  132 + if (object instanceof char[]) {
  133 + return Arrays.toString((char[]) object);
  134 + }
  135 + if (object instanceof short[]) {
  136 + return Arrays.toString((short[]) object);
  137 + }
  138 + if (object instanceof int[]) {
  139 + return Arrays.toString((int[]) object);
  140 + }
  141 + if (object instanceof long[]) {
  142 + return Arrays.toString((long[]) object);
  143 + }
  144 + if (object instanceof float[]) {
  145 + return Arrays.toString((float[]) object);
  146 + }
  147 + if (object instanceof double[]) {
  148 + return Arrays.toString((double[]) object);
  149 + }
  150 + if (object instanceof Object[]) {
  151 + return Arrays.deepToString((Object[]) object);
  152 + }
  153 + return "Couldn't find a correct type for the object";
  154 + }
  155 +
  156 + @NonNull
  157 + static <T> T checkNotNull(@Nullable final T obj) {
  158 + if (obj == null) {
  159 + throw new NullPointerException();
  160 + }
  161 + return obj;
  162 + }
  163 +}
  1 +/*
  2 + * Copyright (c) Wondertek Technologies Co., Ltd. 2019-2020. All rights reserved.
  3 + */
  4 +
  5 +package com.wd.base.log.wheat;
  6 +
  7 +import java.io.FileNotFoundException;
  8 +import java.net.BindException;
  9 +import java.net.SocketTimeoutException;
  10 +import java.security.acl.NotOwnerException;
  11 +import java.util.ConcurrentModificationException;
  12 +import java.util.MissingResourceException;
  13 +import java.util.jar.JarException;
  14 +
  15 +import org.json.JSONException;
  16 +
  17 +import android.database.SQLException;
  18 +import android.util.Log;
  19 +
  20 +/**
  21 + * <日志工具类>
  22 + *
  23 + * @author wangnaiwen
  24 + * @version [V1.0.0.0, 2020/5/16]
  25 + * @since V1.0.0.0
  26 + */
  27 +final class Logger {
  28 + /**
  29 + * 播放模块统一日志标签
  30 + */
  31 + public static final String DEFAULT_TAG = "<WHEAT>|";
  32 +
  33 + /**
  34 + * 播放模块统一日志标签
  35 + */
  36 + public static final String PLAYER_TAG = "<PLAYER>|";
  37 +
  38 + /**
  39 + * 播放模块统一日志标签
  40 + */
  41 + public static final String NETWORK_TAG = "<NETWORK>|";
  42 +
  43 + private static int mLogLevel = Log.DEBUG;
  44 +
  45 + private Logger() {
  46 + }
  47 +
  48 + public static void setLogLevel(int level) {
  49 + mLogLevel = level;
  50 + }
  51 +
  52 + public static void d(String tag, Object message) {
  53 + if (mLogLevel <= Log.DEBUG) {
  54 + printLog(tag, message, Log.DEBUG);
  55 + }
  56 + }
  57 +
  58 + public static void i(String tag, Object message) {
  59 + if (mLogLevel <= Log.INFO) {
  60 + printLog(tag, message, Log.INFO);
  61 + }
  62 + }
  63 +
  64 + public static void w(String tag, Object message) {
  65 + if (mLogLevel <= Log.WARN) {
  66 + printLog(tag, message, Log.WARN);
  67 + }
  68 + }
  69 +
  70 + public static void e(String tag, Object message) {
  71 + if (mLogLevel <= Log.ERROR) {
  72 + printLog(tag, message, Log.ERROR);
  73 + }
  74 + }
  75 +
  76 + public static void d(String tag, Object message, Throwable throwable) {
  77 + if (mLogLevel <= Log.DEBUG) {
  78 + String newMessage = message + ":" + checkSensitiveException(throwable);
  79 + printLog(tag, newMessage, Log.DEBUG);
  80 + }
  81 + }
  82 +
  83 + public static void i(String tag, Object message, Throwable throwable) {
  84 + if (mLogLevel <= Log.INFO) {
  85 + String newMessage = message + ":" + checkSensitiveException(throwable);
  86 + printLog(tag, newMessage, Log.INFO);
  87 + }
  88 + }
  89 +
  90 + public static void w(String tag, Object message, Throwable throwable) {
  91 + if (mLogLevel <= Log.WARN) {
  92 + String newMessage = message + ":" + checkSensitiveException(throwable);
  93 + printLog(tag, newMessage, Log.WARN);
  94 + }
  95 + }
  96 +
  97 + public static void e(String tag, Object message, Throwable throwable) {
  98 + if (mLogLevel <= Log.ERROR) {
  99 + String newMessage = message + ":" + checkSensitiveException(throwable);
  100 + printLog(tag, newMessage, Log.ERROR);
  101 + }
  102 + }
  103 +
  104 + private static String checkSensitiveException(Object object) {
  105 + if (object instanceof FileNotFoundException) {
  106 + return "File is not legal ";
  107 + } else if (object instanceof ConcurrentModificationException) {
  108 + return "Illegal operation";
  109 + } else if (object instanceof SQLException) {
  110 + return "Sql exception";
  111 + } else if (object instanceof JSONException) {
  112 + return "Json convert exception";
  113 + } else if (object instanceof MissingResourceException) {
  114 + return "Resource is missing.";
  115 + } else if (object instanceof JarException) {
  116 + return "Error occurred while reading or writing a JAR file.";
  117 + } else if (object instanceof OutOfMemoryError) {
  118 + return "No more memory could be made available.";
  119 + } else if (object instanceof StackOverflowError) {
  120 + return "Stack overflow occurs because an application recurses too deeply.";
  121 + } else if (object instanceof NotOwnerException) {
  122 + return "Modification principal is not the owner of the object.";
  123 + } else if (object instanceof BindException) {
  124 + return "Exception occurred while binding a socket to a local address and port.";
  125 + } else {
  126 + return object instanceof SocketTimeoutException ? "Socket timeout exception" : null;
  127 + }
  128 + }
  129 +
  130 + private static void printLog(String tag, Object msg, int level) {
  131 + // 日志打印统一出口
  132 + String logTag = tag == null ? DEFAULT_TAG : DEFAULT_TAG + tag;
  133 + Log.println(level, logTag, String.valueOf(msg));
  134 + }
  135 +
  136 +}
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<resources>
  3 +
  4 +</resources>