1 有源碼給app添加水印
使用java可以適配更多的apk,如果使用koltin一些老的apk就會有適配問題
通過registerActivityLifecycleCallbacks拿到activity對象設置水印
在application里面registerActivityLifecycleCallbacks就行
static class MyActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks {@Overridepublic void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {android.util.Log.e("MyAppComponentFactory","onActivityCreated--------" + activity.getComponentName());activity.getWindow().getDecorView().postDelayed(new Runnable() {@Overridepublic void run() {showWatermarkView(activity);}}, 300);}@Overridepublic void onActivityStarted(@NonNull Activity activity) {}@Overridepublic void onActivityResumed(@NonNull Activity activity) {}@Overridepublic void onActivityPaused(@NonNull Activity activity) {}@Overridepublic void onActivityStopped(@NonNull Activity activity) {}@Overridepublic void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {}@Overridepublic void onActivityDestroyed(@NonNull Activity activity) {}private void showWatermarkView(Activity activity) {ViewGroup decorView = activity.getWindow().getDecorView().findViewById(android.R.id.content);if (decorView.findViewWithTag("TOP_BG") == null) {ImageView topBg = new ImageView(activity);topBg.setTag("TOP_BG");topBg.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));topBg.setScaleType(ImageView.ScaleType.CENTER_CROP);
// topBg.setBackground(new WaterMarkBgView(activity, Arrays.asList("Test"), -30, 14));topBg.setClickable(false);topBg.setFocusable(false);topBg.setFocusableInTouchMode(false);decorView.addView(topBg);}}}
}
無源碼給apk添加
自定義AppComponentFactory并拿到application對象并調用registerActivityLifecycleCallbacks,
public class MyAppComponentFactory extends android.app.AppComponentFactory{@NonNullpublic Application instantiateApplication(ClassLoader cl, String className) throws InstantiationException, IllegalAccessException, ClassNotFoundException {Class<?> c = cl.loadClass(className);Application app = (Application) c.newInstance();app.registerActivityLifecycleCallbacks(new MyActivityLifecycleCallbacks());return app;}static class MyActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks {@Overridepublic void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {android.util.Log.e("MyAppComponentFactory","onActivityCreated--------" + activity.getComponentName());activity.getWindow().getDecorView().postDelayed(new Runnable() {@Overridepublic void run() {showWatermarkView(activity);}}, 300);}@Overridepublic void onActivityStarted(@NonNull Activity activity) {}@Overridepublic void onActivityResumed(@NonNull Activity activity) {}@Overridepublic void onActivityPaused(@NonNull Activity activity) {}@Overridepublic void onActivityStopped(@NonNull Activity activity) {}@Overridepublic void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {}@Overridepublic void onActivityDestroyed(@NonNull Activity activity) {}private void showWatermarkView(Activity activity) {ViewGroup decorView = activity.getWindow().getDecorView().findViewById(android.R.id.content);if (decorView.findViewWithTag("TOP_BG") == null) {ImageView topBg = new ImageView(activity);topBg.setTag("TOP_BG");topBg.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));topBg.setScaleType(ImageView.ScaleType.CENTER_CROP);
// topBg.setBackground(new WaterMarkBgView(activity, Arrays.asList("Test"), -30, 14));topBg.setClickable(false);topBg.setFocusable(false);topBg.setFocusableInTouchMode(false);decorView.addView(topBg);}}}
}
修改AndroidManifest application標簽
android:appComponentFactory=".MyAppComponentFactory"回編譯
直接修改smali文件
先把添加水印功能寫到一個java文件中,然后編譯得到.smali文件,把文件放到需要添加的apk翻遍后的代碼中,找到Application類并在onCreate()中調用添加水印功能,這些步驟可以通過python完成