Android系统TARGET_BUILD_VARIANT由eng变为userdebug导致的编译/运行问题

一、源码编译app

mm

报错:

Warning: com.android.tvmanagerzhongjian.TvManagerinterface: can't find referenced class android.app.TvManager
Warning: com.android.tvmanagerzhongjian.TvManagerinterface: can't find referenced class android.app.TvManager
Warning: com.android.tvmanagerzhongjian.TvManagerinterface: can't find referenced class android.app.TvManager
Warning: com.android.tvmanagerzhongjian.TvManagerinterface: can't find referenced class android.app.TvManager
Warning: com.android.tvmanagerzhongjian.TvManagerinterface: can't find referenced class android.app.TvManager
Warning: com.android.tvmanagerzhongjian.TvManagerinterface: can't find referenced class android.app.TvManager
Warning: com.android.tvmanagerzhongjian.TvManagerinterface: can't find referenced class android.app.TvManager
Warning: com.android.tvmanagerzhongjian.TvManagerinterface: can't find referenced class android.app.TvManager
Note: com.google.gson.internal.UnsafeAllocator accesses a declared field 'theUnsafe' dynamically
Note: com.google.gson.internal.UnsafeAllocator accesses a method 'allocateInstance(java.lang.Class)' dynamically
      Maybe this is library method 'sun.misc.Unsafe { java.lang.Object allocateInstance(java.lang.Class); }'
Note: android.support.v4.text.ICUCompatIcs accesses a method 'getScript(java.lang.String)' dynamically
      Maybe this is program method 'android.support.v4.text.ICUCompat { java.lang.String getScript(java.lang.String); }'
      Maybe this is program method 'android.support.v4.text.ICUCompat$ICUCompatImpl { java.lang.String getScript(java.lang.String); }'
      Maybe this is program method 'android.support.v4.text.ICUCompat$ICUCompatImplBase { java.lang.String getScript(java.lang.String); }'
      Maybe this is program method 'android.support.v4.text.ICUCompat$ICUCompatImplIcs { java.lang.String getScript(java.lang.String); }'
      Maybe this is program method 'android.support.v4.text.ICUCompatIcs { java.lang.String getScript(java.lang.String); }'
      Maybe this is library method 'libcore.icu.ICU { java.lang.String getScript(java.lang.String); }'
Note: android.support.v4.text.ICUCompatIcs accesses a method 'addLikelySubtags(java.lang.String)' dynamically
      Maybe this is program method 'android.support.v4.text.ICUCompat { java.lang.String addLikelySubtags(java.lang.String); }'
      Maybe this is program method 'android.support.v4.text.ICUCompat$ICUCompatImpl { java.lang.String addLikelySubtags(java.lang.String); }'
      Maybe this is program method 'android.support.v4.text.ICUCompat$ICUCompatImplBase { java.lang.String addLikelySubtags(java.lang.String); }'
      Maybe this is program method 'android.support.v4.text.ICUCompat$ICUCompatImplIcs { java.lang.String addLikelySubtags(java.lang.String); }'
      Maybe this is program method 'android.support.v4.text.ICUCompatIcs { java.lang.String addLikelySubtags(java.lang.String); }'
      Maybe this is library method 'libcore.icu.ICU { java.lang.String addLikelySubtags(java.lang.String); }'
Note: there were 4 accesses to class members by means of introspection.
      You should consider explicitly keeping the mentioned class members
      (using '-keep' or '-keepclassmembers').
Warning: there were 8 unresolved references to classes or interfaces.
         You may need to specify additional library jars (using '-libraryjars'),
         or perhaps the '-dontskipnonpubliclibraryclasses' option.
Error: Please correct the above warnings first.

二、尝试修改

在Android.mk中加入

LOCAL_PROGUARD_FLAG_FILES := proguard.flags
proguard.flags
-ignorewarnings
直接忽略编译错误。

结果导致运行时jni报错:

java.lang.NoSuchMethodError:
单独写apk没有这个问题

双向jni调用

三、问题解决

1.输入命令

TARGET_BUILD_VARIANT=eng
2.将之前的proguard.flags去除

结果:不会出现编译错误

3.运行正常

四、分析

该问题和ProGuard工具工具有关;该工具在user和userdebug模式下自动打开。

ProGuard是一个免费的开源项目,用以压缩、优化、混淆代码,Android 源码集成了proguard,默认会在usr以及usrdebug模式下开启。

该问题原因在于:ProGuard会扫描并去除java类中没有用到的函数。native方法没有被调用时,也会被去除。

转载:Android 4.0 中由ProGuard引发的一场血案

也可以在Adnroid.mk中添加如下解决:

LOCAL_PROGUARD_ENABLED := disable
转载: Android App中包含JNI方法时慎用ProGuard


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值