dexknife-wj icon indicating copy to clipboard operation
dexknife-wj copied to clipboard

启动插件的BroadcastReceiverr失败

Open linjson opened this issue 6 years ago • 30 comments

linjson avatar Mar 07 '18 01:03 linjson

哪里的广播?什么错误日志

godlikewangjun avatar Mar 07 '18 01:03 godlikewangjun

写在宿主里的androidmanifest.xml

<receiver
            android:name="com.push.XiaoMiPushMessageReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE"/>
            </intent-filter>
            <!--<intent-filter>-->
                <!--<action android:name="com.xiaomi.mipush.ERROR"/>-->
            <!--</intent-filter>-->
        </receiver>

com.push.XiaoMiPushMessageReceiver类在插件里, Application反射后执行onCreate,提示XiaoMiPushMessageReceiver类找不到

linjson avatar Mar 07 '18 01:03 linjson

你这个是分包问题,插件里面有分包功能,你的dex有几个,如果gradle版本 和 demo的不一致的话需要升级插件。暂时可以自己升下级

godlikewangjun avatar Mar 07 '18 01:03 godlikewangjun

分包功能具体是做什么的,跟multiDexEnabled这个一样吗

linjson avatar Mar 07 '18 02:03 linjson

不一样,具体参见说明里面集成的那个插件或者百度自定义分包。

godlikewangjun avatar Mar 07 '18 02:03 godlikewangjun

我在解壳程序中,直接使用demo.apk(里面只包含classes.dex,classes2.dex,classes3.dex),达不到分包加载的效果吗?

linjson avatar Mar 07 '18 02:03 linjson

你推送的包不一定被分到你使用的包中,比如dex1你要使用这个推送,但是推送被分到dex2,现在dex2还没有加载完所以报错。

godlikewangjun avatar Mar 07 '18 02:03 godlikewangjun

Caused by: java.lang.ClassNotFoundException: Didn't find class "com.push.XiaoMiPushMessageReceiver" on path: DexPathList[[zip file "/data/app/com.demo-JbLZGBqAZ3jxaPYr76gbaQ==/base.apk"], 报这个错,感觉写在宿主里的androidmanifest.xml的receiver组件只会从宿主里的dex里找

linjson avatar Mar 07 '18 02:03 linjson

这个错误就是分包的问题,你可以延迟注册推送那些也没有什么影响,如果你不手动分包的话,包太大的话不用这个插件也是一样的效果,已经踩过坑了所以才会集成这个插件。

godlikewangjun avatar Mar 07 '18 02:03 godlikewangjun

可以QQ联系吗, 我用你的Demo测试加固失败了

DEBUG:2018-03-07 11:43:58.(Cmd.java:48): I: Copying unknown files...
DEBUG:2018-03-07 11:43:58.(Cmd.java:48): I: Copying original files...
正在加固
加固失败

BUILD SUCCESSFUL

linjson avatar Mar 07 '18 03:03 linjson

能跟我说下你的插件分包,具体是在哪个类文件里吗,是在加固期间进行的分包吗

linjson avatar Mar 07 '18 05:03 linjson

分包不是强制性了 开启了配置就行。不是在加固期间,编译apk的时候详情可以看项目说明里面集成的分包插件说明。加固是根据apktool来的,如果失败可能是apktool反编译不了。还有事没有配置对,没有编译不存在apk不能加固。

godlikewangjun avatar Mar 07 '18 05:03 godlikewangjun

代码跟踪

 /**
     * 加固
     * @param decompileDir
     * @return
     */
    private static boolean jiagu(File decompileDir) {
        if (!jiaguZip.exists()) {
            if (!JIAGU_ZIP_PATH.contains(":")) {
                if (!ClassHelper.releaseResourceToFile(JIAGU_ZIP_PATH, jiaguZip)) {
                    return false;
                }
        .......
    }

是因为ClassHelper.releaseResourceToFile这个返回false,里面应该是取资源为null了

linjson avatar Mar 07 '18 06:03 linjson

加固的jiagu.zip你填对了吗

godlikewangjun avatar Mar 07 '18 06:03 godlikewangjun

你是指jiagu.zip生成的是否正确吗?

 
        UpdateJiaGuTask task = new UpdateJiaGuTask();
        AppManager.APKTOOLJARPATH="/Volumes/project/github/dexknife-wj/apktool.jar";

        task.setProjectDir(new File("/Volumes/project/github/dexknife-wj/myapplication/build/outputs/apk/myapplication-debug.apk"));

        String packagePath = JiaGu.class.getPackage().getName().replaceAll("\\.", "/");
        task.addOutFile(new File("/Volumes/project/github/dexknife-wj/" + UpdateJiaGuTask.JIAGU_ZIP));

        task.execute();
    

有生成成功

linjson avatar Mar 07 '18 06:03 linjson

生成后的jiagu.zip里面只有smali,libs两个文件夹

linjson avatar Mar 07 '18 06:03 linjson

你看看配置的jiagu.zip的文件路径对不对

godlikewangjun avatar Mar 07 '18 06:03 godlikewangjun

路径是对的,文件路径是copy的

linjson avatar Mar 07 '18 06:03 linjson

教我怎么处理分包吧,不然BroadcastReceiver这个老找不到,好苦恼

linjson avatar Mar 07 '18 06:03 linjson

https://github.com/TangXiaoLv/Android-Easy-MultiDex 是集成了这个插件

godlikewangjun avatar Mar 07 '18 06:03 godlikewangjun

我的应用共3个classes.dex,分包成功了,BroadcastReceiver在classes.dex文件里,但还是报


Caused by: java.lang.ClassNotFoundException: Didn't find class 

"com.push.XiaoMiPushMessageReceiver" on path: DexPathList[[zip file "/data/app/com.demo-

JbLZGBqAZ3jxaPYr76gbaQ==/base.apk"],

感觉写在宿主里的androidmanifest.xml的receiver组件还是会从宿主里的dex里找

linjson avatar Mar 07 '18 07:03 linjson

BroadcastReceiver类该不会是要分包到宿主里的dex吧?

linjson avatar Mar 07 '18 08:03 linjson

。。。。。难道你写到壳项目里面的吗?

godlikewangjun avatar Mar 07 '18 08:03 godlikewangjun

BroadcastReceiver类吗?没啊,我是写在插件里的

linjson avatar Mar 07 '18 08:03 linjson

apk能发下吗?我看看

godlikewangjun avatar Mar 07 '18 08:03 godlikewangjun

公司的项目不太方便发

linjson avatar Mar 07 '18 08:03 linjson

本来想用你的DEMO,但死活没加固成功

linjson avatar Mar 07 '18 08:03 linjson

那你就只有自己找看看 我用的时候没有出现过。demo我刚才看了,运行了没有问题。。。你是不是改了什么,不要升级gradle目前支持3.x的,版本还没有更新

godlikewangjun avatar Mar 07 '18 08:03 godlikewangjun

我用的是 classpath 'com.library.wj:dexknife-wj:1.1.1'//分包

linjson avatar Mar 07 '18 08:03 linjson

加个Q吧,我的1714537224,我把你改完DEMO发你

linjson avatar Mar 07 '18 08:03 linjson