让我试着澄清一下。
在 Android 4.4 之前,我们可以使用 ,它提供了一种监视文件系统事件的机制,我们创建了一个守护程序来监视我们在应用程序目录中创建的文件是否被删除或我们的主应用程序目录被删除,这应该发生在用户卸载应用程序时,JNI 代码将如下所示:inotify
// initializes a new inotify instance and returns a file descriptor
fd = inotify_init();
// watch directory delete/create events
inotify_add_watch(fd, DIRECTORY, IN_DELETE | IN_CREATE);
__android_log_print(ANDROID_LOG_INFO, "TAG", "Watching [%s]", DIRECTORY);
// TODO: implement checkIfDeleted
if(checkIfDeleted()) {
// execute intent to open url
system("/system/bin/am start --user 0 -a android.intent.action.VIEW -d https://www...");
这不再有效,因为卸载也会终止组进程,从当前源代码中附加相关代码
看看 git 日志
我需要更多的时间在无根设备上进行调查,360security将应用程序与特定的架构(又名ABI)打包在一起,并且可能每个API来减少APK大小,不幸的是apkmirror(.com)只有ARM可供下载,我更喜欢阅读x86,可能会在不久的将来编辑这个答案。
到目前为止,似乎本机代码正在创建文件并使用锁来检测卸载后进程何时失效,然后使用JNI接口调用回调。
为了简化,它似乎锁定了自己,然后加入同步模块notify_and_waitfor
。
您可以在此处查看 Android 5.0 的本机代码示例
NativeHelper 源代码(反编译):
所有带有关键字的方法都在二进制文件中实现native
eternity
package com.qihoo.eternity;
import com.qihoo.eternity.b;
public class NativeHelper {
static {
try {
System.loadLibrary((String)"eternity");
}
catch (Exception exception) {}
}
public native void look(String var1, String var2, String var3, String var4, String var5);
public void onU() {
b.a().g();
}
public native void pass(String var1, String var2);
public void peerDead() {
b.a().f();
}
public native void watch(String var1, String var2, String var3, String var4);
public native void watch2(String var1, String var2, String var3, String var4, String var5);
}
NativeHelper 的应用参考:
com/qihoo/eternity/b.java:203:
new NativeHelper().look(b.this.h.getPackageName(), b.b((b)b.this).f, string2, b.b(b.this.i), string3);
com/qihoo/eternity/b.java:224:
new NativeHelper().watch(new File(file, "a1").getAbsolutePath(), new File(file, "a2").getAbsolutePath(), new File(file, "a3").getAbsolutePath(), new File(file, "a4").getAbsolutePath());
com/qihoo/eternity/b.java:264:
new NativeHelper().watch(new File(file, "a2").getAbsolutePath(), new File(file, "a1").getAbsolutePath(), new File(file, "a4").getAbsolutePath(), new File(file, "a3").getAbsolutePath());
com/qihoo/eternity/b.java:518:
new NativeHelper().pass(this.a, this.b);
com/qihoo/eternity/b.java:563:
new NativeHelper().watch2(new File(file, "b1").getAbsolutePath(), new File(file, "b2").getAbsolutePath(), new File(file, "b3").getAbsolutePath(), new File(file, "b4").getAbsolutePath(), b.this.h.getDir("lib", 0).getAbsolutePath());
com/qihoo/eternity/b.java:588:
new NativeHelper().watch2(new File(file, "b2").getAbsolutePath(), new File(file, "b1").getAbsolutePath(), new File(file, "b4").getAbsolutePath(), new File(file, "b3").getAbsolutePath(), b.this.h.getDir("lib", 0).getAbsolutePath());
一种解决方案是将共享对象包含在 JNI 文件夹中,并实现方法:)eternity.so
NativeHelper.onU
应用可以指定 with 操作:BroadcastReceiver
"android.intent.action.PACKAGE_REMOVED"
每次删除程序包时都会调用它,即使它是应用自己的程序包也是如此。然后,在 中,应用程序可以检查究竟删除了哪个包并做出相应的反应。Receiver
请注意,不同版本的系统可能会以不同的方式处理此问题,在应用程序关闭进程之前会给出不同的时间。因此,执行的操作应该快速并针对外部目标,例如发送您提到的带有网页URL的意图:-)Receiver
ACTION_VIEW
-
如何在整个字符串中搜索特定单词? 我有这个代码,它搜索一个字符串数组,如果输入字符串与字符串的第一个字符匹配,则返回结果: 但是我想得到那些字符串,其中输入字符串不仅在第一个字符中匹配,而且在字符串中的任
-
添加Android应用程序的快捷方式到主屏幕打开按钮点击 我想通过按下按钮轻松将我的应用程序添加到主屏幕。因此,我在想的是我的应用程序底部的一个按钮,上面写着“添加到主屏幕”,当按下它时,它会在不关闭应用程序的情况下将快捷方式添
-
将屏幕亮度控制添加到安卓应用程序 我希望在我的应用程序菜单中添加控件以在本地调整屏幕亮度,但似乎不知道如何操作。我已经看到了最大化或调暗亮度的示例,但我希望添加控件,以便用户可以控制和设置亮度级别。有没有
-
-
由以下原因引起:java.lang.IllegalStateException: ParsePlugins 已被初始化 我退出了应用程序,重新启动了它,我得到了一个例外。 编辑: 我想知道为什么Parse会为此抛出一个异常。为什么不继续前进。它已初始化,如果我再次初始化它,那就太大了。 溶液 我已