diff --git a/app/src/main/assets/UnblockNeteaseMusic.zip b/app/src/main/assets/UnblockNeteaseMusic.zip index ab217965..b86c0b8e 100644 Binary files a/app/src/main/assets/UnblockNeteaseMusic.zip and b/app/src/main/assets/UnblockNeteaseMusic.zip differ diff --git a/app/src/main/java/com/raincat/dolby_beta/Hooklite.java b/app/src/main/java/com/raincat/dolby_beta/HookOther.java similarity index 93% rename from app/src/main/java/com/raincat/dolby_beta/Hooklite.java rename to app/src/main/java/com/raincat/dolby_beta/HookOther.java index 6dc42f73..bca3d66d 100644 --- a/app/src/main/java/com/raincat/dolby_beta/Hooklite.java +++ b/app/src/main/java/com/raincat/dolby_beta/HookOther.java @@ -1,176 +1,189 @@ -package com.raincat.dolby_beta; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.os.Build; -import android.os.Environment; - -import com.raincat.dolby_beta.helper.ClassHelper; -import com.raincat.dolby_beta.helper.ExtraHelper; -import com.raincat.dolby_beta.helper.FileHelper; -import com.raincat.dolby_beta.helper.NotificationHelper; -import com.raincat.dolby_beta.helper.SettingHelper; -import com.raincat.dolby_beta.hook.AdAndUpdateHook; -import com.raincat.dolby_beta.hook.AutoSignInHook; -import com.raincat.dolby_beta.hook.BlackHook; -import com.raincat.dolby_beta.hook.CdnHook; -import com.raincat.dolby_beta.hook.CommentHotClickHook; -import com.raincat.dolby_beta.hook.DownloadMD5Hook; -import com.raincat.dolby_beta.hook.EAPIHook; -import com.raincat.dolby_beta.hook.GrayHook; -import com.raincat.dolby_beta.hook.HideBannerHook; -import com.raincat.dolby_beta.hook.HideBubbleHook; -import com.raincat.dolby_beta.hook.HideSidebarHook; -import com.raincat.dolby_beta.hook.HideTabHook; -import com.raincat.dolby_beta.hook.InternalDialogHook; -import com.raincat.dolby_beta.hook.MagiskFixHook; -import com.raincat.dolby_beta.hook.PlayerActivityHook; -import com.raincat.dolby_beta.hook.ProxyHook; -import com.raincat.dolby_beta.hook.SettingHook; -import com.raincat.dolby_beta.hook.UserProfileHook; -import com.raincat.dolby_beta.utils.Tools; - -import java.io.File; -import java.io.IOException; - -import de.robv.android.xposed.XC_MethodHook; -import de.robv.android.xposed.XposedBridge; -import de.robv.android.xposed.XposedHelpers; -import de.robv.android.xposed.callbacks.XC_LoadPackage; - -public class Hooklite { - private final static String PACKAGE_NAME = "com.netease.cloudmusic.lite"; - //进程初始化状态 - public boolean playProcessInit = false; - public boolean mainProcessInit = false; - //主线程反编译dex完成后通知可以对play进程进行hook了 - private final String msg_hook_play_process = "hookPlayProcess"; - //play进程初始化完成通知主线程 - private final String msg_play_process_init_finish = "playProcessInitFinish"; - //发通知 - public static final String msg_send_notification = "sendNotification"; - - public Hooklite(XC_LoadPackage.LoadPackageParam lpparam) { - XposedHelpers.findAndHookMethod(XposedHelpers.findClass("com.netease.cloudmusic.NeteaseMusicApplication", lpparam.classLoader), - "attachBaseContext", Context.class, new XC_MethodHook() { - @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - final Context context = (Context) param.thisObject; - int versionCode = 140; - //初始化仓库 - ExtraHelper.init(context); - //初始化设置 - SettingHelper.init(context); - - final String processName = Tools.getCurrentProcessName(context); - if (processName.equals(PACKAGE_NAME)) { - //设置 - new SettingHook(context, versionCode); - //总开关 - if (!SettingHelper.getInstance().getSetting(SettingHelper.master_key)) - return; - //音源代理 - new ProxyHook(context, false); - //黑胶 - if (SettingHelper.getInstance().isEnable(SettingHelper.black_key)) { - new BlackHook(context, versionCode); - deleteAdAndTinker(); - } - //不变灰 - new GrayHook(context); - //自动签到 - new AutoSignInHook(context, versionCode); - //去广告与去升级 - new AdAndUpdateHook(context, versionCode); - //修复magisk冲突导致的无法读写外置sd卡 - new MagiskFixHook(context); - //去掉内测与听歌识曲弹窗 - new InternalDialogHook(context, versionCode); -// new TestHook(context); - ClassHelper.getCacheClassList(context, versionCode, () -> { - //获取账号信息 - new UserProfileHook(context); - //网络访问 - new EAPIHook(context); - //下载MD5校验 - new DownloadMD5Hook(context); - //精简tab - new HideTabHook(context, versionCode); - //精简侧边栏 - new HideSidebarHook(context, versionCode); - //移除Banner - new HideBannerHook(context, versionCode); - //隐藏小红点 - new HideBubbleHook(context); - //打开评论后优先显示最热评论 - new CommentHotClickHook(context); - //黑胶停转,隐藏K歌按钮 - new PlayerActivityHook(context, versionCode); - new CdnHook(context, versionCode); - - mainProcessInit = true; - if (mainProcessInit && playProcessInit) - context.sendBroadcast(new Intent(msg_hook_play_process)); - }); - IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction(msg_play_process_init_finish); - intentFilter.addAction(msg_send_notification); - context.registerReceiver(new BroadcastReceiver() { - @Override - public void onReceive(Context c, Intent intent) { - if (msg_play_process_init_finish.equals(intent.getAction())) { - playProcessInit = true; - if (mainProcessInit && playProcessInit) - context.sendBroadcast(new Intent(msg_hook_play_process)); - } else if (msg_send_notification.equals(intent.getAction())) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) - NotificationHelper.getInstance(context).sendUnLockNotification(context, intent.getIntExtra("code", 0x10), - intent.getStringExtra("title"), intent.getStringExtra("title"), intent.getStringExtra("message")); - XposedBridge.log(intent.getStringExtra("title") + ":" + intent.getStringExtra("message")); - } - } - }, intentFilter); - } else if (processName.equals(PACKAGE_NAME + ":play") && SettingHelper.getInstance().getSetting(SettingHelper.master_key)) { - //音源代理 - new ProxyHook(context, true); - IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction(msg_hook_play_process); - context.registerReceiver(new BroadcastReceiver() { - @Override - public void onReceive(Context c, Intent intent) { - if (msg_hook_play_process.equals(intent.getAction())) { - ClassHelper.getCacheClassList(context, versionCode, () -> { - new EAPIHook(context); - new CdnHook(context, versionCode); - }); - } - } - }, intentFilter); - context.sendBroadcast(new Intent(msg_play_process_init_finish)); - } - } - }); - } - - private void deleteAdAndTinker() throws IOException { - //广告缓存路径 - String CACHE_PATH3 = Environment.getExternalStorageDirectory() + "/netease/cloudmusic/lite/Ad"; - String CACHE_PATH4 = Environment.getExternalStorageDirectory() + "/Android/data/com.netease.cloudmusic.lite/cache/Ad"; - String TINKER_PATH = "data/data/" + PACKAGE_NAME + "/tinker"; - - FileHelper.deleteDirectory(CACHE_PATH3); - FileHelper.deleteDirectory(CACHE_PATH4); - - File tinkerFile = new File(TINKER_PATH); - if (tinkerFile.exists() && tinkerFile.isDirectory()) - FileHelper.deleteDirectory(TINKER_PATH); - if (!tinkerFile.exists()) - tinkerFile.createNewFile(); - - String command = "chmod 000 " + tinkerFile.getAbsolutePath(); - Runtime runtime = Runtime.getRuntime(); - runtime.exec(command); - } +package com.raincat.dolby_beta; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Build; +import android.os.Environment; + +import com.raincat.dolby_beta.helper.ClassHelper; +import com.raincat.dolby_beta.helper.ExtraHelper; +import com.raincat.dolby_beta.helper.FileHelper; +import com.raincat.dolby_beta.helper.NotificationHelper; +import com.raincat.dolby_beta.helper.SettingHelper; +import com.raincat.dolby_beta.hook.AdAndUpdateHook; +import com.raincat.dolby_beta.hook.AutoSignInHook; +import com.raincat.dolby_beta.hook.BlackHook; +import com.raincat.dolby_beta.hook.CdnHook; +import com.raincat.dolby_beta.hook.CommentHotClickHook; +import com.raincat.dolby_beta.hook.DownloadMD5Hook; +import com.raincat.dolby_beta.hook.EAPIHook; +import com.raincat.dolby_beta.hook.GrayHook; +import com.raincat.dolby_beta.hook.HideBannerHook; +import com.raincat.dolby_beta.hook.HideBubbleHook; +import com.raincat.dolby_beta.hook.HideSidebarHook; +import com.raincat.dolby_beta.hook.HideTabHook; +import com.raincat.dolby_beta.hook.InternalDialogHook; +import com.raincat.dolby_beta.hook.MagiskFixHook; +import com.raincat.dolby_beta.hook.PlayerActivityHook; +import com.raincat.dolby_beta.hook.ProxyHook; +import com.raincat.dolby_beta.hook.SettingHook; +import com.raincat.dolby_beta.hook.UserProfileHook; +import com.raincat.dolby_beta.utils.Tools; + +import java.io.File; +import java.io.IOException; + +import de.robv.android.xposed.XC_MethodHook; +import de.robv.android.xposed.XposedBridge; +import de.robv.android.xposed.XposedHelpers; +import de.robv.android.xposed.callbacks.XC_LoadPackage; + +public class HookOther { + private static String PACKAGE_NAME; + int versionCode = 0; + //进程初始化状态 + public boolean playProcessInit = false; + public boolean mainProcessInit = false; + //主线程反编译dex完成后通知可以对play进程进行hook了 + private final String msg_hook_play_process = "hookPlayProcess"; + //play进程初始化完成通知主线程 + private final String msg_play_process_init_finish = "playProcessInitFinish"; + //发通知 + public static final String msg_send_notification = "sendNotification"; + + + public HookOther(XC_LoadPackage.LoadPackageParam lpparam) { + PACKAGE_NAME=lpparam.packageName; + XposedHelpers.findAndHookMethod(XposedHelpers.findClass("com.netease.cloudmusic.NeteaseMusicApplication", lpparam.classLoader), + "attachBaseContext", Context.class, new XC_MethodHook() { + @Override + protected void afterHookedMethod(MethodHookParam param) throws Throwable { + final Context context = (Context) param.thisObject; + if(PACKAGE_NAME.equals("com.netease.cloudmusic.lite")) + { + versionCode = 140; + }else { + versionCode = 8010050; + } + + //初始化仓库 + ExtraHelper.init(context); + //初始化设置 + SettingHelper.init(context); + + final String processName = Tools.getCurrentProcessName(context); + if (processName.equals(PACKAGE_NAME)) { + //设置 + new SettingHook(context, versionCode); + //总开关 + if (!SettingHelper.getInstance().getSetting(SettingHelper.master_key)) + return; + //音源代理 + new ProxyHook(context, false); + //黑胶 + if (SettingHelper.getInstance().isEnable(SettingHelper.black_key)) { + new BlackHook(context, versionCode); + deleteAdAndTinker(); + } + //不变灰 + new GrayHook(context); + //自动签到 + new AutoSignInHook(context, versionCode); + //去广告与去升级 + new AdAndUpdateHook(context, versionCode); + //修复magisk冲突导致的无法读写外置sd卡 + new MagiskFixHook(context); + //去掉内测与听歌识曲弹窗 + new InternalDialogHook(context, versionCode); +// new TestHook(context); + ClassHelper.getCacheClassList(context, versionCode, () -> { + //获取账号信息 + new UserProfileHook(context); + //网络访问 + new EAPIHook(context); + //下载MD5校验 + new DownloadMD5Hook(context); + //精简tab + new HideTabHook(context, versionCode); + //精简侧边栏 + new HideSidebarHook(context, versionCode); + //移除Banner + new HideBannerHook(context, versionCode); + //隐藏小红点 + new HideBubbleHook(context); + //打开评论后优先显示最热评论 + new CommentHotClickHook(context); + //黑胶停转,隐藏K歌按钮 + new PlayerActivityHook(context, versionCode); + new CdnHook(context, versionCode); + + mainProcessInit = true; + if (mainProcessInit && playProcessInit) + context.sendBroadcast(new Intent(msg_hook_play_process)); + }); + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(msg_play_process_init_finish); + intentFilter.addAction(msg_send_notification); + context.registerReceiver(new BroadcastReceiver() { + @Override + public void onReceive(Context c, Intent intent) { + if (msg_play_process_init_finish.equals(intent.getAction())) { + playProcessInit = true; + if (mainProcessInit && playProcessInit) + context.sendBroadcast(new Intent(msg_hook_play_process)); + } else if (msg_send_notification.equals(intent.getAction())) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) + NotificationHelper.getInstance(context).sendUnLockNotification(context, intent.getIntExtra("code", 0x10), + intent.getStringExtra("title"), intent.getStringExtra("title"), intent.getStringExtra("message")); + XposedBridge.log(intent.getStringExtra("title") + ":" + intent.getStringExtra("message")); + } + } + }, intentFilter); + } else if (processName.equals(PACKAGE_NAME + ":play") && SettingHelper.getInstance().getSetting(SettingHelper.master_key)) { + //音源代理 + new ProxyHook(context, true); + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(msg_hook_play_process); + context.registerReceiver(new BroadcastReceiver() { + @Override + public void onReceive(Context c, Intent intent) { + if (msg_hook_play_process.equals(intent.getAction())) { + ClassHelper.getCacheClassList(context, versionCode, () -> { + new EAPIHook(context); + new CdnHook(context, versionCode); + }); + } + } + }, intentFilter); + context.sendBroadcast(new Intent(msg_play_process_init_finish)); + } + } + }); + } + + private void deleteAdAndTinker() throws IOException { + //广告缓存路径 + String CACHE_PATH3 = Environment.getExternalStorageDirectory() + "/netease/cloudmusic/lite/Ad"; + if(PACKAGE_NAME.equals("com.hihonor.cloudmusic")) + { + CACHE_PATH3 = Environment.getExternalStorageDirectory() + "/hihonor/cloudmusic/Ad"; + } + String CACHE_PATH4 = Environment.getExternalStorageDirectory() + "/Android/data/"+PACKAGE_NAME+"cache/Ad"; + String TINKER_PATH = "data/data/" + PACKAGE_NAME + "/tinker"; + + FileHelper.deleteDirectory(CACHE_PATH3); + FileHelper.deleteDirectory(CACHE_PATH4); + + File tinkerFile = new File(TINKER_PATH); + if (tinkerFile.exists() && tinkerFile.isDirectory()) + FileHelper.deleteDirectory(TINKER_PATH); + if (!tinkerFile.exists()) + tinkerFile.createNewFile(); + + String command = "chmod 000 " + tinkerFile.getAbsolutePath(); + Runtime runtime = Runtime.getRuntime(); + runtime.exec(command); + } } \ No newline at end of file diff --git a/app/src/main/java/com/raincat/dolby_beta/HookerDispatcher.java b/app/src/main/java/com/raincat/dolby_beta/HookerDispatcher.java index d626ff7f..08c4cbd3 100644 --- a/app/src/main/java/com/raincat/dolby_beta/HookerDispatcher.java +++ b/app/src/main/java/com/raincat/dolby_beta/HookerDispatcher.java @@ -18,7 +18,7 @@ public class HookerDispatcher implements IHookerDispatcher { @Override public void dispatch(XC_LoadPackage.LoadPackageParam lpparam) { new Hook(lpparam); - new Hooklite(lpparam); + new HookOther(lpparam); } } diff --git a/app/src/main/java/com/raincat/dolby_beta/MainHook.java b/app/src/main/java/com/raincat/dolby_beta/MainHook.java index 82d88024..285c29e8 100644 --- a/app/src/main/java/com/raincat/dolby_beta/MainHook.java +++ b/app/src/main/java/com/raincat/dolby_beta/MainHook.java @@ -4,8 +4,6 @@ import com.raincat.dolby_beta.helper.ScriptHelper; -import net.androidwing.hotxposed.HotXposed; - import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.IXposedHookZygoteInit; import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam; @@ -26,7 +24,9 @@ public void handleLoadPackage(final LoadPackageParam lpparam) throws Exception { // HotXposed.hook(HookerDispatcher.class, lpparam); new Hook(lpparam); }else if (!TextUtils.isEmpty(lpparam.packageName) && lpparam.packageName.equals("com.netease.cloudmusic.lite")) { - new Hooklite(lpparam); + new HookOther(lpparam); + }else if (!TextUtils.isEmpty(lpparam.packageName) && lpparam.packageName.equals("com.hihonor.cloudmusic")) { + new HookOther(lpparam); } } diff --git a/app/src/main/java/com/raincat/dolby_beta/helper/SettingHelper.java b/app/src/main/java/com/raincat/dolby_beta/helper/SettingHelper.java index 5b765329..a1024473 100644 --- a/app/src/main/java/com/raincat/dolby_beta/helper/SettingHelper.java +++ b/app/src/main/java/com/raincat/dolby_beta/helper/SettingHelper.java @@ -122,7 +122,7 @@ public class SettingHelper { public static final String proxy_original_key = "β_proxy_original_key"; public static final String proxy_original_title = "代理源(空格隔开)"; - public static final String proxy_original_default = "kuwo pyncmd"; + public static final String proxy_original_default = "pyncmd kuwo"; public static final String proxy_cover_key = "β_proxy_cover_key"; public static final String proxy_cover_title = "重新释放脚本"; @@ -225,7 +225,7 @@ public void refreshSetting(Context context) { } - public void setSetting(String key, boolean value) { + public void setSetting(String key, boolean value) { settingMap.put(key, value); sharedPreferences.edit().putBoolean(key, value).apply(); } diff --git a/app/src/main/java/com/raincat/dolby_beta/hook/AdAndUpdateHook.java b/app/src/main/java/com/raincat/dolby_beta/hook/AdAndUpdateHook.java index e287b838..42c701d6 100644 --- a/app/src/main/java/com/raincat/dolby_beta/hook/AdAndUpdateHook.java +++ b/app/src/main/java/com/raincat/dolby_beta/hook/AdAndUpdateHook.java @@ -52,7 +52,7 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable { //加了一个反营销版权保护的URL,暂时作用未知 if (urlObj.toString().contains("appcustomconfig/get") //去广告 - || (SettingHelper.getInstance().isEnable(SettingHelper.black_key) && !urlObj.toString().contains("music.126.net") && (urlObj.toString().contains("resource-exposure/config") || urlObj.toString().contains("api/ad") || urlObj.toString().endsWith(".jpg") || urlObj.toString().endsWith(".mp4"))) + || (SettingHelper.getInstance().isEnable(SettingHelper.black_key) && !urlObj.toString().contains("music.126.net") && (urlObj.toString().contains("resource-exposure/config") || urlObj.toString().contains("api/ad") || urlObj.toString().endsWith(".jpg") || urlObj.toString().endsWith(".mp4") || urlObj.toString().contains("ad/get")|| urlObj.toString().contains("ad/loading"))) //去升级 || (SettingHelper.getInstance().isEnable(SettingHelper.update_key) && (urlObj.toString().contains("android/version") || urlObj.toString().contains("android/upgrade")))) { Field url = urlObj.getClass().getDeclaredField(urlFieldString); diff --git a/app/src/main/java/com/raincat/dolby_beta/hook/SettingHook.java b/app/src/main/java/com/raincat/dolby_beta/hook/SettingHook.java index 20b8071a..f874f21f 100644 --- a/app/src/main/java/com/raincat/dolby_beta/hook/SettingHook.java +++ b/app/src/main/java/com/raincat/dolby_beta/hook/SettingHook.java @@ -333,7 +333,7 @@ private void showProxyConfigurationDialog(final Context context) { dialogProxyRoot.addView(proxyOriginalView); // dialogProxyRoot.addView(proxykuwoView); dialogProxyRoot.addView(proxyqqView); - dialogProxyRoot.addView(proxymiguView); + // dialogProxyRoot.addView(proxymiguView); new AlertDialog.Builder(context) .setView(dialogProxyRoot) .setCancelable(true)