diff --git a/README.md b/README.md
index 76612d14a..ee0c8f325 100644
--- a/README.md
+++ b/README.md
@@ -33,9 +33,24 @@ Import and build the project in Android Studio(__with Instant Run disabled__). T
- `YAHFA`. This is the YAHFA hook module.
- `demoHookPlugin`. This is a demo hook plugin which compiles to an APK.
-After building the APKs, push the `demoHookPlugin` APK to device in folder `/sdcard/io.virtualhook/` and run the main application. All plugin APKs in `/sdcard/io.virtualhook` would be applied to applications running in VirtualHook.
+## Usage
+
+- Write and build a hook plugin APK. You can take a look at the [demoHookPlugin](https://github.com/rk700/VirtualHook/tree/master/VirtualApp/app/src/main/res/drawable-xxhdpi/ic_extension_black_24dp.png) module for reference. __Don't forget to put following meta-data in AndroidManifest.xml:__
+
+```xml
+
+
+
+```
-Please refer to [demoHookPlugin](https://github.com/rk700/VirtualHook/tree/master/VirtualApp/demoHookPlugin) for more details.
+- Push the plugin APK to sdcard
+- Run VirtualHook and click the `Add` button
+- Swipe to the 'APPS IN SDCARD' page. Then select and add hook plugins which are displayed with an icon ![](VirtualApp/app/src/main/res/drawable-xxhdpi/ic_extension_black_24dp.png)
+- Add and run non-plugin apps
## Hooking Native Methods
diff --git a/VirtualApp/app/src/main/java/io/virtualapp/home/HomeActivity.java b/VirtualApp/app/src/main/java/io/virtualapp/home/HomeActivity.java
index 3b9285c73..80b7bd8f2 100644
--- a/VirtualApp/app/src/main/java/io/virtualapp/home/HomeActivity.java
+++ b/VirtualApp/app/src/main/java/io/virtualapp/home/HomeActivity.java
@@ -410,7 +410,7 @@ public boolean canDropOver(RecyclerView recyclerView, RecyclerView.ViewHolder cu
AppData data = mLaunchpadAdapter.getList().get(target.getAdapterPosition());
return data.canReorder();
} catch (IndexOutOfBoundsException e) {
- e.printStackTrace();
+// e.printStackTrace();
}
return false;
}
diff --git a/VirtualApp/app/src/main/java/io/virtualapp/home/HomePresenterImpl.java b/VirtualApp/app/src/main/java/io/virtualapp/home/HomePresenterImpl.java
index 89b016a3f..139a721eb 100644
--- a/VirtualApp/app/src/main/java/io/virtualapp/home/HomePresenterImpl.java
+++ b/VirtualApp/app/src/main/java/io/virtualapp/home/HomePresenterImpl.java
@@ -87,7 +87,7 @@ class AddResult {
VUiKit.defer().when(() -> {
InstalledAppInfo installedAppInfo = VirtualCore.get().getInstalledAppInfo(info.packageName, 0);
addResult.justEnableHidden = installedAppInfo != null;
- if (addResult.justEnableHidden) {
+ if (addResult.justEnableHidden && !info.isHook) {
int[] userIds = installedAppInfo.getInstalledUsers();
int nextUserId = userIds.length;
/*
diff --git a/VirtualApp/app/src/main/java/io/virtualapp/home/ListAppFragment.java b/VirtualApp/app/src/main/java/io/virtualapp/home/ListAppFragment.java
index 05f3e63c7..9398b02c7 100644
--- a/VirtualApp/app/src/main/java/io/virtualapp/home/ListAppFragment.java
+++ b/VirtualApp/app/src/main/java/io/virtualapp/home/ListAppFragment.java
@@ -106,7 +106,7 @@ public boolean isSelectable(int position) {
ArrayList dataList = new ArrayList(selectedIndices.length);
for (int index : selectedIndices) {
AppInfo info = mAdapter.getItem(index);
- dataList.add(new AppInfoLite(info.packageName, info.path, info.fastOpen));
+ dataList.add(new AppInfoLite(info.packageName, info.path, info.fastOpen, info.isHook));
}
Intent data = new Intent();
data.putParcelableArrayListExtra(VCommends.EXTRA_APP_INFO_LIST, dataList);
diff --git a/VirtualApp/app/src/main/java/io/virtualapp/home/adapters/AppPagerAdapter.java b/VirtualApp/app/src/main/java/io/virtualapp/home/adapters/AppPagerAdapter.java
index 1bfffd67d..eff4cebfc 100644
--- a/VirtualApp/app/src/main/java/io/virtualapp/home/adapters/AppPagerAdapter.java
+++ b/VirtualApp/app/src/main/java/io/virtualapp/home/adapters/AppPagerAdapter.java
@@ -38,7 +38,7 @@ public AppPagerAdapter(FragmentManager fm) {
File dir = Reflect.on(volume).call("getPathFile").get();
String label = Reflect.on(volume).call("getUserLabel").get();
if (dir.listFiles() != null) {
- titles.add(label);
+ titles.add("Apps in "+label);
dirs.add(dir);
}
}
@@ -46,7 +46,7 @@ public AppPagerAdapter(FragmentManager fm) {
// Fallback: only support the default storage sources
File storageFir = Environment.getExternalStorageDirectory();
if (storageFir.list() != null) {
- titles.add("Ghost Installation");
+ titles.add("Apps in sdcard");
dirs.add(storageFir);
}
}
diff --git a/VirtualApp/app/src/main/java/io/virtualapp/home/adapters/CloneAppListAdapter.java b/VirtualApp/app/src/main/java/io/virtualapp/home/adapters/CloneAppListAdapter.java
index 9f78f6916..75be21742 100644
--- a/VirtualApp/app/src/main/java/io/virtualapp/home/adapters/CloneAppListAdapter.java
+++ b/VirtualApp/app/src/main/java/io/virtualapp/home/adapters/CloneAppListAdapter.java
@@ -82,6 +82,12 @@ public void onBindViewHolder(ViewHolder holder, int position) {
} else {
holder.labelView.setVisibility(View.INVISIBLE);
}
+ if(info.isHook) {
+ holder.isHookIcon.setVisibility(View.VISIBLE);
+ }
+ else {
+ holder.isHookIcon.setVisibility(View.INVISIBLE);
+ }
holder.itemView.setOnClickListener(v -> {
mItemEventListener.onItemClick(info, position);
@@ -127,6 +133,7 @@ class ViewHolder extends RecyclerView.ViewHolder {
private TextView nameView;
private ImageView appCheckView;
private LabelView labelView;
+ ImageView isHookIcon;
ViewHolder(View itemView) {
super(itemView);
@@ -135,6 +142,7 @@ class ViewHolder extends RecyclerView.ViewHolder {
nameView = (TextView) itemView.findViewById(R.id.item_app_name);
appCheckView = (ImageView) itemView.findViewById(R.id.item_app_checked);
labelView = (LabelView) itemView.findViewById(R.id.item_app_clone_count);
+ isHookIcon = (ImageView)itemView.findViewById(R.id.item_app_ishook);
}
}
}
diff --git a/VirtualApp/app/src/main/java/io/virtualapp/home/adapters/LaunchpadAdapter.java b/VirtualApp/app/src/main/java/io/virtualapp/home/adapters/LaunchpadAdapter.java
index 16ddeebce..0f387475c 100644
--- a/VirtualApp/app/src/main/java/io/virtualapp/home/adapters/LaunchpadAdapter.java
+++ b/VirtualApp/app/src/main/java/io/virtualapp/home/adapters/LaunchpadAdapter.java
@@ -6,6 +6,7 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
@@ -59,11 +60,18 @@ public void onBindViewHolder(ViewHolder holder, int position) {
holder.color = getColor(position);
holder.iconView.setImageDrawable(data.getIcon());
holder.nameView.setText(data.getName());
- if (data.isFirstOpen() && !data.isLoading()) {
- holder.firstOpenDot.setVisibility(View.VISIBLE);
- } else {
- holder.firstOpenDot.setVisibility(View.INVISIBLE);
+ if(!data.isHook()) {
+ if (data.isFirstOpen() && !data.isLoading()) {
+ holder.firstOpenDot.setVisibility(View.VISIBLE);
+ } else {
+ holder.firstOpenDot.setVisibility(View.INVISIBLE);
+ }
+ holder.isHookIcon.setVisibility(View.INVISIBLE);
}
+ else{
+ holder.isHookIcon.setVisibility(View.VISIBLE);
+ }
+
holder.itemView.setBackgroundColor(holder.color);
holder.itemView.setOnClickListener(v -> {
if (mAppClickListener != null) {
@@ -172,13 +180,15 @@ public class ViewHolder extends RecyclerView.ViewHolder {
TextView nameView;
LabelView spaceLabelView;
View firstOpenDot;
+ ImageView isHookIcon;
ViewHolder(View itemView) {
super(itemView);
- iconView = (LauncherIconView) itemView.findViewById(R.id.item_app_icon);
- nameView = (TextView) itemView.findViewById(R.id.item_app_name);
+ iconView = (LauncherIconView) itemView.findViewById(R.id.item_app_icon_launcher);
+ nameView = (TextView) itemView.findViewById(R.id.item_app_name_launcher);
spaceLabelView = (LabelView) itemView.findViewById(R.id.item_app_space_idx);
firstOpenDot = itemView.findViewById(R.id.item_first_open_dot);
+ isHookIcon = (ImageView)itemView.findViewById(R.id.item_app_ishook_launcher);
}
}
}
diff --git a/VirtualApp/app/src/main/java/io/virtualapp/home/models/AddAppButton.java b/VirtualApp/app/src/main/java/io/virtualapp/home/models/AddAppButton.java
index a99af813d..9e4c6ef2f 100644
--- a/VirtualApp/app/src/main/java/io/virtualapp/home/models/AddAppButton.java
+++ b/VirtualApp/app/src/main/java/io/virtualapp/home/models/AddAppButton.java
@@ -34,7 +34,7 @@ public Drawable getIcon() {
@Override
public String getName() {
- return "Add App";
+ return "Add";
}
@Override
@@ -56,4 +56,9 @@ public boolean canDelete() {
public boolean canCreateShortcut() {
return false;
}
+
+ @Override
+ public boolean isHook() {
+ return false;
+ }
}
diff --git a/VirtualApp/app/src/main/java/io/virtualapp/home/models/AppData.java b/VirtualApp/app/src/main/java/io/virtualapp/home/models/AppData.java
index b2759951f..66169dbb5 100644
--- a/VirtualApp/app/src/main/java/io/virtualapp/home/models/AppData.java
+++ b/VirtualApp/app/src/main/java/io/virtualapp/home/models/AppData.java
@@ -23,4 +23,6 @@ public interface AppData {
boolean canDelete();
boolean canCreateShortcut();
+
+ boolean isHook();
}
diff --git a/VirtualApp/app/src/main/java/io/virtualapp/home/models/AppInfo.java b/VirtualApp/app/src/main/java/io/virtualapp/home/models/AppInfo.java
index bde5666c9..8659baaac 100644
--- a/VirtualApp/app/src/main/java/io/virtualapp/home/models/AppInfo.java
+++ b/VirtualApp/app/src/main/java/io/virtualapp/home/models/AppInfo.java
@@ -13,4 +13,5 @@ public class AppInfo {
public Drawable icon;
public CharSequence name;
public int cloneCount;
+ public boolean isHook;
}
diff --git a/VirtualApp/app/src/main/java/io/virtualapp/home/models/AppInfoLite.java b/VirtualApp/app/src/main/java/io/virtualapp/home/models/AppInfoLite.java
index b2ad022a6..5b9333b65 100644
--- a/VirtualApp/app/src/main/java/io/virtualapp/home/models/AppInfoLite.java
+++ b/VirtualApp/app/src/main/java/io/virtualapp/home/models/AppInfoLite.java
@@ -23,17 +23,20 @@ public AppInfoLite[] newArray(int size) {
public String packageName;
public String path;
public boolean fastOpen;
+ public boolean isHook;
- public AppInfoLite(String packageName, String path, boolean fastOpen) {
+ public AppInfoLite(String packageName, String path, boolean fastOpen, boolean isHook) {
this.packageName = packageName;
this.path = path;
this.fastOpen = fastOpen;
+ this.isHook = isHook;
}
protected AppInfoLite(Parcel in) {
this.packageName = in.readString();
this.path = in.readString();
this.fastOpen = in.readByte() != 0;
+ this.isHook = in.readByte() != 0;
}
@Override
@@ -46,5 +49,6 @@ public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.packageName);
dest.writeString(this.path);
dest.writeByte(this.fastOpen ? (byte) 1 : (byte) 0);
+ dest.writeByte(this.isHook ? (byte) 1 : (byte) 0);
}
}
diff --git a/VirtualApp/app/src/main/java/io/virtualapp/home/models/EmptyAppData.java b/VirtualApp/app/src/main/java/io/virtualapp/home/models/EmptyAppData.java
index 6a3b05311..f8d008c97 100644
--- a/VirtualApp/app/src/main/java/io/virtualapp/home/models/EmptyAppData.java
+++ b/VirtualApp/app/src/main/java/io/virtualapp/home/models/EmptyAppData.java
@@ -47,4 +47,9 @@ public boolean canDelete() {
public boolean canCreateShortcut() {
return false;
}
+
+ @Override
+ public boolean isHook() {
+ return false;
+ }
}
diff --git a/VirtualApp/app/src/main/java/io/virtualapp/home/models/MultiplePackageAppData.java b/VirtualApp/app/src/main/java/io/virtualapp/home/models/MultiplePackageAppData.java
index 9785be668..ec5d556c9 100644
--- a/VirtualApp/app/src/main/java/io/virtualapp/home/models/MultiplePackageAppData.java
+++ b/VirtualApp/app/src/main/java/io/virtualapp/home/models/MultiplePackageAppData.java
@@ -17,6 +17,7 @@ public class MultiplePackageAppData implements AppData {
public boolean isLoading;
public Drawable icon;
public String name;
+ public boolean isHook;
public MultiplePackageAppData(PackageAppData target, int userId) {
this.userId = userId;
@@ -29,6 +30,7 @@ public MultiplePackageAppData(PackageAppData target, int userId) {
}
}
name = target.name;
+ isHook = target.isHook;
}
@Override
@@ -70,4 +72,9 @@ public boolean canDelete() {
public boolean canCreateShortcut() {
return true;
}
+
+ @Override
+ public boolean isHook() {
+ return isHook;
+ }
}
diff --git a/VirtualApp/app/src/main/java/io/virtualapp/home/models/PackageAppData.java b/VirtualApp/app/src/main/java/io/virtualapp/home/models/PackageAppData.java
index d65acf3c7..1fe5fe188 100644
--- a/VirtualApp/app/src/main/java/io/virtualapp/home/models/PackageAppData.java
+++ b/VirtualApp/app/src/main/java/io/virtualapp/home/models/PackageAppData.java
@@ -18,10 +18,12 @@ public class PackageAppData implements AppData {
public boolean fastOpen;
public boolean isFirstOpen;
public boolean isLoading;
+ public boolean isHook;
public PackageAppData(Context context, InstalledAppInfo installedAppInfo) {
this.packageName = installedAppInfo.packageName;
this.isFirstOpen = !installedAppInfo.isLaunched(0);
+ this.isHook = installedAppInfo.isHook;
loadData(context, installedAppInfo.getApplicationInfo(installedAppInfo.getInstalledUsers()[0]));
}
@@ -80,4 +82,9 @@ public boolean canDelete() {
public boolean canCreateShortcut() {
return true;
}
+
+ @Override
+ public boolean isHook() {
+ return isHook;
+ }
}
diff --git a/VirtualApp/app/src/main/java/io/virtualapp/home/repo/AppRepository.java b/VirtualApp/app/src/main/java/io/virtualapp/home/repo/AppRepository.java
index 308a5df87..dfb12487c 100644
--- a/VirtualApp/app/src/main/java/io/virtualapp/home/repo/AppRepository.java
+++ b/VirtualApp/app/src/main/java/io/virtualapp/home/repo/AppRepository.java
@@ -8,6 +8,7 @@
import com.lody.virtual.GmsSupport;
import com.lody.virtual.client.core.InstallStrategy;
import com.lody.virtual.client.core.VirtualCore;
+import com.lody.virtual.helper.utils.VLog;
import com.lody.virtual.remote.InstallResult;
import com.lody.virtual.remote.InstalledAppInfo;
@@ -60,7 +61,7 @@ public Promise, Throwable, Void> getVirtualApps() {
List infos = VirtualCore.get().getInstalledApps(0);
List models = new ArrayList<>();
for (InstalledAppInfo info : infos) {
- if (!VirtualCore.get().isPackageLaunchable(info.packageName)) {
+ if (!info.isHook && !VirtualCore.get().isPackageLaunchable(info.packageName)) {
continue;
}
PackageAppData data = new PackageAppData(mContext, info);
@@ -101,7 +102,8 @@ private List findAndParseAPKs(Context context, File rootDir, List convertPackageInfoToAppData(Context context, List convertPackageInfoToAppData(Context context, List convertPackageInfoToAppData(Context context, List) adapter);
}
+ */
public void setAdapter(DragSelectRecyclerViewAdapter> adapter) {
super.setAdapter(adapter);
diff --git a/VirtualApp/app/src/main/res/drawable-hdpi/ic_add.png b/VirtualApp/app/src/main/res/drawable-hdpi/ic_add.png
deleted file mode 100644
index 481643ecd..000000000
Binary files a/VirtualApp/app/src/main/res/drawable-hdpi/ic_add.png and /dev/null differ
diff --git a/VirtualApp/app/src/main/res/drawable-xxhdpi/ic_extension_black_24dp.png b/VirtualApp/app/src/main/res/drawable-xxhdpi/ic_extension_black_24dp.png
new file mode 100644
index 000000000..25c6154a1
Binary files /dev/null and b/VirtualApp/app/src/main/res/drawable-xxhdpi/ic_extension_black_24dp.png differ
diff --git a/VirtualApp/app/src/main/res/drawable/fab_bg.xml b/VirtualApp/app/src/main/res/drawable/fab_bg.xml
deleted file mode 100644
index b96b0d477..000000000
--- a/VirtualApp/app/src/main/res/drawable/fab_bg.xml
+++ /dev/null
@@ -1,238 +0,0 @@
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/VirtualApp/app/src/main/res/drawable/home_bg.xml b/VirtualApp/app/src/main/res/drawable/home_bg.xml
deleted file mode 100644
index a3df89ef9..000000000
--- a/VirtualApp/app/src/main/res/drawable/home_bg.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/VirtualApp/app/src/main/res/drawable/icon_bg.xml b/VirtualApp/app/src/main/res/drawable/icon_bg.xml
deleted file mode 100644
index be368e07f..000000000
--- a/VirtualApp/app/src/main/res/drawable/icon_bg.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/VirtualApp/app/src/main/res/drawable/sel_guide_btn.xml b/VirtualApp/app/src/main/res/drawable/sel_guide_btn.xml
deleted file mode 100644
index ec5ae3b50..000000000
--- a/VirtualApp/app/src/main/res/drawable/sel_guide_btn.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/VirtualApp/app/src/main/res/layout/activity_home.xml b/VirtualApp/app/src/main/res/layout/activity_home.xml
index 9c31b7d1e..68b6d72e7 100644
--- a/VirtualApp/app/src/main/res/layout/activity_home.xml
+++ b/VirtualApp/app/src/main/res/layout/activity_home.xml
@@ -22,7 +22,6 @@
fab:layout_heightPercent="12%">
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/VirtualApp/app/src/main/res/layout/activity_splash.xml b/VirtualApp/app/src/main/res/layout/activity_splash.xml
index f70218443..6a49b8e28 100644
--- a/VirtualApp/app/src/main/res/layout/activity_splash.xml
+++ b/VirtualApp/app/src/main/res/layout/activity_splash.xml
@@ -18,7 +18,6 @@
android:textSize="26sp" />
diff --git a/VirtualApp/app/src/main/res/layout/activity_users.xml b/VirtualApp/app/src/main/res/layout/activity_users.xml
deleted file mode 100644
index d62f55b46..000000000
--- a/VirtualApp/app/src/main/res/layout/activity_users.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/VirtualApp/app/src/main/res/layout/fragment_setup.xml b/VirtualApp/app/src/main/res/layout/fragment_setup.xml
deleted file mode 100644
index e8c1c59a9..000000000
--- a/VirtualApp/app/src/main/res/layout/fragment_setup.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/VirtualApp/app/src/main/res/layout/item_app.xml b/VirtualApp/app/src/main/res/layout/item_app.xml
deleted file mode 100644
index dee68d685..000000000
--- a/VirtualApp/app/src/main/res/layout/item_app.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/VirtualApp/app/src/main/res/layout/item_clone_app.xml b/VirtualApp/app/src/main/res/layout/item_clone_app.xml
index f07194729..b6c0a91d5 100644
--- a/VirtualApp/app/src/main/res/layout/item_clone_app.xml
+++ b/VirtualApp/app/src/main/res/layout/item_clone_app.xml
@@ -11,6 +11,13 @@
android:layout_gravity="top|end"
android:src="@drawable/ic_no_check" />
+
+
diff --git a/VirtualApp/app/src/main/res/layout/item_launcher_app.xml b/VirtualApp/app/src/main/res/layout/item_launcher_app.xml
index 1c6460e1f..71783bdaf 100644
--- a/VirtualApp/app/src/main/res/layout/item_launcher_app.xml
+++ b/VirtualApp/app/src/main/res/layout/item_launcher_app.xml
@@ -18,6 +18,13 @@
lv:lv_text="2"
lv:lv_text_size="12sp"/>
+
+
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/VirtualApp/app/src/main/res/menu/user_menu.xml b/VirtualApp/app/src/main/res/menu/user_menu.xml
deleted file mode 100644
index 02f07476a..000000000
--- a/VirtualApp/app/src/main/res/menu/user_menu.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
\ No newline at end of file
diff --git a/VirtualApp/app/src/main/res/values-w820dp/dimens.xml b/VirtualApp/app/src/main/res/values-w820dp/dimens.xml
index 63fc81644..90bf00118 100644
--- a/VirtualApp/app/src/main/res/values-w820dp/dimens.xml
+++ b/VirtualApp/app/src/main/res/values-w820dp/dimens.xml
@@ -2,5 +2,4 @@
- 64dp
diff --git a/VirtualApp/app/src/main/res/values/colors.xml b/VirtualApp/app/src/main/res/values/colors.xml
index 44794929d..dfd1e850d 100644
--- a/VirtualApp/app/src/main/res/values/colors.xml
+++ b/VirtualApp/app/src/main/res/values/colors.xml
@@ -2,31 +2,10 @@
#607191
#2A364C
- #607191
#607191
- #F0DEB7
#2C3B4E
#314155
#324257
- #2a3646
- #33cccc
- #ff9640
- #67e667
- #df38b1
- #ff4040
-
-
- - @color/holo_blue_dark
- - @color/holo_yellow_dark
- - @color/holo_green_dark
- - @color/holo_purple_dark
- - @color/holo_red_dark
-
-
- #00000000
- #55000000
-
- #00FFFFFF
diff --git a/VirtualApp/app/src/main/res/values/dimens.xml b/VirtualApp/app/src/main/res/values/dimens.xml
index e70dede94..45bebe099 100644
--- a/VirtualApp/app/src/main/res/values/dimens.xml
+++ b/VirtualApp/app/src/main/res/values/dimens.xml
@@ -1,22 +1,14 @@
- 16dp
- 16dp
60dp
5dp
30dp
8dp
- 10dp
- 80dp
- 5dp
- 16dp
- 24dp
0.5dp
- 60dp
56dp
diff --git a/VirtualApp/app/src/main/res/values/strings.xml b/VirtualApp/app/src/main/res/values/strings.xml
index f94ccb89d..98984b97e 100644
--- a/VirtualApp/app/src/main/res/values/strings.xml
+++ b/VirtualApp/app/src/main/res/values/strings.xml
@@ -1,13 +1,6 @@
VirtualHook
- Welcome to VirtualHook
- Enter new world
- Please wait…
- Desktop
- Add App
Opening the app…
Delete
Create shortcut
- Install your app to the SandBox
- New User
diff --git a/VirtualApp/build.gradle b/VirtualApp/build.gradle
index ff4ae4a27..606ec46fd 100644
--- a/VirtualApp/build.gradle
+++ b/VirtualApp/build.gradle
@@ -5,7 +5,7 @@ buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:2.3.2'
+ classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'me.tatarka:gradle-retrolambda:3.6.0'
classpath 'com.android.tools.build:gradle-experimental:0.8.0'
// NOTE: Do not place your application dependencies here; they belong
diff --git a/VirtualApp/demoHookPlugin/src/main/AndroidManifest.xml b/VirtualApp/demoHookPlugin/src/main/AndroidManifest.xml
index bc3e30b34..545bd6712 100644
--- a/VirtualApp/demoHookPlugin/src/main/AndroidManifest.xml
+++ b/VirtualApp/demoHookPlugin/src/main/AndroidManifest.xml
@@ -5,6 +5,10 @@
+
diff --git a/VirtualApp/lib/src/main/aidl/com/lody/virtual/server/IPackageManager.aidl b/VirtualApp/lib/src/main/aidl/com/lody/virtual/server/IPackageManager.aidl
index 973cbf7ef..f3133b583 100644
--- a/VirtualApp/lib/src/main/aidl/com/lody/virtual/server/IPackageManager.aidl
+++ b/VirtualApp/lib/src/main/aidl/com/lody/virtual/server/IPackageManager.aidl
@@ -52,6 +52,8 @@ interface IPackageManager {
List queryIntentContentProviders(in Intent intent, String resolvedType, int flags, int userId);
+ String[] getInstalledHookPlugins();
+
VParceledListSlice getInstalledPackages(int flags, int userId);
VParceledListSlice getInstalledApplications(int flags, int userId);
diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java
index 261b9518a..3ed440d97 100644
--- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java
+++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java
@@ -48,6 +48,9 @@
import com.lody.virtual.os.VUserHandle;
import com.lody.virtual.remote.InstalledAppInfo;
import com.lody.virtual.remote.PendingResultData;
+import com.lody.virtual.server.pm.HookCacheManager;
+import com.lody.virtual.server.pm.PackageCacheManager;
+import com.lody.virtual.server.pm.PackageSetting;
import java.io.File;
import java.util.ArrayList;
@@ -313,42 +316,24 @@ private void bindApplicationNoCheck(String packageName, String processName, Cond
ClassLoader targetClassLoader = mInitialApplication.getClassLoader();
try {
- File hookFolder = new File("/sdcard/io.virtualhook");
- for(File hookFile : hookFolder.listFiles()) {
- applyHookPlugin(hookFile, targetClassLoader);
+ for(String pluginName : VPackageManager.get().getInstalledHookPlugins()) {
+ VLog.w("VirtualHook", "Applying hook "+pluginName);
+ applyHookPlugin(VEnvironment.getPackageResourcePath(pluginName).getAbsolutePath(),
+ VEnvironment.getPackageLibPath(pluginName).getAbsolutePath(), targetClassLoader);
}
}
catch (Exception e) {
e.printStackTrace();
}
+
}
- private void applyHookPlugin(File patchApk, ClassLoader appClassLoader) {
+ private void applyHookPlugin(String apkPath, String libPath, ClassLoader appClassLoader) {
HookMain hookMain = new HookMain();
- File libDir = ensureCreated(
- new File(VEnvironment.getDataUserPackageDirectory(VUserHandle.myUserId(), patchApk.getName()), "lib")
- );
-
- try {
- // copy native libraries from patch plugin
- NativeLibraryHelperCompat.copyNativeBinaries(patchApk, libDir);
- // copy libva-native.so so that the symbol MSHookFunction() can be accessed in patch plugin after Android N
- File vaNativeSo = new File(libDir, "libva-native.so");
- if(!vaNativeSo.exists()) {
- FileUtils.createSymlink(
- new File(VirtualCore.get().getContext().getApplicationInfo().dataDir,
- "lib/libva-native.so").getAbsolutePath()
- , vaNativeSo.getAbsolutePath());
- }
- }
- catch (Exception e) {
- e.printStackTrace();
- }
-
- DexClassLoader dexClassLoader = new DexClassLoader(patchApk.getAbsolutePath(),
+ DexClassLoader dexClassLoader = new DexClassLoader(apkPath,
VEnvironment.getDalvikCacheDirectory().getAbsolutePath(),
- libDir.getAbsolutePath(),
+ libPath,
appClassLoader);
hookMain.doHookDefault(dexClassLoader, appClassLoader);
}
diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/InstallStrategy.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/InstallStrategy.java
index 3c868d00b..4d0d6c0f9 100644
--- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/InstallStrategy.java
+++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/InstallStrategy.java
@@ -11,5 +11,6 @@ public interface InstallStrategy {
int COMPARE_VERSION = 0X01 << 3;
int IGNORE_NEW_VERSION = 0x01 << 4;
int DEPEND_SYSTEM_IF_EXIST = 0x01 << 5;
- int SKIP_DEX_OPT = 0x01 << 6;
+// int SKIP_DEX_OPT = 0x01 << 6;
+ int IS_HOOK = 0x01 << 6;
}
diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java
index 1074a7141..30fc8f930 100644
--- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java
+++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java
@@ -318,7 +318,7 @@ public String getMainProcessName() {
*/
public void preOpt(String pkg) throws IOException {
InstalledAppInfo info = getInstalledAppInfo(pkg, 0);
- if (info != null && !info.dependSystem && !info.skipDexOpt) {
+ if (info != null && !info.dependSystem) {
DexFile.loadDex(info.apkPath, info.getOdexFile().getPath(), 0).close();
}
}
diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/client/ipc/VPackageManager.java b/VirtualApp/lib/src/main/java/com/lody/virtual/client/ipc/VPackageManager.java
index 3e49c2825..c8a304103 100644
--- a/VirtualApp/lib/src/main/java/com/lody/virtual/client/ipc/VPackageManager.java
+++ b/VirtualApp/lib/src/main/java/com/lody/virtual/client/ipc/VPackageManager.java
@@ -14,8 +14,11 @@
import android.os.RemoteException;
import com.lody.virtual.client.env.VirtualRuntime;
+import com.lody.virtual.helper.utils.VLog;
+import com.lody.virtual.remote.VParceledListSlice;
import com.lody.virtual.server.IPackageInstaller;
import com.lody.virtual.server.IPackageManager;
+import com.lody.virtual.server.pm.PackageSetting;
import java.util.List;
@@ -111,6 +114,14 @@ public ActivityInfo getReceiverInfo(ComponentName componentName, int flags, int
}
}
+ public String[] getInstalledHookPlugins(){
+ try {
+ return getInterface().getInstalledHookPlugins();
+ } catch (RemoteException e) {
+ return VirtualRuntime.crash(e);
+ }
+ }
+
public List getInstalledPackages(int flags, int userId) {
try {
return getInterface().getInstalledPackages(flags, userId).getList();
diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/os/VEnvironment.java b/VirtualApp/lib/src/main/java/com/lody/virtual/os/VEnvironment.java
index 385f15554..a4b98c29a 100644
--- a/VirtualApp/lib/src/main/java/com/lody/virtual/os/VEnvironment.java
+++ b/VirtualApp/lib/src/main/java/com/lody/virtual/os/VEnvironment.java
@@ -67,6 +67,10 @@ public static File getPackageResourcePath(String packgeName) {
return new File(getDataAppPackageDirectory(packgeName), "base.apk");
}
+ public static File getPackageLibPath(String packgeName) {
+ return new File(getDataAppPackageDirectory(packgeName), "lib");
+ }
+
public static File getDataAppDirectory() {
return ensureCreated(new File(getDataDirectory(), "app"));
}
@@ -143,4 +147,8 @@ public static File getSystemSecureDirectory() {
public static File getPackageInstallerStageDir() {
return ensureCreated(new File(DATA_DIRECTORY, ".session_dir"));
}
+
+ public static File getRoot() {
+ return ROOT;
+ }
}
\ No newline at end of file
diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/remote/InstalledAppInfo.java b/VirtualApp/lib/src/main/java/com/lody/virtual/remote/InstalledAppInfo.java
index 00491f644..fcf414f11 100644
--- a/VirtualApp/lib/src/main/java/com/lody/virtual/remote/InstalledAppInfo.java
+++ b/VirtualApp/lib/src/main/java/com/lody/virtual/remote/InstalledAppInfo.java
@@ -19,15 +19,16 @@ public final class InstalledAppInfo implements Parcelable {
public String apkPath;
public String libPath;
public boolean dependSystem;
- public boolean skipDexOpt;
+// public boolean skipDexOpt;
+ public boolean isHook;
public int appId;
- public InstalledAppInfo(String packageName, String apkPath, String libPath, boolean dependSystem, boolean skipDexOpt, int appId) {
+ public InstalledAppInfo(String packageName, String apkPath, String libPath, boolean dependSystem, boolean isHook, int appId) {
this.packageName = packageName;
this.apkPath = apkPath;
this.libPath = libPath;
this.dependSystem = dependSystem;
- this.skipDexOpt = skipDexOpt;
+ this.isHook = isHook;
this.appId = appId;
}
@@ -58,7 +59,7 @@ public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.apkPath);
dest.writeString(this.libPath);
dest.writeByte(this.dependSystem ? (byte) 1 : (byte) 0);
- dest.writeByte(this.skipDexOpt ? (byte) 1 : (byte) 0);
+ dest.writeByte(this.isHook ? (byte) 1 : (byte) 0);
dest.writeInt(this.appId);
}
@@ -67,7 +68,7 @@ protected InstalledAppInfo(Parcel in) {
this.apkPath = in.readString();
this.libPath = in.readString();
this.dependSystem = in.readByte() != 0;
- this.skipDexOpt = in.readByte() != 0;
+ this.isHook = in.readByte() != 0;
this.appId = in.readInt();
}
diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/HookCacheManager.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/HookCacheManager.java
new file mode 100644
index 000000000..a1329540c
--- /dev/null
+++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/HookCacheManager.java
@@ -0,0 +1,46 @@
+package com.lody.virtual.server.pm;
+
+import com.lody.virtual.helper.collection.ArrayMap;
+import com.lody.virtual.helper.utils.VLog;
+import com.lody.virtual.server.pm.parser.PackageParserEx;
+import com.lody.virtual.server.pm.parser.VPackage;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Created by liuruikai756 on 17/07/2017.
+ */
+
+public class HookCacheManager {
+ static final Set HOOK_PLUGIN_NAME_CACHE = new HashSet<>();
+
+ public static int size() {
+ synchronized (HOOK_PLUGIN_NAME_CACHE) {
+ return HOOK_PLUGIN_NAME_CACHE.size();
+ }
+ }
+
+ public static void put(String packageName) {
+ synchronized (HookCacheManager.class) {
+ HOOK_PLUGIN_NAME_CACHE.add(packageName);
+ }
+ }
+
+ public static boolean remove(String packageName) {
+ synchronized (HookCacheManager.class) {
+ return HOOK_PLUGIN_NAME_CACHE.remove(packageName);
+ }
+ }
+
+ public static String[] getAll() {
+ synchronized (HookCacheManager.class) {
+ return HOOK_PLUGIN_NAME_CACHE.toArray(new String[HOOK_PLUGIN_NAME_CACHE.size()]);
+ }
+ }
+}
diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/PackageSetting.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/PackageSetting.java
index 1454f0c1d..45d97eaa1 100644
--- a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/PackageSetting.java
+++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/PackageSetting.java
@@ -31,7 +31,8 @@ public PackageSetting[] newArray(int size) {
/**
* In this mode we skip the dex2oat so we can load the class.dex very fast.
*/
- public boolean skipDexOpt;
+// public boolean skipDexOpt;
+ public boolean isHook;
public int appId;
public long firstInstallTime;
public long lastUpdateTime;
@@ -48,11 +49,12 @@ protected PackageSetting(Parcel in) {
this.appId = in.readInt();
//noinspection unchecked
this.userState = in.readSparseArray(PackageUserState.class.getClassLoader());
- this.skipDexOpt = in.readByte() != 0;
+// this.skipDexOpt = in.readByte() != 0;
+ this.isHook = in.readByte() != 0;
}
public InstalledAppInfo getAppInfo() {
- return new InstalledAppInfo(packageName, apkPath, libPath, dependSystem, skipDexOpt, appId);
+ return new InstalledAppInfo(packageName, apkPath, libPath, dependSystem, isHook, appId);
}
PackageUserState modifyUserState(int userId) {
@@ -97,7 +99,8 @@ public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.appId);
//noinspection unchecked
dest.writeSparseArray((SparseArray) this.userState);
- dest.writeByte(this.skipDexOpt ? (byte) 1 : (byte) 0);
+// dest.writeByte(this.skipDexOpt ? (byte) 1 : (byte) 0);
+ dest.writeByte(this.isHook ? (byte)1 : (byte)0);
}
public boolean isLaunched(int userId) {
diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VAppManagerService.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VAppManagerService.java
index 5229cb934..0f63dea45 100644
--- a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VAppManagerService.java
+++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VAppManagerService.java
@@ -111,6 +111,9 @@ private boolean loadPackageInnerLocked(PackageSetting ps) {
chmodPackageDictionary(cacheFile);
PackageCacheManager.put(pkg, ps);
BroadcastSystem.get().startApp(pkg);
+ if(ps.isHook) {
+ HookCacheManager.put(ps.packageName);
+ }
return true;
}
@@ -143,7 +146,8 @@ public synchronized InstallResult installPackage(String path, int flags, boolean
if (path == null) {
return InstallResult.makeFailure("path = NULL");
}
- boolean skipDexOpt = (flags & InstallStrategy.SKIP_DEX_OPT) != 0;
+// boolean skipDexOpt = (flags & InstallStrategy.SKIP_DEX_OPT) != 0;
+ boolean isHook = (flags & InstallStrategy.IS_HOOK) != 0;
File packageFile = new File(path);
if (!packageFile.exists() || !packageFile.isFile()) {
return InstallResult.makeFailure("Package File is not exist.");
@@ -177,7 +181,12 @@ public synchronized InstallResult installPackage(String path, int flags, boolean
if (res.isUpdate) {
FileUtils.deleteDir(libDir);
VEnvironment.getOdexFile(pkg.packageName).delete();
- VActivityManagerService.get().killAppByPkg(pkg.packageName, VUserHandle.USER_ALL);
+ if(isHook) {
+ VActivityManagerService.get().killAllApps();
+ }
+ else {
+ VActivityManagerService.get().killAppByPkg(pkg.packageName, VUserHandle.USER_ALL);
+ }
}
if (!libDir.exists() && !libDir.mkdirs()) {
return InstallResult.makeFailure("Unable to create lib dir.");
@@ -190,6 +199,21 @@ public synchronized InstallResult installPackage(String path, int flags, boolean
}
NativeLibraryHelperCompat.copyNativeBinaries(new File(path), libDir);
+ try {
+ // copy libva-native.so so that the symbol MSHookFunction() can be accessed in patch plugin after Android N
+ if(Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
+ File vaNativeSo = new File(libDir, "libva-native.so");
+ if (!vaNativeSo.exists()) {
+ FileUtils.createSymlink(
+ new File(VEnvironment.getRoot().getParent(), "lib/libva-native.so").getAbsolutePath(),
+ vaNativeSo.getAbsolutePath());
+ }
+ }
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+
if (!dependSystem) {
File privatePackageFile = new File(appDir, "base.apk");
File parentFolder = privatePackageFile.getParentFile();
@@ -216,7 +240,7 @@ public synchronized InstallResult installPackage(String path, int flags, boolean
} else {
ps = new PackageSetting();
}
- ps.skipDexOpt = skipDexOpt;
+ ps.isHook = isHook;
ps.dependSystem = dependSystem;
ps.apkPath = packageFile.getPath();
ps.libPath = libDir.getPath();
@@ -232,11 +256,15 @@ public synchronized InstallResult installPackage(String path, int flags, boolean
ps.setUserState(userId, false/*launched*/, false/*hidden*/, installed);
}
}
+
PackageParserEx.savePackageCache(pkg);
PackageCacheManager.put(pkg, ps);
mPersistenceLayer.save();
BroadcastSystem.get().startApp(pkg);
- if (notify) {
+ if(isHook) {
+ HookCacheManager.put(ps.packageName);
+ }
+ else if (notify) {
notifyAppInstalled(ps, -1);
}
res.isSuccess = true;
@@ -330,7 +358,12 @@ private void uninstallPackageFully(PackageSetting ps) {
String packageName = ps.packageName;
try {
BroadcastSystem.get().stopApp(packageName);
- VActivityManagerService.get().killAppByPkg(packageName, VUserHandle.USER_ALL);
+ if(ps.isHook) {
+ VActivityManagerService.get().killAllApps();
+ }
+ else {
+ VActivityManagerService.get().killAppByPkg(packageName, VUserHandle.USER_ALL);
+ }
VEnvironment.getPackageResourcePath(packageName).delete();
FileUtils.deleteDir(VEnvironment.getDataAppPackageDirectory(packageName));
VEnvironment.getOdexFile(packageName).delete();
@@ -338,6 +371,7 @@ private void uninstallPackageFully(PackageSetting ps) {
FileUtils.deleteDir(VEnvironment.getDataUserPackageDirectory(id, packageName));
}
PackageCacheManager.remove(packageName);
+ HookCacheManager.remove(packageName);
} catch (Exception e) {
e.printStackTrace();
} finally {
diff --git a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VPackageManagerService.java b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VPackageManagerService.java
index 0ba201b9f..4c778c14f 100644
--- a/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VPackageManagerService.java
+++ b/VirtualApp/lib/src/main/java/com/lody/virtual/server/pm/VPackageManagerService.java
@@ -22,6 +22,7 @@
import com.lody.virtual.client.fixer.ComponentFixer;
import com.lody.virtual.client.stub.StubManifest;
import com.lody.virtual.helper.compat.ObjectsCompat;
+import com.lody.virtual.helper.utils.VLog;
import com.lody.virtual.os.VUserHandle;
import com.lody.virtual.remote.VParceledListSlice;
import com.lody.virtual.server.IPackageInstaller;
@@ -38,6 +39,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.atomic.AtomicReference;
import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
@@ -95,7 +97,6 @@ public int compare(ProviderInfo p1, ProviderInfo p2) {
private final Map mPackages = PackageCacheManager.PACKAGE_CACHE;
-
public VPackageManagerService() {
Intent intent = new Intent();
intent.setClassName(VirtualCore.get().getHostPkg(), StubManifest.RESOLVER_ACTIVITY);
@@ -605,6 +606,10 @@ public VParceledListSlice queryContentProviders(String processName
return new VParceledListSlice<>(finalList);
}
+ public String[] getInstalledHookPlugins(){
+ return HookCacheManager.getAll();
+ }
+
@Override
public VParceledListSlice getInstalledPackages(int flags, int userId) {
checkUserId(userId);
diff --git a/VirtualApp/lib/src/main/res/layout/app_not_authorized.xml b/VirtualApp/lib/src/main/res/layout/app_not_authorized.xml
deleted file mode 100644
index c7e936172..000000000
--- a/VirtualApp/lib/src/main/res/layout/app_not_authorized.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/VirtualApp/lib/src/main/res/layout/choose_type_and_account.xml b/VirtualApp/lib/src/main/res/layout/choose_type_and_account.xml
index 08e7bf1d8..6c561f36f 100644
--- a/VirtualApp/lib/src/main/res/layout/choose_type_and_account.xml
+++ b/VirtualApp/lib/src/main/res/layout/choose_type_and_account.xml
@@ -35,7 +35,6 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -55,37 +39,21 @@
style="@style/notification_layout"
android:orientation="horizontal">
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -93,37 +61,21 @@
style="@style/notification_layout"
android:orientation="horizontal">
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -131,37 +83,21 @@
style="@style/notification_layout"
android:orientation="horizontal">
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/VirtualApp/lib/src/main/res/values/dimens.xml b/VirtualApp/lib/src/main/res/values/dimens.xml
index 13112817b..8d973ca38 100644
--- a/VirtualApp/lib/src/main/res/values/dimens.xml
+++ b/VirtualApp/lib/src/main/res/values/dimens.xml
@@ -1,8 +1,6 @@
- -1px
- 416dp
-
+
64dp
8dp
diff --git a/VirtualApp/lib/src/main/res/values/strings.xml b/VirtualApp/lib/src/main/res/values/strings.xml
index 94c2d04ff..93529f65e 100644
--- a/VirtualApp/lib/src/main/res/values/strings.xml
+++ b/VirtualApp/lib/src/main/res/values/strings.xml
@@ -1,10 +1,8 @@
:x
- VirtualPackage Installer
Admin
Choose
- Chooser is Empty
No find applications
Add account