├── settings.gradle ├── app ├── .gitignore ├── src │ └── main │ │ ├── res │ │ ├── values │ │ │ ├── strings.xml │ │ │ ├── colors.xml │ │ │ └── styles.xml │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ └── layout │ │ │ └── activity_main.xml │ │ ├── libs │ │ └── armeabi-v7a │ │ │ └── libdu.so │ │ ├── java │ │ ├── cn │ │ │ └── shuzilm │ │ │ │ └── core │ │ │ │ ├── Listener.java │ │ │ │ ├── c.java │ │ │ │ ├── b.java │ │ │ │ ├── d.java │ │ │ │ └── Main.java │ │ └── com │ │ │ └── github │ │ │ └── gavinme │ │ │ └── smid │ │ │ ├── MyApplication.java │ │ │ └── MainActivity.java │ │ └── AndroidManifest.xml ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── proguard-rules.pro ├── build.gradle ├── gradlew.bat └── gradlew ├── .gitignore ├── smid_get_project.apk ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── README.md ├── gradlew.bat └── gradlew /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | *.iml 3 | /.idea -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | *.iml 3 | local.properties 4 | /.idea 5 | /.gradle -------------------------------------------------------------------------------- /smid_get_project.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gavinme/smid_project/HEAD/smid_get_project.apk -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 数盟ID 3 | 4 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gavinme/smid_project/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gavinme/smid_project/HEAD/app/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/libs/armeabi-v7a/libdu.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gavinme/smid_project/HEAD/app/src/main/libs/armeabi-v7a/libdu.so -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gavinme/smid_project/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gavinme/smid_project/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gavinme/smid_project/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gavinme/smid_project/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/java/cn/shuzilm/core/Listener.java: -------------------------------------------------------------------------------- 1 | package cn.shuzilm.core; 2 | 3 | public interface Listener { 4 | void handler(String str); 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gavinme/smid_project/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gavinme/smid_project/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gavinme/smid_project/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gavinme/smid_project/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gavinme/smid_project/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gavinme/smid_project/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /app/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Aug 23 15:28:46 CST 2018 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip 7 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Aug 23 15:30:23 CST 2018 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/github/gavinme/smid/MyApplication.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2017 Baidu, Inc. All Rights Reserved. 3 | */ 4 | package com.github.gavinme.smid; 5 | 6 | import android.app.Application; 7 | import android.content.Context; 8 | import cn.shuzilm.core.Main; 9 | 10 | /**{@link Main#init(Context)} 11 | * Created by GanQuan on 2017/10/12. 12 | */ 13 | 14 | public class MyApplication extends Application { 15 | 16 | @Override 17 | public void onCreate() { 18 | super.onCreate(); 19 | Main.init(this); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/github/gavinme/smid/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.github.gavinme.smid; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.util.Log; 6 | import android.widget.TextView; 7 | import cn.shuzilm.core.Main; 8 | 9 | public class MainActivity extends Activity { 10 | TextView tv_smid; 11 | 12 | @Override 13 | protected void onCreate(Bundle savedInstanceState) { 14 | super.onCreate(savedInstanceState); 15 | setContentView(R.layout.activity_main); 16 | tv_smid = findViewById(R.id.tv_smid); 17 | tv_smid.setText(Main.getQueryID(this)); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/cn/shuzilm/core/c.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2018 Baidu, Inc. All Rights Reserved. 3 | */ 4 | package cn.shuzilm.core; 5 | 6 | import android.content.Context; 7 | 8 | class c implements Runnable { 9 | final /* synthetic */ Main a; 10 | private final /* synthetic */ Context b; 11 | private final /* synthetic */ String c; 12 | private final /* synthetic */ String d; 13 | private final /* synthetic */ Listener e; 14 | 15 | c(Main main, Context context, String str, String str2, Listener listener) { 16 | this.a = main; 17 | this.b = context; 18 | this.c = str; 19 | this.d = str2; 20 | this.e = listener; 21 | } 22 | @Override 23 | public void run() { 24 | try { 25 | String a = Main.instance.setCfgFromAssets(this.b, this.c, this.d); 26 | if (this.e != null) { 27 | this.e.handler(a); 28 | } 29 | } catch (Exception e) { 30 | e.printStackTrace(); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/Quan/Downloads/andoird_sdk/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 4 | 6 | 7 | 8 | 9 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 13 | 18 | 19 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # smid_project 2 | 该项目是『数盟可信id的获取』的样本。由于商业合作才可以拿到,一般在市面上鲜于见到。该样本出自一家接入过数盟解决方案的第三方公司APP,通过逆向的技术拿到了样本。 3 | 4 | 由于key是app唯一的,每次初始化请求会记一次,所以请手下留情! 5 | 6 | ### 关于数盟 7 | 官网传送门:https://www.shuzilm.cn 8 | 9 | ### 关于数盟ID 10 | 『数盟ID』:可信ID技术由数字联盟自主研发,用于准确描述移动设备,每个编码对象获得一个唯一的、不变的标识ID。可信ID能帮助APP公司在不同场景下确认设备唯一性,识别修改设备及复用、虚拟机刷量等行为,可以反作弊、防刷单,并通过数字联盟生成的设备ID和客户账户体系的关联,实时有效识别小号恶意注册等行为,并精确识别历史版本用户、弱账户APP的换机状态等。 11 | 12 | 可信ID不随任何非硬件信息变化而更改,是真正唯一、真实、安全、高可用的移动设备指纹。 13 | ### 说明 14 | 经调研,发现该id并不依赖于传统的设备ID,如imei、mac地址、android_id等。在xpose劫持的情况修改,imei等参数并不会导致该ID修改。C方法拦截未测试。 15 | 16 | 在app第一次启动会初始化ID,并上传至数盟服务器(api.shuzilm.cn)。因为考虑到计费统计,所以可信ID的获取至少需要网络访问的权限。 17 | 18 | 19 | ``` ``` 20 | 21 | 22 | ![可信ID.png](https://upload-images.jianshu.io/upload_images/1689923-602a94b424380a6e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 23 | 24 | 25 | 26 | 可信ID的获取过程: 27 | 28 | - 程序启动后在主进程中初始化SDK 29 | - 注册传感器监听 30 | - 获取网络权限成功后,尝试获取并散列88位可信ID 31 | - 在sp中缓存以便下次进来使用 32 | - 推送ID和相关信息至服务端接口api.shuzilm.cn 33 | 34 | 程序只有在第一次启动才会执行计算ID和计费的操作。 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/java/cn/shuzilm/core/b.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2018 Baidu, Inc. All Rights Reserved. 3 | */ 4 | package cn.shuzilm.core; 5 | 6 | import android.content.Context; 7 | 8 | class b implements Runnable { 9 | final /* synthetic */ Main a; 10 | private final /* synthetic */ Context b; 11 | private final /* synthetic */ String c; 12 | private final /* synthetic */ String d; 13 | private final /* synthetic */ String e; 14 | private final /* synthetic */ Listener f; 15 | 16 | b(Main main, Context context, String str, String str2, String str3, Listener listener) { 17 | this.a = main; 18 | this.b = context; 19 | this.c = str; 20 | this.d = str2; 21 | this.e = str3; 22 | this.f = listener; 23 | } 24 | @Override 25 | public void run() { 26 | try { 27 | String a = Main.instance.a(this.b, this.c, this.d, this.e); 28 | if (this.f != null) { 29 | this.f.handler(a); 30 | } 31 | } catch (Exception e) { 32 | e.printStackTrace(); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/cn/shuzilm/core/d.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2018 Baidu, Inc. All Rights Reserved. 3 | */ 4 | package cn.shuzilm.core; 5 | 6 | import android.content.Context; 7 | import android.hardware.Sensor; 8 | import android.hardware.SensorEvent; 9 | import android.hardware.SensorEventListener; 10 | import android.hardware.SensorManager; 11 | 12 | class d implements SensorEventListener { 13 | final /* synthetic */ Main a; 14 | private final /* synthetic */ Context b; 15 | private final /* synthetic */ SensorManager c; 16 | 17 | d(Main main, Context context, SensorManager sensorManager) { 18 | this.a = main; 19 | this.b = context; 20 | this.c = sensorManager; 21 | } 22 | 23 | @Override 24 | public void onAccuracyChanged(Sensor sensor, int i) { 25 | } 26 | 27 | @Override 28 | public void onSensorChanged(SensorEvent sensorEvent) { 29 | try { 30 | Main.onSensorChanged(this.b, sensorEvent); 31 | } catch (UnsatisfiedLinkError e) { 32 | e.printStackTrace(); 33 | } 34 | this.c.unregisterListener(this); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 27 5 | buildToolsVersion '26.0.2' 6 | defaultConfig { 7 | applicationId "com.github.gavin.smid" 8 | minSdkVersion 14 9 | targetSdkVersion 27 10 | versionCode 1 11 | versionName "1.0" 12 | ndk { 13 | abiFilters "armeabi-v7a" 14 | } 15 | } 16 | 17 | buildTypes { 18 | debug { 19 | minifyEnabled false 20 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 21 | } 22 | 23 | } 24 | sourceSets { 25 | main { 26 | jni.srcDirs = [] 27 | jniLibs.srcDirs = ['src/main/libs'] 28 | } 29 | 30 | } 31 | 32 | 33 | } 34 | 35 | dependencies { 36 | compile fileTree(include: ['*.jar'], dir: 'libs') 37 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 38 | exclude group: 'com.android.support', module: 'support-annotations' 39 | }) 40 | implementation 'com.android.support:appcompat-v7:27.1.1' 41 | implementation 'com.android.support.constraint:constraint-layout:2.0.0-alpha2' 42 | testCompile 'junit:junit:4.12' 43 | } 44 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 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 85 | -------------------------------------------------------------------------------- /app/gradlew.bat: -------------------------------------------------------------------------------- 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 85 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 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" "$@" 173 | -------------------------------------------------------------------------------- /app/gradlew: -------------------------------------------------------------------------------- 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" "$@" 173 | -------------------------------------------------------------------------------- /app/src/main/java/cn/shuzilm/core/Main.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2018 Baidu, Inc. All Rights Reserved. 3 | */ 4 | package cn.shuzilm.core; 5 | 6 | import java.io.BufferedReader; 7 | import java.io.IOException; 8 | import java.io.InputStream; 9 | import java.io.InputStreamReader; 10 | import java.util.HashMap; 11 | import java.util.Iterator; 12 | import java.util.Map; 13 | import java.util.concurrent.ExecutorService; 14 | import java.util.concurrent.Executors; 15 | import java.util.concurrent.locks.Lock; 16 | import java.util.concurrent.locks.ReentrantLock; 17 | import java.util.concurrent.locks.ReentrantReadWriteLock; 18 | 19 | import org.json.JSONException; 20 | import org.json.JSONObject; 21 | 22 | import android.content.Context; 23 | import android.content.SharedPreferences; 24 | import android.content.pm.PackageManager; 25 | import android.hardware.Sensor; 26 | import android.hardware.SensorEvent; 27 | import android.hardware.SensorManager; 28 | import android.net.ConnectivityManager; 29 | import android.net.NetworkInfo; 30 | import android.net.NetworkInfo.State; 31 | import android.telephony.PhoneStateListener; 32 | import android.telephony.SignalStrength; 33 | import android.telephony.TelephonyManager; 34 | 35 | public class Main extends PhoneStateListener { 36 | private static final String soLib = "du"; 37 | protected static final Main instance = new Main(); 38 | private static final Lock LOCK = new ReentrantLock(); 39 | private static final ReentrantReadWriteLock e = new ReentrantReadWriteLock(); 40 | static String apiKeyValue = null; 41 | static final JSONObject customJob = new JSONObject(); 42 | static final JSONObject keyJob = new JSONObject(); 43 | private static JSONObject k = null; 44 | private static final ThreadLocal sThreadLocal = new ThreadLocal(); 45 | private static Context mContext = null; 46 | private static String n = null; 47 | private static JSONObject o = new JSONObject(); 48 | private static final ExecutorService EXECUTOR_SERVICE = Executors.newSingleThreadExecutor(); 49 | private static final String SHU_ZI_LM_KEY = 50 | "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMUBVv" 51 | + "+BdK8bzgV8iTEe25zWhQabmsC8RCo4TAMW79i6ReUymlcmAvTjxq5pxKFyfvRmdsdOL9RDEQlB+6Z/nP8CAwEAAQ=="; 52 | 53 | private Main() { 54 | } 55 | 56 | private String readAssets(Context context, String str) { 57 | try { 58 | InputStream open = context.getAssets().open(str); 59 | StringBuffer stringBuffer = new StringBuffer(); 60 | BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(open)); 61 | while (true) { 62 | String readLine = bufferedReader.readLine(); 63 | if (readLine == null) { 64 | bufferedReader.close(); 65 | open.close(); 66 | return stringBuffer.toString(); 67 | } 68 | stringBuffer.append(readLine); 69 | } 70 | } catch (IOException e) { 71 | return null; 72 | } 73 | } 74 | 75 | String a(Context context, String str, String str2, String str3) { 76 | String jSONObject; 77 | Throwable th; 78 | Exception exception; 79 | Exception exception2; 80 | UnsatisfiedLinkError unsatisfiedLinkError; 81 | UnsatisfiedLinkError unsatisfiedLinkError2; 82 | String str4 = null; 83 | a(context, str, 0); 84 | try { 85 | a("type", "2"); 86 | a("pEventCode", str); 87 | a("apiKey", apiKeyValue); 88 | if (str2 != null) { 89 | a("mEventCode", str2); 90 | } 91 | jSONObject = sThreadLocal.get() != null ? ((JSONObject) sThreadLocal.get()).toString() : null; 92 | synchronized(o) { 93 | try { 94 | String jSONObject2 = o.toString(); 95 | jSONObject = onEvent(context, jSONObject, null, jSONObject2); 96 | if (jSONObject != null) { 97 | try { 98 | a(o, jSONObject2); 99 | } catch (Throwable th2) { 100 | Throwable th3 = th2; 101 | str4 = jSONObject; 102 | th = th3; 103 | try { 104 | throw th; 105 | } catch (Exception e) { 106 | exception = e; 107 | jSONObject = str4; 108 | exception2 = exception; 109 | } catch (UnsatisfiedLinkError e2) { 110 | unsatisfiedLinkError = e2; 111 | jSONObject = str4; 112 | unsatisfiedLinkError2 = unsatisfiedLinkError; 113 | unsatisfiedLinkError2.printStackTrace(); 114 | return jSONObject; 115 | } 116 | } 117 | } 118 | } catch (Throwable th4) { 119 | } 120 | } 121 | } catch (Exception e3) { 122 | exception = e3; 123 | jSONObject = null; 124 | exception2 = exception; 125 | exception2.printStackTrace(); 126 | return jSONObject; 127 | } catch (UnsatisfiedLinkError e22) { 128 | unsatisfiedLinkError = e22; 129 | jSONObject = null; 130 | unsatisfiedLinkError2 = unsatisfiedLinkError; 131 | unsatisfiedLinkError2.printStackTrace(); 132 | return jSONObject; 133 | } 134 | return null; 135 | } 136 | 137 | private void registerSensorListener(Context context, SensorManager sensorManager, Sensor sensor) { 138 | sensorManager.registerListener(new d(this, context, sensorManager), sensor, 1); 139 | } 140 | 141 | private void a(Context context, String str, int i) { 142 | synchronized(o) { 143 | JSONObject jSONObject = o; 144 | try { 145 | if (!jSONObject.has(str)) { 146 | jSONObject.put(str, 0); 147 | } 148 | jSONObject.put(str, jSONObject.getInt(str) + 1); 149 | } catch (JSONException e) { 150 | e.printStackTrace(); 151 | } 152 | } 153 | } 154 | 155 | private void a(Context context, String str, String str2, Listener listener) { 156 | EXECUTOR_SERVICE.execute(new c(this, context, str, str2, listener)); 157 | } 158 | 159 | private void a(Context context, String str, String str2, String str3, Listener listener) { 160 | EXECUTOR_SERVICE.execute(new b(this, context, str, str2, str3, listener)); 161 | } 162 | 163 | public void a(Context context, JSONObject jSONObject, String str) throws JSONException { 164 | String str2; 165 | if (jSONObject.isNull("url")) { 166 | str2 = (String) setCfgFromAssets(context, "url"); 167 | if (str2 != null) { 168 | jSONObject.put("url", str2); 169 | } 170 | } 171 | if (jSONObject.isNull("apiKey")) { 172 | str2 = (String) setCfgFromAssets(context, "apiKey"); 173 | if (str2 != null) { 174 | jSONObject.put("apiKey", str2); 175 | } 176 | } 177 | } 178 | 179 | private void a(String str, String str2) { 180 | try { 181 | JSONObject jSONObject = (JSONObject) sThreadLocal.get(); 182 | if (jSONObject != null) { 183 | jSONObject.put(str, str2); 184 | return; 185 | } 186 | jSONObject = new JSONObject(); 187 | jSONObject.put(str, str2); 188 | sThreadLocal.set(jSONObject); 189 | } catch (JSONException e) { 190 | e.printStackTrace(); 191 | } 192 | } 193 | 194 | private void a(JSONObject jSONObject, String str) { 195 | try { 196 | Iterator keys = new JSONObject(str).keys(); 197 | while (keys.hasNext()) { 198 | jSONObject.remove((String) keys.next()); 199 | } 200 | } catch (JSONException e) { 201 | e.printStackTrace(); 202 | } 203 | } 204 | 205 | private void setConfig(JSONObject jSONObject, String str, String str2) throws JSONException { 206 | jSONObject.put(str, str2); 207 | } 208 | 209 | private boolean a(Context context) { 210 | ConnectivityManager connectivityManager = 211 | (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 212 | if (connectivityManager != null) { 213 | NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 214 | if (activeNetworkInfo != null && activeNetworkInfo.isConnected() 215 | && activeNetworkInfo.getState() == State.CONNECTED) { 216 | return true; 217 | } 218 | } 219 | return false; 220 | } 221 | 222 | private Object setCfgFromAssets(Context context, String str) { 223 | Object obj = null; 224 | try { 225 | JSONObject jSONObject = k; 226 | if (jSONObject == null) { 227 | jSONObject = readAssetsJson(context); 228 | k = jSONObject; 229 | } 230 | obj = jSONObject.opt(str); 231 | } catch (Exception e) { 232 | } 233 | return obj; 234 | } 235 | 236 | private String readAssets(Context context) { 237 | return readAssets(context, "20171111_yy.jpg"); 238 | } 239 | 240 | String setCfgFromAssets(Context context, String str, String str2) { 241 | try { 242 | setConfig("apiKey", apiKeyValue);//存储key到keyJob 243 | a(context, keyJob, str); 244 | setCustomConfig(customJob, str2); 245 | return query(context, /**apk key*/keyJob.toString(), customJob.toString()); 246 | } catch (Exception e) { 247 | e.printStackTrace(); 248 | return null; 249 | } catch (UnsatisfiedLinkError e2) { 250 | e2.printStackTrace(); 251 | return null; 252 | } 253 | } 254 | 255 | public void setCustomConfig(JSONObject jSONObject, String str) throws JSONException { 256 | setConfig(jSONObject, "custom", str); 257 | } 258 | 259 | private String c(Context context, String str) { 260 | try { 261 | Object obj = context.getPackageManager() 262 | .getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA) 263 | .metaData.get(str); 264 | if (obj != null) { 265 | return obj.toString(); 266 | } 267 | } catch (Exception e) { 268 | } 269 | return null; 270 | } 271 | 272 | private JSONObject readAssetsJson(Context context) throws JSONException { 273 | String a = readAssets(context, "cn.shuzilm.config.json"); 274 | return a != null ? new JSONObject(a) : null; 275 | } 276 | 277 | private String d(Context context) { 278 | String str = null; 279 | try { 280 | Object b = instance.setCfgFromAssets(context, "store"); 281 | if (!(b instanceof String)) { 282 | str = instance.c(context, new JSONObject(b.toString()).getJSONObject("metadata").getString("name")); 283 | } 284 | } catch (Exception e) { 285 | } 286 | return str; 287 | } 288 | 289 | private String e(Context context) { 290 | SharedPreferences sharedPreferences = context.getSharedPreferences(context.getPackageName() + "_dna", 0); 291 | return sharedPreferences != null ? sharedPreferences.getString("device_id", null) : null; 292 | } 293 | 294 | private void register(Context context) { 295 | SensorManager sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); 296 | Sensor defaultSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY); 297 | if (defaultSensor != null) { 298 | registerSensorListener(context, sensorManager, defaultSensor); 299 | } 300 | defaultSensor = sensorManager.getDefaultSensor(3); 301 | if (defaultSensor != null) { 302 | registerSensorListener(context, sensorManager, defaultSensor); 303 | } 304 | defaultSensor = sensorManager.getDefaultSensor(11); 305 | if (defaultSensor != null) { 306 | registerSensorListener(context, sensorManager, defaultSensor); 307 | } 308 | defaultSensor = sensorManager.getDefaultSensor(19); 309 | if (defaultSensor != null) { 310 | registerSensorListener(context, sensorManager, defaultSensor); 311 | } 312 | defaultSensor = sensorManager.getDefaultSensor(6); 313 | if (defaultSensor != null) { 314 | registerSensorListener(context, sensorManager, defaultSensor); 315 | } 316 | } 317 | 318 | /** 319 | * 获取设备的唯一id 320 | * 321 | * @param context 322 | * 323 | * @return 324 | */ 325 | public static String getQueryID(Context context) { 326 | return (String) getQueryID(context, null, null, 0, null).get("device_id"); 327 | } 328 | 329 | public static String getQueryID(Context context, String str, String str2) { 330 | return (String) getQueryID(context, str, str2, 0, null).get("device_id"); 331 | } 332 | 333 | public static Map getQueryID(Context context, String str, String str2, int i, Listener listener) { 334 | HashMap hashMap = new HashMap(); 335 | Object obj = "0"; 336 | Context applicationContext = context.getApplicationContext(); 337 | if (i == 1) { 338 | instance.a(applicationContext, str, str2, listener); 339 | return null; 340 | } else if (LOCK.tryLock()) { 341 | String b = instance.setCfgFromAssets(applicationContext, str, str2); 342 | if (b != null) { 343 | n = b; 344 | obj = "1"; 345 | } 346 | if (b == null) { 347 | b = n != null ? n : instance.e(applicationContext); 348 | } 349 | hashMap.put("device_id", b); 350 | hashMap.put("valid", obj); 351 | LOCK.unlock(); 352 | return hashMap; 353 | } else { 354 | String e = instance.e(applicationContext); 355 | if (e == null) { 356 | instance.a(applicationContext, str, str2, listener); 357 | } 358 | hashMap.put("device_id", e); 359 | hashMap.put("valid", obj); 360 | return hashMap; 361 | } 362 | } 363 | 364 | /** 365 | * 需要在主进程中调用 366 | * 367 | * @param context 368 | */ 369 | public static void init(Context context) { 370 | mContext = context.getApplicationContext(); 371 | try { 372 | apiKeyValue = SHU_ZI_LM_KEY; 373 | System.loadLibrary(soLib); 374 | ((TelephonyManager) mContext 375 | .getSystemService(Context.TELEPHONY_SERVICE)).listen(instance, LISTEN_SIGNAL_STRENGTHS); 376 | instance.register(context); 377 | } catch (Exception e) { 378 | e.printStackTrace(); 379 | } catch (UnsatisfiedLinkError e2) { 380 | e2.printStackTrace(); 381 | } 382 | } 383 | 384 | public static Map onEvent(Context context, String str, String str2, String str3, int i, Listener listener) { 385 | Map hashMap = new HashMap(); 386 | if (str == null) { 387 | return null; 388 | } 389 | Context applicationContext = context.getApplicationContext(); 390 | if (i == 1) { 391 | instance.a(applicationContext, str, str2, str3, listener); 392 | return null; 393 | } else if (LOCK.tryLock()) { 394 | hashMap.put("SessionID", instance.a(applicationContext, str, str2, str3)); 395 | hashMap.put("QueryID", n); 396 | LOCK.unlock(); 397 | return hashMap; 398 | } else { 399 | instance.a(applicationContext, str, str2, str3, listener); 400 | return null; 401 | } 402 | } 403 | 404 | public static int setConfig(String str, String str2) throws JSONException { 405 | instance.setConfig(keyJob, str, str2); 406 | return 0; 407 | } 408 | 409 | public static int setData(String str, String str2) throws JSONException { 410 | instance.setConfig(customJob, str, str2); 411 | return 0; 412 | } 413 | 414 | public static int unResListener() { 415 | ((TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE)).listen(instance, 0); 416 | return 0; 417 | } 418 | 419 | @Override 420 | public void onSignalStrengthsChanged(SignalStrength signalStrength) { 421 | try { 422 | onSSChanged(mContext, signalStrength); 423 | } catch (UnsatisfiedLinkError e) { 424 | e.printStackTrace(); 425 | } 426 | } 427 | 428 | public static native String onEvent(Context context, String str, String str2, String str3); 429 | 430 | public static native void onSSChanged(Context context, SignalStrength signalStrength); 431 | 432 | public static native void onSensorChanged(Context context, SensorEvent sensorEvent); 433 | 434 | public static native String query(Context context, String str, String str2); 435 | 436 | public static native String run(Context context, String str, String str2); 437 | } 438 | --------------------------------------------------------------------------------