From b6ebed022836c790d689feb5073afbc13ac63c5d Mon Sep 17 00:00:00 2001 From: Syuugo Date: Wed, 7 May 2025 18:44:18 +0900 Subject: [PATCH 1/3] Make sample --- README.md | 10 ++--- app/build.gradle | 1 + .../rosan/app_process/demo/MainActivity.java | 42 +++++++++++++++++++ app/src/main/res/layout/activity_main.xml | 1 + hidden-api/build.gradle | 4 ++ .../android/content/pm/IPackageManager.aidl | 5 +++ 6 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 hidden-api/src/main/aidl/android/content/pm/IPackageManager.aidl diff --git a/README.md b/README.md index 572f1d6..e17d030 100644 --- a/README.md +++ b/README.md @@ -18,14 +18,14 @@ implementation 'io.github.iamr0s:AndroidAppProcess:' ```java AppProcess process = new AppProcess.Default(); -process.init(context.getPackageName()); +process.init(context); ``` - Root ```java AppProcess process = new AppProcess.Root(); -process.init(context.getPackageName()); +process.init(context); ``` ### 2. Use it. @@ -34,13 +34,13 @@ process.init(context.getPackageName()); ```java AppProcess process = new AppProcess.Root(); -process.init(context.getPackageName()); +process.init(context); -IPackageManager manager = android.os.ServiceManager.getService("package"); +IBinder manager = ServiceManager.getService("package"); IBinder binderWrapper = process.binderWrapper(manager.asBinder()); IPackageManager managerWrapper = IPackageManager.Stub.asInterface(binderWrapper); -managerWrapper.uninstall(...) // will call it in root. +managerWrapper.uninstall(...); // will call it in root. ``` - More diff --git a/app/build.gradle b/app/build.gradle index 3e3b9bf..661883e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -32,5 +32,6 @@ android { } dependencies { + compileOnly project(":hidden-api") implementation project(":app-process") } diff --git a/app/src/main/java/com/rosan/app_process/demo/MainActivity.java b/app/src/main/java/com/rosan/app_process/demo/MainActivity.java index 70a7782..526546d 100644 --- a/app/src/main/java/com/rosan/app_process/demo/MainActivity.java +++ b/app/src/main/java/com/rosan/app_process/demo/MainActivity.java @@ -1,13 +1,55 @@ package com.rosan.app_process.demo; import android.app.Activity; +import android.content.pm.IPackageManager; import android.os.Bundle; +import android.os.IBinder; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.widget.TextView; +import android.widget.Toast; + +import com.rosan.app_process.AppProcess; + +import java.util.Arrays; public class MainActivity extends Activity { + private void makeText(String msg) { + runOnUiThread(() -> Toast.makeText(this, msg, Toast.LENGTH_SHORT).show()); + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + + AppProcess process = new AppProcess.Default(); + process.init(this); + + IBinder manager = ServiceManager.getService("package"); + IBinder binderWrapper; + try { + binderWrapper = process.binderWrapper(manager); + } catch (IllegalStateException ignored) { + makeText("AppProcess: please call init() first."); + finishAndRemoveTask(); + return; + } + IPackageManager managerWrapper = IPackageManager.Stub.asInterface(binderWrapper); + + String[] libraries = new String[]{"NULL"}; + try { + if (managerWrapper != null) { + libraries = managerWrapper.getSystemSharedLibraryNames(); + } + } catch (RemoteException ignored) { + makeText("RemoteException occurred."); + } + + TextView text = findViewById(R.id.text); + text.setText(Arrays.toString(libraries)); + + process.close(); } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index dca8204..98439c0 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -5,6 +5,7 @@ android:gravity="center"> diff --git a/hidden-api/build.gradle b/hidden-api/build.gradle index e3b548a..af88231 100644 --- a/hidden-api/build.gradle +++ b/hidden-api/build.gradle @@ -10,6 +10,10 @@ android { minSdk = 19 } + buildFeatures { + aidl = true + } + compileOptions { sourceCompatibility JavaVersion.VERSION_21 targetCompatibility JavaVersion.VERSION_21 diff --git a/hidden-api/src/main/aidl/android/content/pm/IPackageManager.aidl b/hidden-api/src/main/aidl/android/content/pm/IPackageManager.aidl new file mode 100644 index 0000000..8a0dab1 --- /dev/null +++ b/hidden-api/src/main/aidl/android/content/pm/IPackageManager.aidl @@ -0,0 +1,5 @@ +package android.content.pm; + +interface IPackageManager { + String[] getSystemSharedLibraryNames(); +} From 1464a00860c8a1cf8a9eb72814e5e77e0418222e Mon Sep 17 00:00:00 2001 From: Syuugo Date: Wed, 7 May 2025 21:37:06 +0900 Subject: [PATCH 2/3] Use ScrollView --- app/src/main/res/layout/activity_main.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 98439c0..8ddf7c5 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,5 +1,5 @@ - @@ -10,4 +10,4 @@ android:layout_height="wrap_content" android:text="Hello World!" /> - + From f4864333492dc7aa533a9c3917820f30c55d4038 Mon Sep 17 00:00:00 2001 From: Syuugo Date: Sat, 24 May 2025 17:05:39 +0900 Subject: [PATCH 3/3] Add init if --- .../main/java/com/rosan/app_process/demo/MainActivity.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/rosan/app_process/demo/MainActivity.java b/app/src/main/java/com/rosan/app_process/demo/MainActivity.java index 526546d..a9ad7e4 100644 --- a/app/src/main/java/com/rosan/app_process/demo/MainActivity.java +++ b/app/src/main/java/com/rosan/app_process/demo/MainActivity.java @@ -25,7 +25,11 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); AppProcess process = new AppProcess.Default(); - process.init(this); + if (!process.init(this)) { + makeText("AppProcess: failed initialize."); + finishAndRemoveTask(); + return; + } IBinder manager = ServiceManager.getService("package"); IBinder binderWrapper;