jasonross / nuwa Goto Github PK
View Code? Open in Web Editor NEWNuwa, pure java implementation, can hotfix your android application.
Nuwa, pure java implementation, can hotfix your android application.
rt
application继承的是MultiDexApplication,内部使用了静态变量okhttp 声明: public static final OkHttpClient client = new OkHttpClient();
然后就报错了
如题
编译出的apk包在Android 6.0上无法安装,直接通过Android studio 运行的程序可以运行,且运行正常。5.0上也能正常。只提示应用无法安装。
请问这个apk是在里面起什么作用
distributionUrl=https://services.gradle.org/distributions/gradle-2.4-all.zip
将版本换成 2.8会有问题吗
如题
classpath 'com.android.tools.build:gradle:1.5.0'
nvwa ? nuwa ?
并没有生成patch.jar
有的时候会生成一个a.class 反编译之后 发现就是修复bug 后的类 但并没有生成jar
mac win都是一样
使用1.5.0版本的com.android.tools.build:gradle时,调用apply plugin: "cn.jiajixin.nuwa"会提示
Error:Cannot get property 'taskDependencies' on null object
回滚到1.3.1后没有问题。
根据Qzone那篇原始文章里面描述,需要对直接引用Hello的类(Sample中的MainActivity)进行消除CLASS_ISPREVERIFIED的操作,但在生成的patch.jar去只看到Hello本身的Hack字节码插入,这其中是什么原理?
这个项目可以用作插件式开发吗?
reference MultiDex
如果做的是一个sdk的话
apply plugin: 'com.android.library',再声明apply plugin: "cn.jiajixin.nuwa"
就会报如下错
Could not find property 'applicationVariants' on com.android.build.gradle.LibraryExtension_Decorated@6de81701.
望解答
hudepeideMacBook-Pro:Nuwa-master HuDP$ ./gradlew clean nuwaDebugPatch -P NuwaDir=/Users/HuDP/Documents/nuwa
/Users/HuDP/Documents/nuwa/xiaomi/debug/mapping.txt does not exist
/Users/HuDP/Documents/nuwa/xiaomi/debug/hash.txt does not exist
/Users/HuDP/Documents/nuwa/xiaomi/release/mapping.txt does not exist
/Users/HuDP/Documents/nuwa/xiaomi/release/hash.txt does not exist
/Users/HuDP/Documents/nuwa/qihoo/release/mapping.txt does not exist
/Users/HuDP/Documents/nuwa/qihoo/release/hash.txt does not exist
FAILURE: Build failed with an exception.
BUILD FAILED
Total time: 6.76 secs
RT
Andfix已经对安全和版本管理做的不错了。dodola有兴趣一起搞啊
使用sdk 报这个错误是什么原因
Error:Execution failed for task ':app:nuwaClassBeforeDexBaidushoujizhushouDebug'.
1
在ART会编译成native代码。
但是如果只发布部分代码的话,编译时是没办法进行内存地址定位的。
ART模式下也会分为解释执行与ART native模式执行,如果只是走解释执行,就还是按照原来dalvik的模式走的,用的符号引用,没问题,但一旦ART模式,比如你用handler调用你的补丁文件,内存地址就飞了,必定报错。
解决方式:从理论上来说,只发布部分class是不行的,整个dex必须都要作为patch...
可能作者的这套还没经过多少实际应用吧,其实还有很多的坑在里面,这套机制的局限性还有很多。
比如Application,provider等里面千万不能引用其他的class,android:process的处理等
另外windows下的cygwin中使用貌似也不行
15:01:56.333 [ERROR] [org.gradle.BuildExceptionReporter] Caused by: java.lang.ArrayIndexOutOfBoundsException: 1
15:01:56.333 [ERROR] [org.gradle.BuildExceptionReporter] at cn.jiajixin.nuwa.NuwaPlugin$_apply_closure1_closure2_closure9_closure12.doCall(NuwaPlugin.groovy:127)
15:01:56.333 [ERROR] [org.gradle.BuildExceptionReporter] at cn.jiajixin.nuwa.NuwaPlugin$_apply_closure1_closure2_closure9.doCall(NuwaPlugin.groovy:121)
15:01:56.333 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.AbstractTask$ClosureTaskAction.execute(AbstractTask.java:558)
15:01:56.333 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.AbstractTask$ClosureTaskAction.execute(AbstractTask.java:539)
15:01:56.334 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.tasks.TaskMutator$1.execute(TaskMutator.java:77)
15:01:56.334 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.tasks.TaskMutator$1.execute(TaskMutator.java:73)
15:01:56.334 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
15:01:56.334 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
15:01:56.334 [ERROR] [org.gradle.BuildExceptionReporter] ... 57 more
15:01:56.334 [ERROR] [org.gradle.BuildExceptionReporter]
FAILURE: Build failed with an exception.
What went wrong:
A problem occurred configuring project ':sample'.
Could not find property 'property' on project ':sample'.
Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
@jasonross 我在阿里云移动测试平台上面对Nuwa做了下兼容性测试,发现有个特定的机型补丁打了没起效果:http://mqc.aliyun.com。 机器型号是 三星 SM-N9108V 4.4.4 1440x2560 armeabi-v7a。下了logcat的输出文件看了一下,发现hack.dex和patch.dex都已经被成功解压放进了工程目录。有点怀疑dex载入顺序在某个节点被系统给重置回去了。
dalvikvm: Class resolved by unexpected DEX: Lcom/nashxk/MyApplication;(0xa54393b0):0x979f1000 ref [Lcom/nashxk/umeng/Umeng;] Lcom/nashxk/umeng/Umeng;(0xa54393b0):0x97874000
dalvikvm: (Lcom/nashxk/MyApplication; had used a different Lcom/nashxk/umeng/Umeng; during pre-verification)
AndroidRuntime: Shutting down VM
dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xa4b96648)
AndroidRuntime: FATAL EXCEPTION: main
java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
at com.nashxk.MyApplication.onCreate(Unknown Source)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4444)
at android.app.ActivityThread.access$1300(ActivityThread.java:141)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
打正式版的包有了mapping.txt文件,补丁是按照demo那样打的。但是再次进应用的时候出现了这样的问题。
E/nuwa: inject /data/data/com.android.benlailife.activity/files/nuwa/hack.apk failed
E/dalvikvm: Could not find class 'cn.jiajixin.nuwa.Hack'
这个是因为什么原因引起的
集成nuwa后build出错,环境和nuwaSample配置一样。
使用命令:gradlew clean --stacktrace --debug
11:57:29.507 [ERROR] [org.gradle.BuildExceptionReporter] Execution failed for ta
sk ':chinaaccassistant:nuwaClassBeforeDexDebug'.
11:57:29.509 [ERROR] [org.gradle.BuildExceptionReporter] > 1
11:57:29.513 [ERROR] [org.gradle.BuildExceptionReporter]
11:57:29.516 [ERROR] [org.gradle.BuildExceptionReporter] * Exception is:
11:57:29.519 [ERROR] [org.gradle.BuildExceptionReporter] org.gradle.api.tasks.Ta
skExecutionException: Execution failed for task ':chinaaccassistant:nuwaClassBef
oreDexDebug'.
11:57:29.523 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.ap
i.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActi
onsTaskExecuter.java:69)
11:57:29.526 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.ap
i.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTask
Executer.java:46)
11:57:29.528 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.ap
i.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecuti
onAnalysisTaskExecuter.java:35)
11:57:29.531 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.ap
i.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExec
uter.java:64)
11:57:29.534 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.ap
i.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter
.java:58)
11:57:29.537 [ERROR] [org.gradle.BuildExceptionReporter] at org.gradle.ap
i.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySou
rceFilesTaskExecuter.java:52)
11:57:29.700 [ERROR] [org.gradle.BuildExceptionReporter] ... 57 more
11:57:29.702 [ERROR] [org.gradle.BuildExceptionReporter]
11:57:29.706 [LIFECYCLE] [org.gradle.BuildResultLogger]
11:57:29.708 [LIFECYCLE] [org.gradle.BuildResultLogger] BUILD FAILED
11:57:29.712 [LIFECYCLE] [org.gradle.BuildResultLogger]
11:57:29.715 [LIFECYCLE] [org.gradle.BuildResultLogger] Total time: 45.529 secs
11:57:29.732 [INFO] [org.gradle.api.Project] PREDEX CACHE HITS: 0
11:57:29.735 [INFO] [org.gradle.api.Project] PREDEX CACHE MISSES: 3
我将gradle版本修改为1.5后:classpath 'com.android.tools.build:gradle:1.5.0'
项目会报这个错 Error:Cannot get property 'taskDependencies' on null object
导致项目初始化失败!
按照readme中的步骤集成Nuwa后,运行报异常:
Error:Execution failed for task':app:nuwaClassBeforeDexDebug'.> 1
用到修改的类时一直报 java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation 这个错误
为什么我用dx --dex --output=patch.apk patch生成的apk文件中没有dex文件呢。
不会生成classes.dex
打补丁的时候还需要准备一个excludeClass的列表比较麻烦,感觉可以在类里面增加一个标志,执行的时候发现class里有这个标志就跳过这个
classpath 'cn.jiajixin.nuwa:gradle:1.2.1' 这个依赖是怎么实现的,有没有代码看看呀,jcenter上搜索不出来额。
启动后找不到GuideActivity_了,项目中使用了androidannotations开源框架
用你的demo成功了。
然后放到自己项目里面试了下,发现没生成patch文件,只生成了一个patch目录。命令行运行生成补丁的命令是成功的,但是就是没有文件出来。求解
我现在有个场景,就是在debug编译类型下,不用nuwagradle处理,在release模式下才启用,但是build.gradle文件只有一份,若集成了apply plugin: "cn.jiajixin.nuwa",那无论哪个模式下都会调用nuwagradle的处理。
在build.gradle
设置 multiDexEnabled false
Nuwa编译不通过报错app:nuwaClassBeforeDexDebug FAILED
设置multiDexEnabled true
Nuwa编译通过,但是项目运行报错
ClassNotFoundException: Didn't find class "cn.jiajixin.nuwa.Hack" on path: DexPathList
java.lang.NoClassDefFoundError: Failed resolution of: Lcn/jiajixin/nuwa/Hack;
com.activeandroid.app.Application.(Unknown Source)
com.liangrenwang.android.boss.base.AppApplication.(Unknown Source)
java.lang.reflect.Constructor.newInstance(Native Method)
java.lang.Class.newInstance(Class.java:1650)
android.app.Instrumentation.newApplication(Instrumentation.java:1003)
android.app.Instrumentation.newApplication(Instrumentation.java:988)
android.app.LoadedApk.makeApplication(LoadedApk.java:620)
android.app.ActivityThread.handleBindApplication(ActivityThread.java:5125)
android.app.ActivityThread.access$1600(ActivityThread.java:179)
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1524)
android.os.Handler.dispatchMessage(Handler.java:102)
android.os.Looper.loop(Looper.java:145)
android.app.ActivityThread.main(ActivityThread.java:5981)
java.lang.reflect.Method.invoke(Native Method)
java.lang.reflect.Method.invoke(Method.java:372)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
java.lang.ClassNotFoundException: Didn't find class "cn.jiajixin.nuwa.Hack" on path: DexPathList[[zip file "/data/app/com.liangrenwang.android.boss-1/base.apk"],nativeLibraryDirectories=[/data/app/com.liangrenwang.android.boss-1/lib/arm, /vendor/lib, /system/lib]]
dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
java.lang.ClassLoader.loadClass(ClassLoader.java:511)
java.lang.ClassLoader.loadClass(ClassLoader.java:469)
com.activeandroid.app.Application.(Unknown Source)
com.liangrenwang.android.boss.base.AppApplication.(Unknown Source)
java.lang.reflect.Constructor.newInstance(Native Method)
java.lang.Class.newInstance(Class.java:1650)
android.app.Instrumentation.newApplication(Instrumentation.java:1003)
android.app.Instrumentation.newApplication(Instrumentation.java:988)
android.app.LoadedApk.makeApplication(LoadedApk.java:620)
android.app.ActivityThread.handleBindApplication(ActivityThread.java:5125)
android.app.ActivityThread.access$1600(ActivityThread.java:179)
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1524)
android.os.Handler.dispatchMessage(Handler.java:102)
android.os.Looper.loop(Looper.java:145)
android.app.ActivityThread.main(ActivityThread.java:5981)
java.lang.reflect.Method.invoke(Native Method)
java.lang.reflect.Method.invoke(Method.java:372)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
java.lang.ClassNotFoundException: cn.jiajixin.nuwa.Hack
这个错误怎么解?是不是Nuwa初始化的代码需要做延时处理?还是其他什么办法?
求答案!Thanks
说说我在实战中遇到的问题
首先是混淆,打修复包时利用正式包的mapping,修复bug,修改了原先的类,改变的类会改变,但有些类没有改变也会因为混淆的关系产生变化(混淆会剔除一些无用的方法,打修复包时那些无用的方法可能会加上),这就造成了有些类没有修改,但也会出现在修复包中。
再次是平台兼容问题,以前一直以为可以完全兼容ART环境。如果仅仅是修复一个小bug,比如改变了一行输出。那么在Android4.0和5.0上都可以修复,但如果修复一个稍微复杂的bug,可能牵连到的类就比较多了,在4.0环境上可以修复,在5.0环境上直接引起了其它的问题,导致崩溃。
按照说明运行demo,但执行这句命令报错:
./gradlew clean nuwaQihooDebugPatch -P NuwaDir=/Users/zhangsan/Downloads/download_demo/nuwa
报的异常:
Caused by: org.gradle.api.InvalidUserDataException: $ANDROID_HOME is not defined
请问这个怎么解决?
11-19 15:45:27.404: E/AndroidRuntime(3459): FATAL EXCEPTION: main
11-19 15:45:27.404: E/AndroidRuntime(3459): java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
11-19 15:45:27.404: E/AndroidRuntime(3459): at cn.jiajixin.nuwasample.MainActivity.onCreate(MainActivity.java:15)
11-19 15:45:27.404: E/AndroidRuntime(3459): at android.app.Activity.performCreate(Activity.java:5122)
11-19 15:45:27.404: E/AndroidRuntime(3459): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1151)
11-19 15:45:27.404: E/AndroidRuntime(3459): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2322)
11-19 15:45:27.404: E/AndroidRuntime(3459): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2410)
11-19 15:45:27.404: E/AndroidRuntime(3459): at android.app.ActivityThread.access$600(ActivityThread.java:169)
11-19 15:45:27.404: E/AndroidRuntime(3459): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1380)
11-19 15:45:27.404: E/AndroidRuntime(3459): at android.os.Handler.dispatchMessage(Handler.java:107)
11-19 15:45:27.404: E/AndroidRuntime(3459): at android.os.Looper.loop(Looper.java:194)
11-19 15:45:27.404: E/AndroidRuntime(3459): at android.app.ActivityThread.main(ActivityThread.java:5463)
11-19 15:45:27.404: E/AndroidRuntime(3459): at java.lang.reflect.Method.invokeNative(Native Method)
11-19 15:45:27.404: E/AndroidRuntime(3459): at java.lang.reflect.Method.invoke(Method.java:525)
11-19 15:45:27.404: E/AndroidRuntime(3459): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:854)
11-19 15:45:27.404: E/AndroidRuntime(3459): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:621)
11-19 15:45:27.404: E/AndroidRuntime(3459): at dalvik.system.NativeStart.main(Native Method)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.