Cocos 2.3.3接入穿山甲编译安卓后无法启动

  • Creator 版本:2.3.3

  • 目标平台: Android

  • 详细报错信息,包含调用堆栈:

07/15 18:16:57: Launching 'kungfu-debug' on Pixel 2 API 28.
$ adb shell am start -n "com.xinyunbooks.kungfu/org.cocos2dx.javascript.AppActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Connected to process 2850 on device 'emulator-5554'.
Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page.
I/MultiDex: VM with version 2.1.0 has multidex support
    Installing application
    VM has multidex support, MultiDex support library is disabled.
    Installing application
    VM has multidex support, MultiDex support library is disabled.
D/InitHelper: init start: false
W/yunbooks.kungf: Accessing hidden method Landroid/app/ActivityThread;->currentActivityThread()Landroid/app/ActivityThread; (light greylist, reflection)
    Accessing hidden method Landroid/app/ActivityThread;->getApplication()Landroid/app/Application; (light greylist, reflection)
D/TrackerDr: e#init: 
D/TrackerDr: i#init: 
E/i#IdentifierManager: reflect exception!
    java.lang.ClassNotFoundException: com.android.id.impl.IdProviderImpl
        at java.lang.Class.classForName(Native Method)
        at java.lang.Class.forName(Class.java:453)
        at java.lang.Class.forName(Class.java:378)
        at com.bytedance.embed_device_register.i$a.(SourceFile:201)
        at com.bytedance.embed_device_register.i$a.a(SourceFile:226)
        at com.bytedance.embed_device_register.i.(SourceFile:50)
        at com.bytedance.embed_device_register.i.b(SourceFile:42)
        at com.bytedance.embed_device_register.i.a(SourceFile:35)
        at com.bytedance.embed_device_register.g.a(SourceFile:41)
        at com.bytedance.embed_device_register.b.a(SourceFile:33)
        at com.bytedance.embedapplog.b.i.(SourceFile:67)
        at com.bytedance.embedapplog.AppLog.init(SourceFile:118)
        at com.bytedance.sdk.openadsdk.core.l.e(InitHelper.java:210)
        at com.bytedance.sdk.openadsdk.core.l.d(InitHelper.java:145)
        at com.bytedance.sdk.openadsdk.core.l.c(InitHelper.java:95)
        at com.bytedance.sdk.openadsdk.core.l.a(InitHelper.java:68)
        at com.bytedance.sdk.openadsdk.TTAdManagerFactory.getInstance(TTAdManagerFactory.java:38)
        at com.bytedance.sdk.openadsdk.TTAdSdk.a(TTAdSdk.java:60)
        at com.bytedance.sdk.openadsdk.TTAdSdk.init(TTAdSdk.java:30)
        at org.cocos2dx.javascript.TTAdManagerHolder.doInit(TTAdManagerHolder.java:32)
        at org.cocos2dx.javascript.TTAdManagerHolder.init(TTAdManagerHolder.java:26)
        at org.cocos2dx.javascript.MyApplication.onCreate(MyApplication.java:15)
        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1154)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5871)
        at android.app.ActivityThread.access$1100(ActivityThread.java:199)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1650)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "com.android.id.impl.IdProviderImpl" on path: DexPathList[[zip file "/data/app/com.xinyunbooks.kungfu-dUVH9T2rRSsYFf_ovOnlxQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.xinyunbooks.kungfu-dUVH9T2rRSsYFf_ovOnlxQ==/lib/arm, /data/app/com.xinyunbooks.kungfu-dUVH9T2rRSsYFf_ovOnlxQ==/base.apk!/lib/armeabi-v7a, /system/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at java.lang.Class.classForName(Native Method) 
        at java.lang.Class.forName(Class.java:453) 
        at java.lang.Class.forName(Class.java:378) 
        at com.bytedance.embed_device_register.i$a.(SourceFile:201) 
        at com.bytedance.embed_device_register.i$a.a(SourceFile:226) 
        at com.bytedance.embed_device_register.i.(SourceFile:50) 
        at com.bytedance.embed_device_register.i.b(SourceFile:42) 
        at com.bytedance.embed_device_register.i.a(SourceFile:35) 
        at com.bytedance.embed_device_register.g.a(SourceFile:41) 
        at com.bytedance.embed_device_register.b.a(SourceFile:33) 
        at com.bytedance.embedapplog.b.i.(SourceFile:67) 
        at com.bytedance.embedapplog.AppLog.init(SourceFile:118) 
        at com.bytedance.sdk.openadsdk.core.l.e(InitHelper.java:210) 
        at com.bytedance.sdk.openadsdk.core.l.d(InitHelper.java:145) 
        at com.bytedance.sdk.openadsdk.core.l.c(InitHelper.java:95) 
        at com.bytedance.sdk.openadsdk.core.l.a(InitHelper.java:68) 
        at com.bytedance.sdk.openadsdk.TTAdManagerFactory.getInstance(TTAdManagerFactory.java:38) 
        at com.bytedance.sdk.openadsdk.TTAdSdk.a(TTAdSdk.java:60) 
        at com.bytedance.sdk.openadsdk.TTAdSdk.init(TTAdSdk.java:30) 
        at org.cocos2dx.javascript.TTAdManagerHolder.doInit(TTAdManagerHolder.java:32) 
        at org.cocos2dx.javascript.TTAdManagerHolder.init(TTAdManagerHolder.java:26) 
        at org.cocos2dx.javascript.MyApplication.onCreate(MyApplication.java:15) 
        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1154) 
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5871) 
        at android.app.ActivityThread.access$1100(ActivityThread.java:199) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1650) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6669) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 
I/TeaLog: Inited
W/yunbooks.kungf: Accessing hidden method Landroid/content/pm/PackageParser$Package;->(Ljava/lang/String;)V (light greylist, reflection)
    Accessing hidden field Landroid/app/ActivityThread;->mHiddenApiWarningShown:Z (dark greylist, reflection)
W/yunbooks.kungf: Accessing hidden field Landroid/app/ActivityManager;->IActivityManagerSingleton:Landroid/util/Singleton; (light greylist, reflection)
    Accessing hidden field Landroid/util/Singleton;->mInstance:Ljava/lang/Object; (light greylist, reflection)
E/Downloader-DownloadComponentManager: component has init
  • 重现方式:
    我在 Cocos Creator 2.3.3 里接入穿山甲广告编译成Android原生小游戏,基本的接入方法是按照 https://blog.csdn.net/frankxixu/article/details/106920728 这个来做的。编译可以通过,但是通过Android Studio运行或者通过手机运行会在 TTAdManagerHolder.init(this); 这句中断跳出,如果删掉此句游戏能正常运行。跳出时的错误如上(这个com.android.id.imple.IdProviderImpl应该时穿山甲提供的open_ad_sdk.aar内部调用的)。

请问我改如何解决这个问题?

我是把 TTAdManagerHolder.init(this); 放到这里了。执行过程没有任何问题。

之前我基本也是安装其他的文档这么做的,把穿山甲的代码放到 AppActivity.java 里,不同的是我把 TTAdManagerHolder.init(this) 放在了 SDKWrapper.getInstantance().init(this) 下面了。
今天我安装你的顺序又试了一下,只放初始代码 TTAdManagerHolder.init(this),还是报 java.lang.ClassNotFoundException: com.android.id.impl.IdProviderImpl 错误,然后就是直接退出。但是删掉这段代码又可以正常运行(当然广告功能除外)。

我的构建环境是:

另外说明一下,现在Cocos Creator的版本我已经升级到2.4.0做的测试,出现的问题和2.3.3一样,说明和Cocos版本的关系不大。还有我安装的Java环境是OpenJDK JDK 14这个最新稳定版。

https://mp.weixin.qq.com/s/-0H36WDyDcGy4hCEL-CXmw

穿山甲的,看下这个

我遇到这个问题是那个代码混淆的那一段没加上

我按这个文档都实验过了,不一样的是

  1. android-gif-drawable-1.2.6.aar 这个我没找到,所以没有引入。但是我报的错误是初始化阶段强退,应该和这个没有关系。
  2. implementation(‘com.android.support:support-v4:24.2.0’),这个我的用的包是 28.0.0,不过我也降级测试过还是一样。我现在用的是 implementation(‘com.android.support:appcompat-v7:28.0.0’),报错信息还是一样,应该和安卓包关系不大。
  3. 另外我也怀疑和64K限制问题有关,所以我加入了 com.android.support:multidex:1.0.3 的相关代码(这个在这篇文章里没讲),但是问题依旧。
  4. 穿山甲初始化后完整的代码我也都测试过,但都是初始化阶段强退,所以和有没有后续的代码应该没有关系。

代码混淆这段我是这么加的
-keep class com.bytedance.sdk.openadsdk.** { *; } -keep public interface com.bytedance.sdk.openadsdk.downloadnew.** {*;} -keep class com.pgl.sys.ces.* {*;}
有的文档是加前两项,有的文档是加三项,这个区别不影响报错。

你在build.gradle里面指定了ndk的框架吗?这个报错没关系,这应该是在加载信通院的sdk,你没有接,所以没找到而已。

Cocos Creator里指定ndk了,不指定的话是编译不过去的。

我也没遇到过,没找到原因,但是我重新构建到一个新目录,按照文档重新接了一遍就OK了

我是说安卓的项目的build.gradle文件

build.gradle里哟吃ndk和ndkBuild的配置的。