Git Product home page Git Product logo

lagouandroidshare's Introduction

开心coding到80

本应用是拉勾教育《Android 工程师进阶34讲》专栏的示例应用。本示例的内容会随着专栏不断更新。

lagouandroidshare's People

Contributors

mcoyjiang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

lagouandroidshare's Issues

关于Gradle Plugin 3.6.0以上并且使用Androidx的问题

关于在gralde 3.6.0以上跑示例同时使用了androidx的同学看这里,有2个坑:

  • 1、crash错误:Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.appcompat.R$drawable"
  • 2、Logcat 看不到日志输出
为啥会有这2个问题?
  • 第一个问题原因是:gradle 3.6.0以上R类不会转为.class文件而会转成jar,因此在Transform实现中需要单独拷贝,TransformInvocation.inputs.jarInputs
  • 第二个问题是因为,androidx中,AppCompatActivity的报名变了,因此在ClassVisitor中,判断条件要更改
解决方案:

第一个问题的解决方案:在transform方法中,inputs.each block 中添加如下代码:

 transformInput.jarInputs.forEach {
            it.file.copyTo(
                info.outputProvider.getContentLocation(it.name, inputTypes, scopes, Format.JAR),
                overwrite = true
            )
        }

或者:

transformInput.jarInputs.each { JarInput jarInput ->
                File file = jarInput.file
                System.out.println("find jar input: " + file.name)
                def dest = outputProvider.getContentLocation(jarInput.name,
                        jarInput.contentTypes,
                        jarInput.scopes, Format.JAR)
                FileUtils.copyFile(file, dest)
            }

第二个问题的解决方案就很简单:在ClassVisitor类的的viditmethod方法中,将下面的代码:

 if(superClassname.equals("android/support/v7/AppCompatActivity")){
            if(name.startsWith("onCreate")){
               return new LifeCycleMethodVisitor(methodVisitor,className,name);
            }
        }

改为

 if(superClassname.equals("androidx/appcompat/app/AppCompatActivity")){
            if(name.startsWith("onCreate")){
               return new LifeCycleMethodVisitor(methodVisitor,className,name);
            }
        }

无法启动Activity

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.asmlifecycledemo/com.example.asmlifecycledemo.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "com.example.asmlifecycledemo.MainActivity" on path: DexPathList[[zip file "/data/app/com.example.asmlifecycledemo-HlJlwafushUImzYDu1LOQg==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.asmlifecycledemo-HlJlwafushUImzYDu1LOQg==/lib/arm64, /system/lib64, /vendor/lib64]]
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2914)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3100)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1804)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:192)
    at android.app.ActivityThread.main(ActivityThread.java:6907)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:828)
 Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.asmlifecycledemo.MainActivity" on path: DexPathList[[zip file "/data/app/com.example.asmlifecycledemo-HlJlwafushUImzYDu1LOQg==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.asmlifecycledemo-HlJlwafushUImzYDu1LOQg==/lib/arm64, /system/lib64, /vendor/lib64]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:125)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
    at android.app.Instrumentation.newActivity(Instrumentation.java:1180)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2904)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3100) 
    at android.app.ActivityThread.-wrap11(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1804) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:192) 
    at android.app.ActivityThread.main(ActivityThread.java:6907) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:828) 

替换成调用自己的类运行时找不到activity,调用Log下的方法没问题。

image

image
可以在编译后生成的文件中,看到预期的代码。

一下是崩溃日志,一启动就会崩溃。但是如果和课程中一样只是加入Log的方法没有这个问题。
2020-09-10 15:39:47.556 16981-16981/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.wondroid.transforminject, PID: 16981
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.wondroid.transforminject/com.wondroid.transforminject.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "com.wondroid.transforminject.MainActivity" on path: DexPathList[[zip file "/data/app/com.wondroid.transforminject-o5Gj4PwPLYWk0oRKUyulcg==/base.apk"],nativeLibraryDirectories=[/data/app/com.wondroid.transforminject-o5Gj4PwPLYWk0oRKUyulcg==/lib/arm64, /system/lib64, /system/product/lib64]]
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3228)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3443)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2040)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:7520)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.wondroid.transforminject.MainActivity" on path: DexPathList[[zip file "/data/app/com.wondroid.transforminject-o5Gj4PwPLYWk0oRKUyulcg==/base.apk"],nativeLibraryDirectories=[/data/app/com.wondroid.transforminject-o5Gj4PwPLYWk0oRKUyulcg==/lib/arm64, /system/lib64, /system/product/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:230)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:41)
at android.app.Instrumentation.newActivity(Instrumentation.java:1251)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3216)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3443) 
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2040) 
at android.os.Handler.dispatchMessage(Handler.java:107) 
at android.os.Looper.loop(Looper.java:224) 
at android.app.ActivityThread.main(ActivityThread.java:7520) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) 

androidx 无法正常启动

2020-04-12 22:03:24.204 18100-18100/com.laojizhang.compile_insert E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.laojizhang.compile_insert, PID: 18100
java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/appcompat/R$drawable;
at androidx.appcompat.widget.AppCompatDrawableManager$1.(AppCompatDrawableManager.java:63)
at androidx.appcompat.widget.AppCompatDrawableManager.preload(AppCompatDrawableManager.java:57)
at androidx.appcompat.app.AppCompatDelegateImpl.(AppCompatDelegateImpl.java:328)
at androidx.appcompat.app.AppCompatDelegateImpl.(AppCompatDelegateImpl.java:278)
at androidx.appcompat.app.AppCompatDelegate.create(AppCompatDelegate.java:221)
at androidx.appcompat.app.AppCompatActivity.getDelegate(AppCompatActivity.java:543)
at androidx.appcompat.app.AppCompatActivity.attachBaseContext(AppCompatActivity.java:98)
at android.app.Activity.attach(Activity.java:6909)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2750)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.appcompat.R$drawable" on path: DexPathList[[zip file "/data/app/com.laojizhang.compile_insert-6QI6CYdHxt2f3XyKbd9MaQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.laojizhang.compile_insert-6QI6CYdHxt2f3XyKbd9MaQ==/lib/x86, /system/lib, /vendor/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at androidx.appcompat.widget.AppCompatDrawableManager$1.(AppCompatDrawableManager.java:63) 
at androidx.appcompat.widget.AppCompatDrawableManager.preload(AppCompatDrawableManager.java:57) 
at androidx.appcompat.app.AppCompatDelegateImpl.(AppCompatDelegateImpl.java:328) 
at androidx.appcompat.app.AppCompatDelegateImpl.(AppCompatDelegateImpl.java:278) 
at androidx.appcompat.app.AppCompatDelegate.create(AppCompatDelegate.java:221) 
at androidx.appcompat.app.AppCompatActivity.getDelegate(AppCompatActivity.java:543) 
at androidx.appcompat.app.AppCompatActivity.attachBaseContext(AppCompatActivity.java:98) 
at android.app.Activity.attach(Activity.java:6909) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2750) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 
at android.app.ActivityThread.-wrap11(Unknown Source:0) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 
at android.os.Handler.dispatchMessage(Handler.java:105) 
at android.os.Looper.loop(Looper.java:164) 
at android.app.ActivityThread.main(ActivityThread.java:6541) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

build3.6版本之后的问题

java.lang.ClassNotFoundException: Didn't find class "android.support.constraint.ConstraintLayout" on path: DexPathList[[zip file "/data/app/com.example.asmlifecycledemo-2/base.apk"],nativeLibraryDirectories=[/data/app/com.example.asmlifecycledemo-2/lib/x86, /system/lib, /vendor/lib]]

ClassLoader加载错误

已经申请了读写SD权限
Suppressed: java.io.IOException: No original dex files found for dex location /storage/emulated/0/say_something_hotfix.jar

class not found

一步一坑走过来 最后死在的classNotFound, 下面是报错
2020-05-26 15:50:54.649 12581-12581/com.android.internal.policy W/System.err: java.lang.ClassNotFoundException: Didn't find class "com.android.internal.policy.ClassLoader.android.SayHotFix" on path: DexPathList[[zip file "/storage/emulated/0/say_something_hotfix.jar"],nativeLibraryDirectories=[/system/lib, /system/product/lib]]
2020-05-26 15:50:54.649 12581-12581/com.android.internal.policy W/System.err: at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
2020-05-26 15:50:54.649 12581-12581/com.android.internal.policy W/System.err: at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
2020-05-26 15:50:54.649 12581-12581/com.android.internal.policy W/System.err: at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
2020-05-26 15:50:54.649 12581-12581/com.android.internal.policy W/System.err: at com.android.internal.policy.mainActivity$1.onClick(mainActivity.java:46)
2020-05-26 15:50:54.649 12581-12581/com.android.internal.policy W/System.err: at android.view.View.performClick(View.java:7125)
2020-05-26 15:50:54.650 12581-12581/com.android.internal.policy W/System.err: at android.view.View.performClickInternal(View.java:7102)
2020-05-26 15:50:54.650 12581-12581/com.android.internal.policy W/System.err: at android.view.View.access$3500(View.java:801)
2020-05-26 15:50:54.651 12581-12581/com.android.internal.policy W/System.err: at android.view.View$PerformClick.run(View.java:27336)
2020-05-26 15:50:54.651 12581-12581/com.android.internal.policy W/System.err: at android.os.Handler.handleCallback(Handler.java:883)
2020-05-26 15:50:54.651 12581-12581/com.android.internal.policy W/System.err: at android.os.Handler.dispatchMessage(Handler.java:100)
2020-05-26 15:50:54.651 12581-12581/com.android.internal.policy W/System.err: at android.os.Looper.loop(Looper.java:214)
2020-05-26 15:50:54.652 12581-12581/com.android.internal.policy W/System.err: at android.app.ActivityThread.main(ActivityThread.java:7356)
2020-05-26 15:50:54.652 12581-12581/com.android.internal.policy W/System.err: at java.lang.reflect.Method.invoke(Native Method)
2020-05-26 15:50:54.652 12581-12581/com.android.internal.policy W/System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
2020-05-26 15:50:54.652 12581-12581/com.android.internal.policy W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
2020-05-26 15:50:54.653 12581-12581/com.android.internal.policy W/System.err: Suppressed: java.io.IOException: No original dex files found for dex location /storage/emulated/0/say_something_hotfix.jar
2020-05-26 15:50:54.653 12581-12581/com.android.internal.policy W/System.err: at dalvik.system.DexFile.openDexFileNative(Native Method)
2020-05-26 15:50:54.653 12581-12581/com.android.internal.policy W/System.err: at dalvik.system.DexFile.openDexFile(DexFile.java:365)
2020-05-26 15:50:54.653 12581-12581/com.android.internal.policy W/System.err: at dalvik.system.DexFile.(DexFile.java:107)
2020-05-26 15:50:54.653 12581-12581/com.android.internal.policy W/System.err: at dalvik.system.DexFile.(DexFile.java:80)
2020-05-26 15:50:54.653 12581-12581/com.android.internal.policy W/System.err: at dalvik.system.DexPathList.loadDexFile(DexPathList.java:444)
2020-05-26 15:50:54.653 12581-12581/com.android.internal.policy W/System.err: at dalvik.system.DexPathList.makeDexElements(DexPathList.java:403)
2020-05-26 15:50:54.653 12581-12581/com.android.internal.policy W/System.err: at dalvik.system.DexPathList.(DexPathList.java:164)
2020-05-26 15:50:54.653 12581-12581/com.android.internal.policy W/System.err: at dalvik.system.BaseDexClassLoader.(BaseDexClassLoader.java:126)
2020-05-26 15:50:54.653 12581-12581/com.android.internal.policy W/System.err: at dalvik.system.BaseDexClassLoader.(BaseDexClassLoader.java:84)
2020-05-26 15:50:54.653 12581-12581/com.android.internal.policy W/System.err: at dalvik.system.DexClassLoader.(DexClassLoader.java:55)
2020-05-26 15:50:54.653 12581-12581/com.android.internal.policy W/System.err: at com.android.internal.policy.mainActivity$1.onClick(mainActivity.java:42)
2020-05-26 15:50:54.654 12581-12581/com.android.internal.policy W/System.err: ... 11 more

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.