Android studio 混淆+打包+验证是否成功

下面是关于“Android studio 混淆+打包+验证是否成功”的完整攻略。

1. 什么是混淆

混淆(Obfuscation)是一种通过变更代码名称,使得代码难以理解和阅读的技术。在Android开发中,混淆可以有效的防止反编译和代码盗用。Android Studio为我们提供了混淆功能,我们可以在打包前进行混淆操作。

2. 如何进行混淆

2.1 启用混淆

在Android Studio中启用混淆功能非常简单。在Project的build.grade文件中添加以下代码:

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

注意:该代码只能在Release版本中调用,所以你的混淆都是在Release打包的时候才会生效,Debug版本不会生效。

2.2 混淆规则配置

下面我们需要为混淆添加一些规则。混淆规则保存在proguard-rules.pro文件中,该文件位于app文件夹下。在这个文件中会列出需要保护的类、方法等。一些常见的混淆规则:

#保护Java反射类
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.internal.** { *; }

#保护不混淆的类
-keep class com.example.MainApplication { *; }
-keep class * extends android.support.design.widget.AppBarLayout { *; }

#保护Android支付
-keep class com.android.vending.billing.** {*;}
-keepclassmembers class com.android.vending.billing.** {*;}

#保护Okhttp、Retrofit等网络请求库
-keep class okhttp3.** { *; }
-keep class retrofit2.** { *; }
-keepclasseswithmembers class * {
    @retrofit2.http.* <methods>;
}

#保护AndroidX相关
-keep class androidx.appcompat.app.** {*;}

3. 打包生成APK

打包生成APK正常打包的方式,只需选择release版本即可,然后运行gradle的assembleRelease命令即可。

4. 验证混淆是否成功

4.1 查看APK文件

在打包后的app/build/outputs中的apk文件里,先解压apk包,可以看到其中的classes.dex文件(里面是被混淆的代码)。

4.2 反编译apk文件

可以使用工具将apk文件反编译,然后查看代码是否被混淆了。

示例1:

public class MainActivity extends AppCompatActivity {

    private final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    /**
     *
     */
    private void initView() {
        TextView textView = findViewById(R.id.tv_title);
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                jumpToSecondActivity();
            }
        });
    }

    /**
     * 跳转到SecondActivity
     */
    private void jumpToSecondActivity() {
        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        startActivity(intent);
    }
}

可以看到,我们在代码中添加了打印日志的语句,那么我们可以通过配置混淆规则,保护该类不被混淆:

#保护MainActivity类
-keep class com.example.myapplication.MainActivity { *; }

经过混淆后,MainActivity的class文件中的名称被全部打乱。

示例2:

添加了类似于AES加密等的处理的代码,为了保护该部分代码不被其他人破解,我们同样需要保护该代码不被混淆:

#保护加解密处理的类
-keep class com.example.myapplication.AESUtil { *; }

经过混淆后,与AES加解密相关的class文件中的名称被全部打乱。

那么我们现在可以通过查看混淆后是否能正常运行来验证混淆是否成功。如果程序没有出现错误并且运行正常,则说明混淆成功。

希望这次的回答能够帮到您,如有遗漏请谅解。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android studio 混淆+打包+验证是否成功 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • 一起来学习一下JavaScript的事件流

    关于JavaScript事件流,我为大家准备了一份完整攻略,一起来学习一下。 什么是JavaScript事件流 JavaScript事件流是指浏览器中发生事件(如鼠标点击、键盘输入等)时,事件在DOM树结构中按照特定顺序发送和处理的过程。这个过程包含三个阶段:捕获阶段、目标阶段和冒泡阶段。 捕获阶段 在事件到达目标元素之前,从根节点到目标元素之间的所有节点都…

    JavaScript 2023年6月10日
    00
  • uni-app跨端自定义指令实现按钮权限操作

    下面是关于“uni-app跨端自定义指令实现按钮权限操作”的详细攻略。 什么是 uni-app uni-app 是 DCloud 推出的一个基于 Vue.js 开发的跨平台开发框架,它支持编写一次代码,可以在多个平台上运行,包括iOS、Android、H5、小程序以及快应用等多个平台。 什么是自定义指令 自定义指令是 Vue.js 提供的一个功能,通过自定义…

    JavaScript 2023年6月10日
    00
  • javascript 中null和undefined区分和比较

    JavaScript中的null和undefined是两个特殊的值,表示值不存在或未定义。尽管它们看起来很相似,但在某些情况下有一些微小的区别。 null和undefined的差异 null是一个表示空值或无值的对象,它是一个表示未定义对象的类型,因此typeof null返回”object”。 undefined是一个原始值,表示一个未初始化或不存在的值,…

    JavaScript 2023年6月10日
    00
  • javascript firefox兼容ie的dom方法脚本

    要让javascript的DOM方法在Firefox和IE两种浏览器下兼容,需要注意以下几点: 使用标准的DOM API方法,避免使用浏览器特有的方法。 例如,不要使用IE特有的 document.all 方法,应该使用document.getElementById() 或 document.getElementsByTagName()方法来获取HTML元素…

    JavaScript 2023年6月10日
    00
  • 详细聊聊浏览器是如何看闭包的

    浏览器是如何看闭包的? 首先,让我们来回顾一下什么是闭包。闭包是在定义函数时创建的一种特殊作用域。可以访问父级作用域中定义的变量和函数,即使父级作用域已经被销毁了。这使得我们可以创建私有变量和函数,也可以用于实现某些高级特性,例如函数记忆和柯里化等。 那么,当浏览器解析Javascript代码时,是如何看待闭包的呢?以下是完整攻略: 函数作用域 Javasc…

    JavaScript 2023年6月10日
    00
  • javascript实现日历控件(年月日关闭按钮)

    实现一个完整的日历控件包括以下几个步骤: 创建HTML结构 在HTML文件中创建一个日历控件的容器,例如: <div id="calendar"> <div class="header"> <span class="prev">&lt;</span&…

    JavaScript 2023年5月27日
    00
  • Android开发中使用WebView控件浏览网页的方法详解

    Android开发中使用WebView控件浏览网页的方法详解 为什么要用WebView? 在Android应用程序中,使用WebView组件可以使我们的应用程序直接显示网页内容。实际上,WebView是最常用的界面控件之一,因为在Android平台上许多应用程序都需要能够直接调用Web内容,并能方便地浏览它。 如何使用WebView? 1. 添加权限 在An…

    JavaScript 2023年6月11日
    00
  • JS获取当前网页大小以及屏幕分辨率等

    获取当前网页大小以及屏幕分辨率等信息是前端开发中非常实用和常见的任务。下面就是JS获取当前网页大小以及屏幕分辨率等的完整攻略。 获取当前网页大小 获取网页可见宽度和高度 let clientWidth = document.documentElement.clientWidth; let clientHeight = document.documentEle…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部